Кто-нибудь знает, как работают nosetest’s -m, -i и -e?

#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
  

Если у вас есть более сложные потребности в выполнении тестов, я бы рекомендовал пометить тесты и использовать пакет атрибутов.