#python #regex #unit-testing #nosetests
#python #регулярное выражение #модульное тестирование #nosetests
Вопрос:
Я пытаюсь заставить nosetests идентифицировать мои тесты, но он не выполняет ни один из моих тестов должным образом.
У меня есть следующая файловая структура
Project
----Foo/
----__init__.py
----bar.py
----test/
----__init__.py
----unit/
----__init__.py
----bar_test.py
----functional/
----__init__.py
----foo_test.py
Внутри bar_test.py
class BarTest(unittest.TestCase):
def bar_1_test():
...
Внутри foo_test.py
class FooFTest.py
def foo_1_test():
...
Использование -m, -i, -e опций nosetests
- Какое регулярное выражение мне нужно для запуска только модульных тестов (в unit /, тесты в классе BarTest)
- Какое регулярное выражение мне нужно для запуска только функциональных тестов (в разделе functional/, тесты в классе FooFTest)
Я пробовал различные комбинации и, похоже, не могу заставить nosetests последовательно выполнять то, что я хочу
Ответ №1:
Самый простой способ запустить только тесты в рамках Project/test/unit
— это использовать --where
. Например:
nosetests --where=Project/test/unit
Затем используйте --match
( -m
) или --exclude
( -e
) для уточнения списка, если это необходимо.
Если вы все еще хотите использовать селекторы регулярных выражений, вы, вероятно, можете сделать это следующим образом (не тестировалось):
nosetests --match='^Foo[b_./-])[Tt]est'
Выполнение этого скрипта из Project
каталога приведет к запуску всех тестов, которые начинаются с «Foo» и заканчиваются на «[Tt]est».
Как правило, вы, вероятно, захотите использовать либо --match
, либо --exclude
, но не оба варианта. Оба эти параметра определяют шаблон для соответствия именам функций. Вы можете уточнить любой из них, используя --ignore-files
который, естественно, позволяет вам игнорировать целые файлы.
Комментарии:
1. значит, —match и —exclude соответствуют только тестовым методам, а не имени тестового класса?
2. Упс. Хороший улов. Вы правы. Из документации для —match: «Файлы, каталоги, имена функций и имена классов, которые соответствуют этому регулярному выражению, считаются тестами». Итак, вы могли бы использовать —match для сбора всех тестов, затем использовать —exclude, чтобы игнорировать те, которые содержат, например, «bar».
Ответ №2:
Учитывая вашу структуру каталогов, вы можете легко запускать сегменты тестов, используя опцию —exclude .
Запустите все тесты:
nosetests Project
Запуск модульных тестов:
nosetests Project -e functional
Запуск функциональных тестов:
nosetests Project -e unit
Если у вас есть более сложные потребности в выполнении тестов, я бы рекомендовал пометить тесты и использовать пакет атрибутов.