Отключение носетов Python
При использовании nosetests для Python можно отключить unit test, установив для атрибута тестовой функции __test__
значение false. Я реализовал это с помощью следующего декоратора:
def unit_test_disabled():
def wrapper(func):
func.__test__ = False
return func
return wrapper
@unit_test_disabled
def test_my_sample_test()
#code here ...
Однако это имеет побочный эффект вызова оболочки как unit test. Wrapper всегда будет проходить, но он включен в вывод носететов. Есть ли другой способ структурирования декоратора, чтобы тест не выполнялся и не отображался в выводах nosetests.
Ответы
Ответ 1
Я думаю, вам также нужно будет переименовать ваш декоратор в то, что не получило тест. Ниже ниже только второй тест для меня, а первый не отображается в наборе тестов.
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
Ответ 2
Нос уже имеет встроенный декоратор для этого:
from nose.tools import nottest
@nottest
def test_my_sample_test()
#code here ...
Также проверьте другие преимущества, которые дает нос: https://nose.readthedocs.org/en/latest/testing_tools.html
Ответ 3
Вы также можете использовать unittest.skip
decorator:
import unittest
@unittest.skip("temporarily disabled")
class MyTestCase(unittest.TestCase):
...
Ответ 4
Также существует плагин skiptest для nosetest, который приведет к тому, что тестовое шоу в тестовом выходе будет пропущено. Вот для этого декоратор:
def skipped(func):
from nose.plugins.skip import SkipTest
def _():
raise SkipTest("Test %s is skipped" % func.__name__)
_.__name__ = func.__name__
return _
Пример вывода:
$ nosetests tests
..........................................................................
..................................S.............
----------------------------------------------------------------------
Ran 122 tests in 2.160s
OK (SKIP=1)
Ответ 5
Вы можете просто начать имя класса, метода или функции с подчеркиванием, а нос проигнорирует его.
@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
Это поведение плохо документировано, но код, который выбирает тесты явно проверяет подчеркивание в начале имен классов.
Аналогичный тест выполняется носом по именам функций и методов, поэтому их можно исключить, добавив подчеркивание в начале имени.
Ответ 6
Возможно, это сработает:
def unit_test_disabled(f):
f.__test__ = False
return f
@unit_test_disabled
def test_my_sample_test()
#code here ...