Python 3.2 introduced ResourceWarning
for unclosed system resources (network sockets, files):
Though the code runs clean in production, I am getting a lot of following warnings when running unit tests due to use of third party libraries where the warning occurs. I could fix the library, but on the other hand it were much simpler just to ignore it during the test run.
block_io-python/block_io/__init__.py:182: ResourceWarning: unclosed <ssl.SSLSocket fd=11, family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=6, laddr=('x', 58395), raddr=('x, 443)>
What is the way to disable these warnings? I tried the following but no effect:
warnings.filterwarnings("ignore", category=ResourceWarning)
(Run during unit test import time).
Source code: Lib/warnings.py. Warning messages are typically issued in situations where it is useful to alert the user of some condition in a program, where that condition (normally) doesn't warrant raising an exception and terminating the program.
Warning messages are displayed by warn() function defined in 'warning' module of Python's standard library. Warning is actually a subclass of Exception in built-in class hierarchy.
I found the culprit. You say you set your filter during import time. However, since Python 3.2 the unittest module has been updated to set the warning filter to default. See Section 29.5.5. Basically, unittest
overwrites your warning filter preferences after it has finished importing your modules.
For example.
my_tests.py
import socket
import unittest
import warnings
warnings.simplefilter("ignore", ResourceWarning)
def abusesocket():
s = socket.socket()
s.connect(("www.google.com", 80))
class Test(unittest.TestCase):
def test1(self):
print("test1")
abusesocket()
print("module import warning filter nixed")
def test2(self):
print("test2")
warnings.simplefilter("ignore", ResourceWarning)
abusesocket()
print("higher warning filter okay")
Gives the following output
$ python3 -m unittest my_tests.py
test1
/home/user/my_tests.py:15: ResourceWarning: unclosed <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=0, laddr=('x.x.x.x', 52332), raddr=('31.55.166.217', 80)>
abusesocket()
module import warning filter nixed
.test2
higher warning filter okay
.
----------------------------------------------------------------------
Ran 2 tests in 0.347s
OK
unittest
appears to reset the warning filter after each test. So you'll have clear the filter at the start of each test. Probably best to use a decorator to wrap your test functions.
def ignore_warnings(test_func):
def do_test(self, *args, **kwargs):
with warnings.catch_warnings():
warnings.simplefilter("ignore", ResourceWarning)
test_func(self, *args, **kwargs)
return do_test
class Test(unittest.TestCase):
@ignore_warnings
def test1(self):
abusesocket()
unittest.main(warnings='ignore')
This alternative worked for me:
def setUp(self):
if not sys.warnoptions:
import warnings
warnings.simplefilter("ignore")
See: Standard Library docs - Overriding the default filter
I used this to disable only the ResourceWarning
warning before a test and re-enable it afterwards.
import unittest
import warnings
class MyTestCase(unittest.TestCase):
def setUp(self):
warnings.simplefilter("ignore", ResourceWarning)
def tearDown(self):
warnings.simplefilter("default", ResourceWarning)
Also see: Different options besides "default" and "ignore"
Setting it once for all methods at the class level seems more efficient than repeatedly as an instance-level setUp():
@classmethod
def setUpClass(cls):
warnings.simplefilter("ignore")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With