Как остановить все тесты изнутри теста или установки с помощью unittest?
========================================================================

Я расширяю Python 2.7`unittest` рамки, чтобы сделать некоторые функциональные испытания. Одна из вещей, которую я хотел бы сделать, - остановить все тесты внутри теста и внутри`setUpClass()` метод. Иногда, если тест завершается неудачно, программа настолько ломается, что больше не имеет смысла продолжать тестирование, поэтому я хочу остановить выполнение тестов.

Я заметил, что TestResult имеет`shouldStop` атрибут и`stop()` метод, но я не уверен, как получить доступ к этому внутри теста.

У кого-нибудь есть какие-либо идеи? Есть ли способ лучше?

Вот еще один ответ, который я придумал через некоторое время:

Сначала я добавил новое исключение:

потом я добавил новый`assert` моему ребенку тестовый класс:

и в прошлом я преодолел`run` функция, чтобы включить это прямо под`testMethod()` вызов:

Мне это нравится больше, так как любой тест теперь имеет возможность остановить все тесты, и нет никакого специфичного для cpython кода.



Я посмотрел на`TestCase` класс и решил подкласс его. Класс просто переопределяет`run()`, Я скопировал метод и, начиная со строки 318 в исходном классе, добавил:

Там есть некоторый специфичный для CPython код, чтобы сказать, может ли метод теста принимать другой параметр, но, поскольку я использую CPython везде, это не проблема для меня.



Несмотря на то, что вы не получите обычные отчеты о тестах, выполненных до сих пор, очень простой способ остановить тестовый запуск изнутри`TestCase` метод просто поднять`KeyboardInterrupt` внутри метода.

Вы можете видеть, как только`KeyboardInterrupt` разрешено пузыриться внутри`unittest`тестовый бегун, посмотрев на код CPython[Вот](https://github.com/python/cpython/blob/60a6632a3d2b2dde1c01850f0aa36a22c8dec8dd/Lib/unittest/case.py#L60) внутри`testPartExecutor()`.



В настоящее время вы можете остановить тесты только на уровне набора. Когда вы находитесь в`TestCase`,`stop()` метод для`TestResult` не используется при переборе тестов.

Несколько связанный с вашим вопросом, если вы используете Python 2.7, вы можете использовать`-f/--failfast` пометка при вызове вашего теста с`python -m unittest`, Это остановит тест при первом сбое.

Увидеть[25.3.2.1. параметры командной строки failfast, catch и buffer](https://docs.python.org/library/unittest.html#failfast-catch-and-buffer-command-line-options)

Вы также можете рассмотреть возможность использования[Нос](http://somethingaboutorange.com/mrl/projects/nose/0.11.2/) запустить ваши тесты и использовать`-x, --stop` [флаг](http://somethingaboutorange.com/mrl/projects/nose/0.11.2/usage.html#cmdoption-x) чтобы остановить тест рано.



В тестовом цикле`unittest.TestSuite`, Eсть`break` состояние на старте:

Поэтому я использую пользовательский набор тестов, как это:

с пользовательским классом результатов теста, как это:

и мои тестовые классы такие:

При определенных условиях я затем отменяю набор тестов; например, тестовый набор начинается с входа в систему, и если это не удается, мне не нужно пробовать остальное:

Затем я использую набор тестов следующим образом:

Я не уверен, есть ли лучший способ сделать это, но он ведет себя правильно для моих тестов.



Если вам интересно, вот простой пример того, как вы могли бы самостоятельно принять решение о чистом выходе из набора тестов с[py.test](http://pytest.org):

и если вы запустите это, вы получите:

Вы также можете положить`py.test.exit()` вызов внутри теста или в плагин для конкретного проекта.

Примечание:`py.test` изначально поддерживает`py.test --maxfail=NUM` осуществить остановку после сбоев NUM.

Sidenote2:`py.test` имеет ограниченную поддержку для запуска тестов в традиционном`unittest.TestCase` стиль.



Использование: