Запускать тесты носа с предупреждениями как ошибки? - PullRequest
16 голосов
/ 10 ноября 2009

Когда вы запускаете 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.

Спасибо!

Изменить: В идеале мне бы хотелось, чтобы параметр командной строки для проверки носа выдавал warnings.simplefilter('error') перед каждым тестом (а затем очищал его).

Любое решение, которое включает использование модуля warnings в тестовом коде, похоже, опровергает эту точку зрения. Я не хочу вручную редактировать каждый тестовый модуль для преобразования предупреждений в ошибки. Кроме того, я не хочу, чтобы автор каждого тестового модуля мог забывать «включать» предупреждения об ошибках.

Ответы [ 3 ]

10 голосов
/ 08 января 2014

nosetests - небольшой скрипт на Python. Откройте его в редакторе и добавьте -W error в конце первой строки. Это говорит интерпретатору Python преобразовывать предупреждения в исключения.

Еще проще использовать переменную окружения Python для вставки флага «обрабатывать предупреждения как ошибки»:

PYTHONWARNINGS=error nosetests test/test_*.py --pdb
4 голосов
/ 20 октября 2015

Ответ @khinsen очень помогает, но останавливает выполнение тестов носа, если он выдает следующее предупреждение во время обнаружения теста (которое в противном случае невидимо для пользователя): «ImportWarning: Не импортировать каталог« XXX »: отсутствует __init__.py

Кроме того, предупреждения, возникающие при импорте модуля (в отличие от предупреждений, возникающих во время теста), не должны рассматриваться как ошибки.

Я последовал совету @ dbw при написании плагина, который можно найти на github: https://github.com/Bernhard10/WarnAsError

Плагин для носа WarnAsError

Рядом с функциями configure и options плагин реализует prepareTestRunner, где он заменяет TestRunner по умолчанию классом с другим методом выполнения:

def prepareTestRunner(self, runner):
    return WaETestRunner(runner)

Этот класс хранит исходный TestRunner, а его run -Метод вызывает исходный метод run 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)
0 голосов
/ 10 ноября 2009

Я не думаю, что нос может напрямую управлять этим: модуль предупреждений не вызывает исключение при выдаче предупреждения. Модуль warnings дает вам контроль над тем, какие предупреждения следует выдавать как исключения.

...