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.
Te spadki są coraz głupsze. –
Dlaczego nie usunąć tego posta i nie zdobyć odznaki "przeciwników"? –
Dlaczego jest to tak mocno odrzucane? Rozumowanie jest niejasne. – CaffeineConnoisseur