Tymczasowo wyłącz poszczególne testy jednostkowe języka Python

128

W jaki sposób można tymczasowo wyłączyć poszczególne testy jednostkowe podczas korzystania z unittestmodułu w Pythonie?

coelhudo
źródło

Odpowiedzi:

230

Poszczególne metody lub klasy testowe można wyłączyć za pomocą unittest.skipdekoratora.

@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.')

Aby zapoznać się z innymi opcjami, zapoznaj się z dokumentacją Pomijanie testów i oczekiwane awarie .

yoni
źródło
9
W Pythonie 3 odpowiedź Akifa poniżej @unittest.SkipTestdziała, a nie@unittest.skip
lifebalance
7
Używam Pythona 3.6.1 i @unittest.skipdziała również dobrze.
Pete
2
@Pete w Pythonie 3.4.0 @unittest.skipnie działa.
saldo ratunkowe
Jak zapobiec pomijaniu zajęć dla dzieci?
reubenjohn
Adnotacja byłaby stosowana tylko do jednej metody badawczej. Czy zamierzasz mieć klasę nadrzędną z metodami testowymi, a tylko niektóre klasy potomne mają tę metodę wyłączoną? Wyobrażam sobie, że jest to możliwe, chociaż może być konieczne odpowiednie zaprojektowanie klas rodziców / dzieci. Czy możesz przeliterować scenariusz, który próbujesz rozwiązać, na przykładzie zabawki?
yoni
26

Możesz użyć dekoratorów, aby wyłączyć test, który może opakować funkcję i uniemożliwić testowi jednostkowemu googletest lub python uruchomienie przypadku testowego.

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()

Wynik:

testFoo has been disabled
GTM
źródło
11

Najnowsza wersja (2.7 - niewydana) obsługuje pomijanie / wyłączanie testów w ten sposób . Możesz po prostu pobrać ten moduł i użyć go w istniejącej instalacji Pythona. To prawdopodobnie zadziała.

Przed tym, użyłem do zmiany nazwy testów chciałem pominięte do xtest_testnameod test_testname.


Oto krótki skrypt elisp, który to zrobi. Mój elisp jest trochę zardzewiały, więc z góry przepraszam za wszelkie problemy. Niesprawdzone.

  (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_"))))
Noufal Ibrahim
źródło
+1, ale w całym projekcie nad którym pracuję wszyscy używają pythona v2.6.2 i nie sądzę, żeby to się zmieniło: /, ale to rozwiązanie, dzięki
coelhudo
Możesz trochę poprawić swój edytor, aby dać ci makro do włączenia / wyłączenia testu, ale mówię jako użytkownik Emacsa, więc ... :)
Noufal Ibrahim
Ja też jestem użytkownikiem Emacsa, czy zrobiłeś makro?
coelhudo
Nie. Po prostu pozwoliłem im zawodzić, ale to nie jest takie trudne. Zaktualizowałem jednak odpowiedź szybkim ruchem.
Noufal Ibrahim
Ta zaakceptowana odpowiedź nie jest odpowiedzią, tylko linkiem. Prawdziwą, aktualną odpowiedzią też nie jest ta, w której głosowano najczęściej. To prawda, ma 4 lata. Ten darmowy elisp jedynie zaciemnia.
jwd630
10

Wystarczy umieścić @unittest.SkipTestdekorator nad testem.

Akif
źródło
Nie wiem, kto to zrobił. Ale czytałem dokumentację i mówi, że SkipTest jest wyjątkiem. W każdym razie różni się od unittest.skip w tym sensie, że skip nigdy nie wykonuje testu (wyłączając go), podczas gdy celem SkipTest jest podniesienie, jeśli coś nieoczekiwanego wystąpi podczas wykonywania testu. Czy mam rację? Ciekawe trudne.
coelhudo
unittest.skip(bez powodu) daje mi błąd w Pythonie 2, ale nie w Pythonie 3.
Akif
5

Po prostu zmieniam nazwę metody przypadku testowego z podkreśleniem: test_myfunc staje się _test_myfunc.

MattK
źródło
3

W docs 2,1 nie określisz zignorować lub pominąć metody.

Zazwyczaj jednak w razie potrzeby blokuję komentarz.

Finglas
źródło
1

Koncentrując się na „tymczasowo wyłączonej” części pytania, najlepsza odpowiedź w pewnym stopniu zależy od przypadku użycia. Przypadek użycia, który mnie tu sprowadził, jest taki, że wykonuję programowanie sterowane testami na funkcji. W tym procesie sukcesywnie piszę testy i często używam punktów przerwania w funkcji do debugowania. Jeśli po prostu uruchamiam wszystkie testy za każdym razem, gdy uruchamiam test runner, w końcu zatrzymuję się w punktach przerwania testów, które już działają. Dodanie „pomiń” lub zmiana nazwy testu lub czegoś podobnego nie jest tym, czego chcę, ponieważ po zakończeniu pisania funkcji chcę, aby wszystkie testy zostały uruchomione. Gdybym użył „pomiń”, musiałbym cofnąć się i „cofnąć pomijanie”.

W moim przypadku rozwiązanie leży w module uruchamiającym testy, a nie w kodzie testowym. Używam pytest . Dzięki pytest łatwo jest określić pojedynczy test z wiersza poleceń:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(zamień czapki na swoje wartości).

Rozumiem, że to pytanie dotyczyło python-unitest. Nie używałem tego od dłuższego czasu. Nie zdziwiłbym się gdyby miał coś podobnego do pytest. Jeśli nie, możesz łatwo przejść do pytest. Nie musisz modyfikować swojego kodu. Po prostu zainstaluj go i zmień polecenie test runner.

Używam również PyCharm Pro. Na stronie, na której jest wyświetlany mój kod testu, obok definicji każdego testu znajduje się mała ikona. Mogę kliknąć tę ikonę i indywidualnie uruchomić ten test.

Głaskanie pod brodę
źródło