2012-08-17 16 views
13

Pracuję nad testami aplikacji internetowej napisanych w pythonie.Python nosetests pomiń niektóre testy

Załóżmy, że mam 5 testów w moim module test_login.py.

Każdy pojedynczy test jest klasą.

Istnieje często jeden, podstawowy test, który rozszerza klasę TestFlow, która jest naszą wstępnie zdefiniowaną klasą testową.

A następnie inne testy w tym module rozszerzają ten test podstawowy.

Na przykład:

#The base test 

TestLogin(TestFlow): 
    #do login_test_stuff_here 

#Another test in the same module 

TestAccountDetails(TestLogin) 
    #do account_details_test_stuff_here 

... 

To rzeczywiście bardzo przydatny, ponieważ w celu przetestowania np AccountDetails użytkownik musi być zalogowany, więc mogę tylko dziedziczą z testu TestLogin i jestem gotowy, aby przetestować inne funkcje jako zalogowany użytkownik.

Wszystkie testy znajdują się w folderze Projekt/projekt/testy.

Używamy testów nosa z opcją - z pylonami do przeprowadzania testów.

Moje pytanie brzmi, czy istnieje sposób oznaczania niektórych testów jako "Nie testuj tego".

Ponieważ nie chcę tracić czasu na wykonywanie tych "testów podstawowych" bezpośrednio, ponieważ będą one wykonywane przez inne testy, które z nich pochodzą.

Będą prawdopodobnie tony tych testów i chcę zapisać każdą sekundę tam, gdzie jest to możliwe.

Ja już znalazłem coś podobnego Przejdź, SkipTest lub @nottest, ale te tylko pracy dla test_methods obrębie ceratin TestClass, więc nie sądzę, to będzie działać tutaj, zostały Mam jedną klasę dla każdego przypadek testowy.

Odpowiedz

2

http://nose.readthedocs.org/en/latest/writing_tests.html

testy pisania

Jak z py.test testy nos nie musi być podklasy unittest.TestCase. Dowolna funkcja lub klasa, które są zgodne ze skonfigurowanym wyrażeniem regularnym testMatch ((?:^| [\ B _ \ .-]) [Tt] est), domyślnie - czyli ma test lub test na granicy wyrazów lub po - lub _) i funkcjonuje w module, który również pasuje do tego wyrażenia, zostanie przeprowadzony test jako . Ze względu na kompatybilność ze starszymi testowymi przypadkami testowymi, noski załadują również testy z podklas Unittest.TestCase, tak jak to robi unittest. Podobnie jak py.test, nos uruchamia testy funkcjonalne w kolejności , w których pojawiają się one w pliku modułu. Testy pochodne TestCase i inne klasy testowe są uruchamiane w kolejności alfabetycznej.

zanotuj wyrażenie i regułę powyżej. nazwij swoje funkcje/metody/klasy, aby nie pasowały do ​​wyrażenia regularnego, i nie będą one uruchamiane.

To powiedziawszy, nie polecam twojej sugestii łączenia dziedziczenia do testów. to przepis na frustrację i bałagan.

Prawdopodobnie lepiej byłoby, gdybyś zrobił klasę mixin lub definiując klasę podstawową, która nie ma żadnych faktycznych testów - ale ma wiele funkcji pomocniczych, które dziedziczenie klas może wywoływać i używać jako własne.

Jeśli spojrzysz na testy najpopularniejszych pakietów, prawie wszyscy korzystają z tego podejścia.

+0

Pamiętaj, że wyrażenie regularne nie jest jedyną bramką do włączenia - * nos również załaduje testy z podklas Unittest.TestCase *. Wydaje się, że robi to dla wszystkiego, co importuje. Mam test o nazwie 'FooMixin' w module o nazwie' foo_helpers.py', który jest traktowany jako test tylko dlatego, że pochodzi z 'unittest.TestCase'. –

12

nosetests Formularz można to zrobić jak poniżej, określając atrybuty http://nose.readthedocs.org/en/latest/plugins/attrib.html

Często podczas testowania będziemy chcieli, aby wybrać testy oparte na kryteriach, a nie tylko przez nazwę pliku. Na przykład możesz uruchomić wszystkie testy oprócz wolnych. Możesz to zrobić za pomocą wtyczki Selektora atrybutów, ustawiając atrybuty w swoich metodach testowania. Oto przykład:

def test_big_download(): 
    import urllib 
    # commence slowness... 

test_big_download.slow = 1 

Po przypisaniu atrybutu powolny = 1 można wykluczyć, że test i wszystkie inne badania mające powolne atrybut uruchamiając

$ nosetests -a '!slow' 
2

rzeczywiście można użyć the skiptest for Classes też.

import unittest 

@unittest.skip("Class disabled") 
class TestLogin(TestFlow): 
    ... 
+0

Zauważ, że w Pythonie <= 2.6 musisz zainstalować unittest2, aby to działało. – gaborous

+1

To nie zadziała dla dostarczonego przypadku użycia. Dodanie dekoratora pominięcia do klasy bazowej spowoduje również pominięcie wszystkich podklas. Nawet jeśli użyłeś '@ unittest.skipIf (True," klasa bazowa ")' na klasie bazowej i '@ unittest.skipIf (False," ")' na podklasach, podklasy nadal są pomijane –