Подтвердить что ты не робот

Отключение Python 3.2 ResourceWarning

Python 3.2 представил ResourceWarning для незакрытых системных ресурсов (сетевых сокетов, файлов):

Несмотря на то, что код работает чистым в процессе производства, я получаю много предупреждений при запуске модульных тестов из-за использования сторонних библиотек, где возникает предупреждение. Я мог бы исправить библиотеку, но, с другой стороны, было намного проще просто игнорировать ее во время тестового прогона.

 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)>

Каким образом можно отключить эти предупреждения? Я пробовал следующее, но без эффекта:

 warnings.filterwarnings("ignore", category=ResourceWarning)

(Запустите во время импорта unit test).

4b9b3361

Ответ 1

Я нашел преступника. Вы говорите, что вы устанавливаете свой фильтр во время импорта. Однако, начиная с Python 3.2, модуль unittest был обновлен, чтобы установить фильтр предупреждения по умолчанию. См. Раздел 29.5.5. В принципе, unittest перезаписывает настройки фильтра предупреждений после того, как он завершил импорт ваших модулей.

Например.

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")

Дает следующий выход

$ 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 появляется после reset фильтр предупреждения после каждого теста. Таким образом, вы очистите фильтр в начале каждого теста. Возможно, лучше всего использовать декоратор, чтобы обернуть ваши тестовые функции.

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()

Ответ 2

unittest.main(предупреждения = 'игнорировать')