2009-07-13 20 views
41

Podczas korzystania nosetests dla Pythona możliwe jest wyłączenie testów jednostkowych, ustawiając atrybut funkcji testowania za __test__ false. I wprowadziły to za pomocą poniższego dekorator:Wyłączenie Python nosetests

def unit_test_disabled(): 
    def wrapper(func): 
     func.__test__ = False 
     return func 

    return wrapper 

@unit_test_disabled 
def test_my_sample_test() 
    #code here ... 

Jednak ta ma efekt uboczny nazywając opakowanie jako badanej jednostki. Owijacz zawsze przechodzi, ale jest zawarty w wynikach testów nosa. Czy istnieje inny sposób strukturyzacji dekorator tak, że test nie będzie działać i nie pojawia się na wyjściu nosetests.

Odpowiedz

-17

myślę, że będzie trzeba także zmienić nazwę dekorator do czegoś, co nie ma testu w. Nie tylko poniżej drugiego badania dla mnie i pierwszy nie pojawi się w zestaw testowy.

def unit_disabled(func): 
    def wrapper(func): 
     func.__test__ = False 
     return func 

    return wrapper 

@unit_disabled 
def test_my_sample_test(): 
    assert 1 <> 1 

def test2_my_sample_test(): 
    assert 1 <> 1 
+6

Te spadki są coraz głupsze. –

+7

Dlaczego nie usunąć tego posta i nie zdobyć odznaki "przeciwników"? –

+1

Dlaczego jest to tak mocno odrzucane? Rozumowanie jest niejasne. – CaffeineConnoisseur

130

Nos ma już wbudowane dekorator dla tego:

from nose.tools import nottest 

@nottest 
def test_my_sample_test() 
    #code here ... 

Sprawdź również inne gadżety, które nos zapewnia: https://nose.readthedocs.org/en/latest/testing_tools.html

+1

Test będzie po prostu nie uruchamiany i nie oznaczany jako pomijany ... Czasami byłoby bardziej przydatne podniesienie wyjątku SkipTest, jak zasugerowano w odpowiedzi @Anders Waldenborg, dzięki czemu można by zobaczyć w wynikach, że niektóre testy zostały pominięte. – Serge

+0

Jest to pełne wdzięku, ponieważ można odziedziczyć po klasie '@ nottest' i nadal można oznaczyć potomka jako' @ istest'. Wierzę, że byłem wszędzie w poszukiwaniu sposobu na osiągnięcie tego zachowania, i to jest jedyne, które działa bez rozrywania kodu. (Zagnieżdżanie klasy potomków w celu uniknięcia śledzenia nosa sprawia, że ​​wszystko wygląda okropnie: /) – Rubens

30

Jest również plugin skiptest dla nosetest, co spowoduje pokaz testowy na wyjściu testowym pomijany. Oto dekorator na to:

Przykâadowa:

$ nosetests tests 
.......................................................................... 
..................................S............. 
---------------------------------------------------------------------- 
Ran 122 tests in 2.160s 

OK (SKIP=1) 
+4

Lub możesz po prostu "podnieść test" na początku testu. Zauważ także, że możesz wykonać "od nosa import SkipTest". –

+0

Zapoznaj się z dokumentacją dla tego: _ "Zwykle możesz użyć TestCase.skipTest() lub jednego z pomijanych dekoratorów zamiast podnosić to bezpośrednio." ._ – Zitrax

54

Można również użyć unittest.skip dekorator:

import unittest 


@unittest.skip("temporarily disabled") 
class MyTestCase(unittest.TestCase): 
    ... 
+1

Działa doskonale również z nosem, a także z funkcjami. Wspaniały! Zobacz http://pybites.blogspot.fr/2009/03/unittest-now-with-test-skipping-finally.html – gaborous

+1

Dziękuję, działa to świetnie, niezależnie od nosa! – alexcasalboni

+1

Działa to również doskonale w przypadku sparametryzowanych testów przy użyciu dekoratora '@ parameterized.expand()' z 'node_parameterized' ... pod warunkiem, że wstawisz' @ unittest.skip() '* poniżej * innego - tj. tak aby unieruchomiony dekorator działał przed sparametryzowanym dekoratorem. – CivFan

4

można po prostu zacząć nazwę klasy, metody lub funkcji z podkreśleniem i nosem to zignoruje.

@nottest ma swoje zastosowania, ale uważam, że nie działa dobrze, gdy klasy wywodzą się od siebie, a niektóre klasy bazowe muszą być ignorowane przez nos. Zdarza się to często, gdy mam serię podobnych widoków Django do przetestowania. Często mają cechy, które wymagają testów. Na przykład są dostępne tylko dla użytkowników z określonymi uprawnieniami. Zamiast napisać taką samą kontrolę uprawnień dla wszystkich z nich, umieścić taką wspólną testu w klasie wstępnej, z której wywodzą się inne klasy. Problemem jest jednak, że klasa bazowa jest nie tylko być uzyskane przez późniejszych klasach i nie jest przeznaczony do pracy na własny rachunek. Oto przykład problemu:

from unittest import TestCase 

class Base(TestCase): 

    def test_something(self): 
     print "Testing something in " + self.__class__.__name__ 

class Derived(Base): 

    def test_something_else(self): 
     print "Testing something else in " + self.__class__.__name__ 

a wyjście z systemem nos na nim:

$ nosetests test.py -s 
Testing something in Base 
.Testing something in Derived 
.Testing something else in Derived 
. 
---------------------------------------------------------------------- 
Ran 3 tests in 0.000s 

OK 

Klasa Base jest wliczone w testach.

Nie mogę po prostu policzek @nottest na Base, ponieważ będzie oznaczać całą hierarchię. Rzeczywiście, jeśli po prostu dodać @nottest z kodem powyżej, przed class Base, następnie nos nie uruchamiać żadnych testów.

Co mogę zrobić, to dodać podkreślenia z przodu klasy bazowej:

from unittest import TestCase 

class _Base(TestCase): 

    def test_something(self): 
     print "Testing something in " + self.__class__.__name__ 

class Derived(_Base): 

    def test_something_else(self): 
     print "Testing something else in " + self.__class__.__name__ 

A kiedy działa to _Base jest ignorowany:

$ nosetests test3.py -s 
Testing something in Derived 
.Testing something else in Derived 
. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK 

Takie zachowanie nie jest dobrze udokumentowane, ale kod, który wybiera testy explicitly checks for an underscore at the start of class names.

Podobny test wykonywany jest przez nos na nazwach funkcji i metod, dzięki czemu można je wykluczyć, dodając podkreślenie na początku nazwy.