Как подавить ImportWarning в скрипте Python unittest


В данный момент я запускаю unittest скрипт, который успешно проходит различные указанные тесты с нытьем ImportWarning сообщение в консоли:

...../lib/python3.6/importlib/_bootstrap.py:219: ImportWarning: can't resolve package from __spec__ or __package__, falling back on __name__ and __path__
  return f(*args, **kwds)
....
----------------------------------------------------------------------
Ran 7 tests in 1.950s

OK

Скрипт запускается с этой основной функцией:

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

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

python  -W ignore:ImportWarning -m unittest testscript.py

Однако есть ли способ указать это предупреждение игнорирования в самом скрипте, чтобы мне не приходилось вызывать -W ignore:ImportWarning каждый раз, когда testscript бежать?

Заранее благодарю.

2 2

2 ответа:

Чтобы программно предотвратить появление таких предупреждений, измените код таким образом, чтобы:

import warnings
if __name__ == '__main__':
    with warnings.catch_warnings():
        warnings.simplefilter('ignore', category=ImportWarning)
        unittest.main()

Источник: https://stackoverflow.com/a/40994600/328469

У меня была та же проблема, и запуск моего unittest сценария с оператором warnings.simplefilter(), как описано Nels, не сработал для меня. Согласно этому источнику , это происходит потому, что:

[...] начиная с Python 3.2, модуль unittest был обновлен для использования фильтра по умолчанию модуля warnings при выполнении тестов, и [...] сбрасывает фильтр по умолчанию перед каждым тестом , что означает, что любое изменение, которое вы можете подумать, что вы делаете scriptwide, используя предупреждения.simplefilter ("игнорировать") на начало вашего сценария переопределяется между каждым тестом.

Этот же источник рекомендует обновить фильтр внутри каждой тестовой функции, либо непосредственно, либо с помощью элегантного декоратора. Более простым решением является определение фильтра предупреждений внутри метода unittest setUp(), который запускается непосредственно перед каждым тестом.
import unittest
class TestSomething(unittest.TestCase):
    def setUp(self):
        warnings.simplefilter('ignore', category=ImportWarning)
        # Other initialization stuff here

    def test_a(self):
        # Test assertion here.

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