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

128

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

coelhudo
источник

Ответы:

230

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

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

йони
источник
9
В Python 3 приведенный ниже ответ Акифа @unittest.SkipTestработает, а не@unittest.skip
lifebalance
7
Я использую Python 3.6.1 и @unittest.skipтоже отлично работает.
Pete
2
@Pete в Python 3.4.0 @unittest.skipне работает.
lifebalance 09
Как предотвратить пропуск дочерних классов?
reubenjohn
Аннотация будет применяться только к одному методу тестирования. Вы намереваетесь иметь родительский класс с тестовыми методами, и только у некоторых дочерних классов этот метод отключен? Я полагаю, что это возможно, хотя вам может потребоваться соответствующим образом спроектировать родительские / дочерние классы. Можете ли вы описать сценарий, который вы пытаетесь решить, на игрушечном примере?
yoni
26

Вы можете использовать декораторы, чтобы отключить тест, который может обернуть функцию и предотвратить запуск тестового примера с помощью модульного теста 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
GTM
источник
11

Последняя версия (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_"))))
Нуфаль Ибрагим
источник
+1, но во всем проекте, над которым я работаю, все используют python v2.6.2, и я не думаю, что это изменится: /, но это решение, спасибо
coelhudo
Вы можете немного подправить свой редактор, чтобы дать вам макрос для включения / отключения
тестового набора,
Я тоже пользователь Emacs, вы сделали макрос?
coelhudo
Нет. Я просто позволяю им потерпеть неудачу, но это не так сложно. Я быстро обновил ответ.
Нуфал Ибрагим
Этот принятый ответ - это не ответ, а просто ссылка. Настоящий, текущий ответ также не является самым популярным. Конечно, ему 4 года. Беспричинный elisp просто запутывает.
jwd630 03
10

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

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

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

MattK
источник
3

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

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

Finglas
источник
1

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

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

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

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

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

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

цыпленок
источник