Тимчасово відключити тести окремих блоків 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.