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

Запускать 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 в тестовом коде, похоже, побеждает точку. Я не хочу вручную редактировать каждый тестовый модуль, чтобы преобразовать предупреждения в ошибки. Кроме того, я не хочу, чтобы автор каждого тестового модуля мог забыть "включить" предупреждения.

4b9b3361

Ответ 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 дает вам контроль над тем, какие предупреждения следует вызывать как исключения.