Вы можете просто начать имя класса, метода или функции с подчеркивания, и нос будет игнорировать его.
@nottest
имеет свое применение, но я считаю, что он не работает хорошо, когда классы наследуются друг от друга, и некоторые базовые классы должны игнорироваться носом. Это часто случается, когда у меня есть ряд похожих представлений Django для тестирования. Они часто разделяют характеристики, которые требуют тестирования. Например, они доступны только пользователям с определенными разрешениями. Вместо того чтобы писать одинаковую проверку разрешений для всех них, я помещаю такой общий тест в начальный класс, из которого происходят другие классы. Проблема, однако, в том, что базовый класс существует только для более поздних классов и не предназначен для самостоятельного запуска. Вот пример проблемы:
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__
И вывод от насморка на него:
$ nosetests test.py -s
Testing something in Base
.Testing something in Derived
.Testing something else in Derived
.
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Класс Base
включен в тесты.
Я не могу просто ударить @nottest
на Base
, потому что это отметит всю иерархию. В самом деле, если вы просто добавите @nottest
к приведенному выше коду перед class Base
, то нос не будет запускать никаких тестов.
Я добавляю подчеркивание перед базовым классом:
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__
А при запуске _Base
игнорируется:
$ nosetests test3.py -s
Testing something in Derived
.Testing something else in Derived
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Это поведение плохо документировано, но код, который выбирает тесты явно проверяет подчеркивание в начале имен классов .
Подобный тест выполняется носом для имен функций и методов, поэтому их можно исключить, добавив подчеркивание в начале имени.