Временно отключите отдельные модульные тесты Python

Как можно временно отключить отдельные модульные тесты при использовании модуля unittest в Python?


person coelhudo    schedule 14.01.2010    source источник


Ответы (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.')

Другие варианты см. в документации по пропуску тестов и ожидаемые сбои.

person yoni    schedule 22.04.2013
comment
В Python 3 ответ Акифа ниже @unittest.SkipTest работает, а не @unittest.skip - person lifebalance; 13.05.2017
comment
Я использую Python 3.6.1, и @unittest.skip тоже работает нормально. - person Pete; 13.06.2017
comment
@ Пит, в Python 3.4.0 @unittest.skip не работает. - person lifebalance; 09.07.2017
comment
Как предотвратить пропуск дочерних классов? - person reubenjohn; 13.03.2018
comment
Аннотация будет применяться только к одному методу тестирования. Вы собираетесь иметь родительский класс с тестовыми методами, и только некоторые дочерние классы отключили этот метод? Я предполагаю, что это возможно, хотя вам может потребоваться соответствующим образом спроектировать родительские/дочерние классы. Можете ли вы объяснить сценарий, который вы пытаетесь решить, на игрушечном примере? - person yoni; 14.03.2018
comment
Для тех, кто говорит, что голый @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
person GTM    schedule 14.01.2010
comment
Что такое гуглтест? GoogleTest — это среда тестирования C++. вкл. тег переполнения стека. - person Peter Mortensen; 10.05.2021

Достаточно просто разместить декоратор @unittest.SkipTest над тестом.

person Akif    schedule 24.02.2017
comment
Я не знаю, кто это сделал. Но я читал документацию, и там написано, что SkipTest является исключением. В любом случае, он отличается от unittest.skip в том смысле, что skip никогда не выполняет тест (что делает его отключенным), в то время как цель SkipTest должна подниматься, если во время выполнения теста происходит что-то неожиданное. Я прав? Интересный жесткий. - person coelhudo; 24.02.2017
comment
unittest.skip (без причины) выдает ошибку в Python 2, но не в Python 3. - person Akif; 27.02.2017

Последняя версия (2.7 — невыпущенная) поддерживает пропуск/отключение тестов вот так< /а>. Вы можете просто получить этот модуль и использовать его в существующей установке Python. Вероятно, это сработает.

До этого я переименовывал тесты, которые хотел пропустить, на 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_"))))
person Noufal Ibrahim    schedule 14.01.2010
comment
+1, но во всем проекте, над которым я работаю, все используют python v2.6.2, и я не думаю, что это изменится :/, но это решение, спасибо - person coelhudo; 14.01.2010
comment
Вы можете немного настроить свой редактор, чтобы дать вам макрос для включения/отключения тестового примера, но я говорю как пользователь Emacs, поэтому... :) - person Noufal Ibrahim; 14.01.2010
comment
Я тоже пользователь Emacs, ты сделал макрос? - person coelhudo; 14.01.2010
comment
Неа. Я просто позволил им потерпеть неудачу, но это не так сложно. Однако я обновил ответ на скорую руку. - person Noufal Ibrahim; 14.01.2010
comment
Этот принятый ответ не является ответом, а просто ссылкой. Настоящий, текущий ответ также не получил наибольшее количество голосов. Правда, ему 4 года. Беспричинный элисп просто затемняет. - person jwd630; 04.11.2014

Я просто переименовываю метод теста с подчеркиванием: test_myfunc становится _test_myfunc.

person MattK    schedule 14.01.2010

В документах для 2.1 не указан метод игнорирования или пропуска.

Однако обычно я блокирую комментарии, когда это необходимо.

person Finglas    schedule 14.01.2010

Сосредоточившись на «временно отключенной» части вопроса, лучший ответ в некоторой степени зависит от варианта использования. Случай использования, который привел меня сюда, заключается в том, что я занимаюсь разработкой функции через тестирование. В этом процессе я последовательно пишу тесты и часто использую точки останова в функции для отладки. Если я просто запускаю все тесты каждый раз, когда я запускаю средство запуска тестов, я в конечном итоге останавливаюсь в точках останова для тестов, которые уже работают. Добавление «пропустить» или изменение имени теста или что-то в этом роде - это не то, что я хочу, потому что, когда я закончу писать функцию, я хочу, чтобы все тесты выполнялись. Если бы я использовал «пропустить», мне пришлось бы вернуться и «отменить пропуск».

В моем случае решение лежит в средстве запуска тестов, а не в тестовом коде. Я использую pytest. С pytest легко указать один тест из командной строки:

PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(замените заглавные буквы своими значениями).

Я понимаю, что этот вопрос был для python-unitest. Я не использовал это в течение длительного времени. Я не удивлюсь, если у него будет что-то похожее на pytest. Если нет, вы можете легко переключиться на pytest. Вам не нужно изменять свой код. Просто установите его и измените команду запуска теста.

Кроме того, я использую PyCharm Pro. На странице, на которой показан мой тестовый код, рядом с определением каждого теста есть небольшой значок. Я могу щелкнуть этот значок и запустить этот тест по отдельности.

person Chuck    schedule 06.02.2019
comment
Это правильная идея, но вариант использования, вероятно, исключает один (или несколько) тестовый пример, а не запускает только один. - person Peter Mortensen; 10.05.2021
comment
Или это только для Pytest? - person Peter Mortensen; 11.05.2021
comment
unittest на самом деле имеет параметр -k (начиная с версии 3.7). - person Peter Mortensen; 11.05.2021
comment
Но он может не поддерживать модификаторы not и or(?). - person Peter Mortensen; 11.05.2021