Тимчасово відключити тести окремих блоків Python


128

Як можна тимчасово відключити тести окремих одиниць при використанні unittestмодуля в Python?

Відповіді:


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
Акіфа

7
Я використовую Python 3.6.1 і @unittest.skipпрацює також чудово.
Піт

2
@Pete, в Python 3.4.0, @unittest.skipне працює.
життєвий баланс

Як не допустити пропускання занять у дітей?
reubenjohn

Анотація застосовуватиметься лише до одного методу тестування. Чи маєте ви намір мати батьківський клас із методами тестування, і лише в деяких дочірніх класах метод вимкнено? Я думаю, що це можливо, хоча вам може знадобитися правильно розробити класи батьків / дітей. Чи можете ви пояснити сценарій, який ви намагаєтесь вирішити на прикладі іграшки?
йоні

26

Ви можете використовувати декоратори, щоб вимкнути тест, який може завершити функцію та запобігти тестуванні тесту googletest або python unit.

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

11

Остання версія (2.7 - не випущена) підтримує тестові пропуски / відключення так . Ви можете просто отримати цей модуль і використовувати його у наявній установці Python. Це, мабуть, спрацює.

До цього я використовував перейменувати тести я хотів обезателен xtest_testnameз test_testname.


Ось швидкий сценарій 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 так ... :)
Noufal Ibrahim

Я також користувач Emacs, ви зробили макрос?
coelhudo

Ні. Я просто нехай вони провалюються, але це не так складно. Хоча я оновив відповідь швидким запитом.
Нуфал Ібрагім

Ця прийнята відповідь - це не відповідь, а лише посилання. Справжня, поточна відповідь теж не є голосовою. Звичайно, це 4 роки. Безкоштовний елісп просто обдумує.
jwd630

10

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


Я не знаю, хто це зробив. Але я читав документацію, і там написано, що SkipTest - виняток. Так чи інакше, це відрізняється від unittest.skip в тому сенсі, що пропуск ніколи не виконує тест (робить його вимкненим), тоді як мета SkipTest повинна бути підвищена, якщо щось не очікувалося, коли тест виконується. Маю рацію? Цікаво жорстке.
coelhudo

unittest.skip(без причини) дає мені помилку в Python 2, але не в Python 3.
Акіф

5

Я просто перейменую метод тестового випадку з підкресленням: test_myfunc стає _test_myfunc.



1

Орієнтуючись на "тимчасово відключену" частину питання, найкраща відповідь дещо залежить від випадку використання. Випадок використання, який мене привів сюди, - це те, що я роблю тестові розробки функції. У цьому процесі я послідовно пишу тести і часто використовую точки перерви у функції для налагодження. Якщо я просто запускаю всі тести кожного разу, коли запускаю тестовий бігун, я зупиняюсь на точках перерви для тестів, які вже працюють. Додавання "пропустити" або змінити ім'я тесту чи щось подібне - це не те, що я хочу, тому що коли я закінчую писати функцію, я хочу, щоб усі тести запускалися. Якби я використав "пропустити", я повинен був би повернутися назад і "unskip".

У моєму випадку використання рішення лежить у тестовому запуску, а не в тестовому коді. Я використовую pytest . За допомогою pytest легко вказати один тест з командного рядка:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(замініть літери на ваші значення).

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.