Подтвердить что ты не робот

Отключение носетов 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.

4b9b3361

Ответ 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 ...