2009-07-13 5 views
41

При использовании nosetests для Python можно отключить модульный тест, установив для атрибута __test__ тестовой функции значение false. Я реализовал это с помощью следующего декоратора:Отключение nosetests Python

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

    return wrapper 

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

Однако, это имеет побочный эффект вызова обертки в качестве теста на единицу. Wrapper всегда будет проходить, но он включен в вывод носететов. Есть ли другой способ структурирования декоратора, чтобы тест не выполнялся и не отображался в выводах nosetests.

ответ

-17

Я думаю, вам также нужно будет переименовать ваш декоратор в то, что не провело тест. Нижеследующее только не работает во втором тесте для меня, а первое не отображается в наборе тестов.

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

Эти downvotes становятся глупыми. –

+7

Почему бы не удалить этот пост и не получить значок «равное давление»? –

+1

Почему это так сильно опущено? Причины неясно. – CaffeineConnoisseur

130

Нос уже имеет встроенный декоратор для этого:

from nose.tools import nottest 

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

также проверить другие лакомства, что нос обеспечивает: https://nose.readthedocs.org/en/latest/testing_tools.html

+1

Тест будет просто не запущен и не будет отмечен как пропущенный ... Иногда было бы более полезно повысить исключение SkipTest, как было предложено в ответе @Anders Waldenborg, поэтому можно было бы увидеть в результатах, что некоторые тесты были пропущены. – Serge

+0

Это изящно, так как можно наследовать от класса '@ nottest' и все равно отметить потомка как' @ istest'. Я считаю, что я был повсюду в поисках того, как добиться такого поведения, и это единственный, который работает без разрыва кода. (Вложенность класса потомков, чтобы избежать отслеживания носа, все это выглядит ужасно: /) – Rubens

30

Там также skiptest плагин для nosetest, что приведет к тестовое шоу в тестовом выходе, как пропущено. Вот декоратор для этого:

Пример вывода:

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

OK (SKIP=1) 
+4

Или вы можете просто «поднять СкипТест» в начале вашего теста. Также обратите внимание, что вы можете делать «из импорта носа SkipTest». –

+0

Обратите внимание на документацию для этого: _ «Обычно вы можете использовать TestCase.skipTest() или один из пропущенных декораторов вместо того, чтобы поднимать это прямо.» ._ – Zitrax

54

Вы также можете использовать unittest.skip декоратора:

import unittest 


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

Хорошо работает с носом, а также над функциями. Большой! См. Http://pybites.blogspot.fr/2009/03/unittest-now-with-test-skipping-finally.html – gaborous

+1

Спасибо, это отлично работает, независимо от носа! – alexcasalboni

+1

Это также отлично работает с параметризованными тестами, используя декоратор '@ parameterized.expand()' от 'node_parameterized' ... до тех пор, пока вы помещаете' @ unittest.skip() '* ниже * другой - то есть. так что декоративный декодер работает до параметризованного декоратора. – CivFan

4

Вы можете просто запустить имя класса, метода или функции с подчеркиванием и носом проигнорирует его.

@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 

Такое поведение не очень хорошо документированы, но код, который выбирает тесты explicitly checks for an underscore at the start of class names.

Аналогичный тест выполняется носом по именам функций и методов, поэтому их можно исключить, добавив подчеркивание в начале имени.

Смежные вопросы