Note: This site is currently "Under construction". I'm migrating to a new version of my site building software. Lots of things are in a state of disrepair as a result (for example, footnote links aren't working). It's all part of the process of building in public. Most things should still be readable though.

Suppress Python MySQL Connector DeprecationWarning and ResourceWarnings In Unittests

I ran into warnings using mysql.connector. The looked liked this:

Code

/Users/user/workshop/venv/lib/python3.9/site-packages/mysql/connector/connection_cext.py:513: DeprecationWarning: PY_SSIZE_T_CLEAN will be required for '#' formats
  self._cmysql.query(query,
../usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py:353: ResourceWarning: unclosed <ssl.SSLSocket fd=8, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('###.###.###.###', 676767), raddr=('###.###.###.###', 443)>
  obj, end = self.scan_once(s, idx)
ResourceWarning: Enable tracemalloc to get the object allocation traceback

And sometimes:

Code

sys:1: ResourceWarning: unclosed <ssl.SSLSocket fd=8, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('###.###.###.###', 676767), raddr=('###.###.###.###', 443)>

The fix was to import the warnings module, create a `ignore_warnings` function and add it as a decorator. Like this:

Code

#!/usr/bin/env python3

import keyring
import mysql.connector
import unittest
import warnings 

from thing_to_test import ThingToTest 

def ignore_warnings(test_method):
    def test_run(self, *args, **kwargs):
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')
            test_method(self, *args, **kwargs)
    return test_run


class GenrePopulatorTest(unittest.TestCase):

    @ignore_warnings
    def setUp(self):
 
        global cnx
        cnx = mysql.connector.connect(
            database=keyring.get_password('mysql-database', 'local_username'),
            host=keyring.get_password('mysql-host', 'local_username'),
            user=keyring.get_password('mysql-username', 'local_username'),
            password=keyring.get_password('mysql-password', 'local_username')
        )

        
    def tearDown(self):
        cnx.close()

    @ignore_warnings
    def test_something_here(self):
        expected = 3
        query = ("SELECT COUNT(*) FROM table")
        cursor = cnx.cursor()
        cursor.execute(query)
        result = cursor.fetchone()[0]
        self.assertEqual(expected, result)

if __name__ == '__main__':
    unittest.main(failfast=True)

With that in place, the warnings were suppressed and I'd get just the results of the unittests.

Here's the post that gave me the solution.