Носовые тесты Python пропускают определенные тесты

Я работаю над тестами для веб-приложения, написанного на python.

Предположим, у меня есть 5 тестов в моем модуле test_login.py.

Каждый тест — это класс.

Часто есть один базовый тест, который расширяет класс TestFlow, который является нашим предопределенным тестовым классом.

А затем другие тесты в этом модуле расширяют этот базовый тест.

Например :

#The base test 

TestLogin(TestFlow):
    #do login_test_stuff_here

#Another test in the same module

TestAccountDetails(TestLogin)
    #do account_details_test_stuff_here

...

На самом деле это очень удобно, потому что, например, для тестирования AccountDetails пользователь должен войти в систему, поэтому я могу просто унаследовать тест TestLogin и готов протестировать другие функции в качестве вошедшего пользователя.

Все тесты находятся в папке Project/project/tests.

Мы используем носовые тесты с параметром --with-pylons для запуска тестов.

И мой вопрос в том, есть ли способ пометить определенный TestClass как «Не тестировать этот».

Потому что я не хочу тратить время на выполнение этих «базовых тестов» напрямую, потому что они будут выполняться другими тестами, которые унаследованы от них.

Вероятно, этих тестов будет много, и я хочу сохранить каждую секунду, где это возможно.

Я уже нашел что-то вроде Skip, SkipTest или @nottest, но они работают только для test_methods внутри определенного TestClass, поэтому я не думаю, что это будет работать здесь, если бы у меня был один класс для каждый тестовый пример.


person koleS    schedule 17.08.2012    source источник


Ответы (3)


Сформировать тесты носа можно, как показано ниже, указав атрибуты http://nose.readthedocs.org/en/latest/plugins/attrib.html

Часто при тестировании вам нужно выбирать тесты на основе критериев, а не просто по имени файла. Например, вы можете захотеть запустить все тесты, кроме медленных. Вы можете сделать это с помощью подключаемого модуля селектора атрибутов, установив атрибуты в методах тестирования. Вот пример:

def test_big_download():
    import urllib
    # commence slowness...

test_big_download.slow = 1

После того, как вы присвоили атрибуту slow = 1, вы можете исключить этот тест и все другие тесты, имеющие атрибут slow, запустив

$ nosetests -a '!slow'
person vinay polisetti    schedule 01.10.2012

Вы МОЖЕТЕ использовать скиптест и для классов.

import unittest

@unittest.skip("Class disabled")
class TestLogin(TestFlow):
    ...
person Kashif Siddiqui    schedule 19.10.2015
comment
Обратите внимание, что на Python ‹= 2.6 вам необходимо установить unittest2, чтобы это работало. - person gaborous; 11.11.2015
comment
Это не будет работать для предоставленного варианта использования. Добавление декоратора пропуска к базовому классу приведет к тому, что все подклассы также будут пропущены. Даже если вы использовали @unittest.skipIf(True, "base class") для базового класса и @unittest.skipIf(False, "") для подклассов, подклассы все равно пропускаются. - person Clint Doriot; 01.02.2017

http://nose.readthedocs.org/en/latest/writing_tests.html

Написание тестов

Как и в случае с py.test, носовые тесты не обязательно должны быть подклассами unittest.TestCase. Любая функция или класс, который соответствует сконфигурированному регулярному выражению testMatch ((?:^|[\b_\.-])[Tt]est) по умолчанию, то есть имеет test или Test на границе слова или после - или _ ) и находится в модуле, который также соответствует этому выражению и будет выполняться как тест. Ради совместимости с устаревшими тестовыми примерами юнит-тестов нос также будет загружать тесты из подклассов юниттест.TestCase, как это делает юниттест. Как и py.test, Nose запускает функциональные тесты в том порядке, в котором они указаны в файле модуля. Тесты, производные от TestCase, и другие тестовые классы запускаются в алфавитном порядке.

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

при этом я не рекомендую ваше предложение о цепочке наследования для тестов. это рецепт разочарования и беспорядка.

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

если вы посмотрите на тесты более популярных пакетов, почти все они используют этот подход.

person Jonathan Vanasco    schedule 17.08.2012
comment
Обратите внимание, что регулярное выражение совпадения — не единственный вход для включения — nose также будет загружать тесты из подклассов unittest.TestCase. Кажется, он делает это и для всего, что импортирует. У меня есть тест с именем FooMixin в модуле с именем foo_helpers.py, который рассматривается как тест просто потому, что он получен из unittest.TestCase. - person D.Shawley; 29.05.2013