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
Solution
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()
warnings.showwarning. The function seems to bypass the warning filter. - Duneswarnings.filterwarnings('default', category=ResourceWarning), which would override yours by being placed in front of it? And if @Dunes theory is right, you could overwritewarnings.showwarningwithin a Context Managerwith warnings.catch_warnings():- greschd__warningregistry__of your module or that you are using python compiled in debug mode. Resource warnings are only shown by default when python is compiled in debug mode. Perhaps warnings cannot be hidden in debug mode... - Dunes