можно настроить warn.filterwarnings на локальное действие при тестировании с помощью nosetests

#python #nose #skbio

#python #nose #skbio

Вопрос:

У меня возникли некоторые проблемы с фильтрацией предупреждений в тестах python при использовании nosetests . Я бы хотел, чтобы мой вызов warn.filterwarnings был локальным только для одного файла, но вместо этого, если какой-либо из файлов, которые я тестирую с nosetests помощью вызовов warn.filterwarnings , предупреждения фильтруются во всех тестах. Например (из базы кода scikit-bio), skbio/math/diversity/beta/tests/test_base.py не имеет вызова warn.filterwarnings , поэтому, как и ожидалось, если во время тестов генерируется предупреждение, оно выводится на экран:

 $ nosetests skbio/math/diversity/beta/tests/test_base.py
../Users/caporaso/Dropbox/code/skbio/skbio/math/diversity/beta/base.py:89: UserWarning: pw_distances_from_table is deprecated. In the future (tentatively scikit-bio 0.2.0), pw_distance will take a biom.table.Table object and this function will be removed. You will need to update your code to call pw_distances at that time.
  warn("pw_distances_from_table is deprecated. In the future (tentatively "
...
----------------------------------------------------------------------
Ran 5 tests in 0.017s

OK
  

Однако в skbio/core/alignment/tests/test_pairwise.py , есть вызов warn.filterwarnings . Если я запускаю эти тесты раньше skbio/math/diversity/beta/tests/test_base.py , приведенное выше предупреждение не выводится:

 $ nosetests skbio/core/alignment/tests/test_pairwise.py skbio/math/diversity/beta/tests/test_base.py
...................
----------------------------------------------------------------------
Ran 19 tests in 0.056s

OK
  

Я бы хотел, чтобы предупреждение skbio/math/diversity/beta/tests/test_base.py было напечатано, даже если other warn.filterwarnings вызывается из других тестовых файлов. На практике я в конечном итоге отфильтрую и это, но я хочу знать, есть ли другие предупреждения, которые не были обнаружены тестами в другом месте в моем наборе тестов.

Ответ №1:

В идеале вы хотите использовать менеджеры conext для временного их подавления.

Комментарии:

1. Спасибо, это сработало. В частности, я удалил все вызовы warn.filterwarnings из моего набора тестов, а затем перенес вызовы, которые вызывали предупреждения, как предложено в отправленной вами ссылке.