Как можно временно отключить отдельные модульные тесты при использовании модуля unittest
в Python?
Временно отключите отдельные модульные тесты Python
Ответы (7)
Отдельные методы тестирования или классы можно отключить с помощью декоратора unittest.skip
. .
@unittest.skip("reason for skipping")
def test_foo():
print('This is foo test case.')
@unittest.skip # no reason needed
def test_bar():
print('This is bar test case.')
Другие варианты см. в документации по пропуску тестов и ожидаемые сбои.
@unittest.SkipTest
работает, а не @unittest.skip
- person lifebalance; 13.05.2017
@unittest.skip
тоже работает нормально.
- person Pete; 13.06.2017
@unittest.skip
не работает.
- person lifebalance; 09.07.2017
@unittest.skip
не работает: в настоящее время не поддерживается функция использования skip
без вызова и указания причины, это в настоящее время приведет к тому, что тест будет помечен как успешный без запуска. В настоящее время это обсуждается на странице bugs.python.org/issue34596.
- person Zachary Ware; 08.09.2018
Вы можете использовать декораторы, чтобы отключить тест, который может обернуть функцию, и запретить модульному тесту googletest или Python запускать тестовый пример.
def disabled(f):
def _decorator():
print f.__name__ + ' has been disabled'
return _decorator
@disabled
def testFoo():
'''Foo test case'''
print 'this is foo test case'
testFoo()
Выход:
testFoo has been disabled
Достаточно просто разместить декоратор @unittest.SkipTest
над тестом.
unittest.skip
(без причины) выдает ошибку в Python 2, но не в Python 3.
- person Akif; 27.02.2017
До этого я переименовывал тесты, которые хотел пропустить, на xtest_testname
с test_testname
.
Вот быстрый скрипт Elisp для этого. Мой Elisp немного заржавел, поэтому заранее извиняюсь за возможные проблемы. Непроверенный.
(defun disable_enable_test ()
(interactive "")
(save-excursion
(beginning-of-line)
(search-forward "def")
(forward-char)
(if (looking-at "disable_")
(zap-to-char 1 ?_)
(insert "disable_"))))
Я просто переименовываю метод теста с подчеркиванием: test_myfunc становится _test_myfunc.
В документах для 2.1 не указан метод игнорирования или пропуска.
Однако обычно я блокирую комментарии, когда это необходимо.
Сосредоточившись на «временно отключенной» части вопроса, лучший ответ в некоторой степени зависит от варианта использования. Случай использования, который привел меня сюда, заключается в том, что я занимаюсь разработкой функции через тестирование. В этом процессе я последовательно пишу тесты и часто использую точки останова в функции для отладки. Если я просто запускаю все тесты каждый раз, когда я запускаю средство запуска тестов, я в конечном итоге останавливаюсь в точках останова для тестов, которые уже работают. Добавление «пропустить» или изменение имени теста или что-то в этом роде - это не то, что я хочу, потому что, когда я закончу писать функцию, я хочу, чтобы все тесты выполнялись. Если бы я использовал «пропустить», мне пришлось бы вернуться и «отменить пропуск».
В моем случае решение лежит в средстве запуска тестов, а не в тестовом коде. Я использую pytest. С pytest легко указать один тест из командной строки:
PYTHON_FILENAME.TEST_CLASS.TEST_NAME
(замените заглавные буквы своими значениями).
Я понимаю, что этот вопрос был для python-unitest. Я не использовал это в течение длительного времени. Я не удивлюсь, если у него будет что-то похожее на pytest. Если нет, вы можете легко переключиться на pytest. Вам не нужно изменять свой код. Просто установите его и измените команду запуска теста.
Кроме того, я использую PyCharm Pro. На странице, на которой показан мой тестовый код, рядом с определением каждого теста есть небольшой значок. Я могу щелкнуть этот значок и запустить этот тест по отдельности.
-k
(начиная с версии 3.7).
- person Peter Mortensen; 11.05.2021