Запускать nosetests с предупреждениями как ошибки?
При запуске nosetests
из командной строки, как вы указываете, что предупреждения без игнорирования следует рассматривать как ошибки?
По умолчанию предупреждения печатаются, но не считаются сбоями:
[snip]/service/accounts/database.py:151: SADeprecationWarning: Use session.add()
self.session.save(state)
[snip]/service/accounts/database.py:97: SADeprecationWarning: Use session.add()
self.session.save(user)
............
----------------------------------------------------------------------
Ran 12 tests in 0.085s
OK
Поскольку мы не хотим, чтобы наш код генерировал предупреждения, я не хочу, чтобы эта ситуация была OK
.
Спасибо!
Edit:
В идеале, что мне нужно, это опция командной строки nosetests, которая выдает warnings.simplefilter('error')
перед каждым тестом (и затем очищает его).
Любое решение, которое предполагает использование модуля warnings
в тестовом коде, похоже, побеждает точку. Я не хочу вручную редактировать каждый тестовый модуль, чтобы преобразовать предупреждения в ошибки. Кроме того, я не хочу, чтобы автор каждого тестового модуля мог забыть "включить" предупреждения.
Ответы
Ответ 1
nosetests
- небольшой Python script. Откройте его с помощью редактора и добавьте -W error
в конце первой строки. Это говорит интерпретатору Python для преобразования предупреждений в исключения.
Еще проще использовать переменную среды Python, чтобы ввести флаг "рассматривать предупреждения как ошибки":
PYTHONWARNINGS=error nosetests test/test_*.py --pdb
Ответ 2
Ответ от @khinsen очень помогает, но делает остановку выполнения носететов, если при обнаружении теста он вызывает следующее предупреждение (которое в противном случае не видно пользователю): "ImportWarning: не импортировать каталог" XXX ": отсутствует __init__.py
Кроме того, предупреждения, возникающие при импорте модуля (в отличие от предупреждений, поднятых во время теста), не должны рассматриваться как ошибки.
Я последовал совету @dbw в написании плагина, который можно найти в github: https://github.com/Bernhard10/WarnAsError
Носовой плагин WarnAsError
Рядом с функциями configure
и options
плагин реализует prepareTestRunner
, где он заменяет тестовый класс по умолчанию классом, который имеет другой метод запуска:
def prepareTestRunner(self, runner):
return WaETestRunner(runner)
Этот класс хранит оригинальный TestRunner, а его run
-Method вызывает исходный метод запуска TestRunner с другим warnings.simplefilter
.
class WaETestRunner(object):
def __init__(self, runner):
self.runner=runner
def run(self, test):
with warnings.catch_warnings():
warnings.simplefilter("error")
return self.runner.run(test)
Ответ 3
Я не думаю, что нос может прямо контролировать это: модуль предупреждений не вызывает исключение, когда выдается предупреждение. Модуль warnings
дает вам контроль над тем, какие предупреждения следует вызывать как исключения.