Нос: протестируйте все модули в данном пакете - PullRequest
4 голосов
/ 12 сентября 2011

У меня есть пакет с несколькими подпакетами, один из них для тестов (с именем tests). Поскольку имя подпакета проясняет, что содержащиеся модули являются тестовыми модулями, я предпочитаю не загрязнять имена модулей носителем шаблона имен тестов, который, как ожидается, будет включать их для тестирования. Вот о чем я думаю:

- foo
  - __init__.py
  ...
  - bar
    - __init__.py
    ...
  - baz
    - __init__.py
    ...
  - tests
    - __init__.py
    - something.py

Теперь по умолчанию нос не запускает тесты, найденные в foo.tests.something. Я знаю, что нос принимает опцию -i для определения регулярных выражений для дополнительных элементов поиска в тестах. Так что nose -i something выполняет эту работу здесь. Тем не менее, у меня есть несколько модулей в пакете tests, и я не хочу называть их явно. nose -i tests\..* не работает, похоже, что нос совпадает только с базовыми именами модулей. В крайнем случае я могу запустить nose --all-modules, но это также проверяет foo.bar и foo.baz - я бы хотел этого избежать.

Итак, как я могу дать команду носу искать тесты во всех модулях данного пакета (tests в моем случае)? Я мог бы написать плагин для этой задачи, но я ищу стандартное решение.

Ответы [ 3 ]

4 голосов
/ 12 сентября 2011

Если вы называете файлы в тестах с префиксом test_ (то есть переименовываете something.py в test_something.py, бегущий нос должен поднять их по умолчанию.

Вы говорите: «Я предпочитаю не загрязнять имена модулей шаблоном имени теста, который, как предполагается, носители включают в них для тестирования», но «что-то» не описывает файл, потому что файл что-то тестирует. В чем проблема с использованием стандартного способа обозначения тестов, который не вводит в заблуждение?

3 голосов
/ 05 декабря 2012

Вы сможете импортировать файлы в __init__.py и получить их. У меня была такая настройка:

- app:
  - __init__.py
  - models.py
  - views.py
  - tests:
    - __init__.py
    - models.py # contain tests
    - views.py # contain tests

В файле tests/__init__.py у меня было следующее:

from app.tests.models import *
from app.tests.views import *

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

Вы также можете использовать декоратор @istest, чтобы пометить отдельный def как тест, если вы хотите избежать именования методов, соответствующих регулярному выражению. Я не пытался сделать это для модулей (py-файлов), которые также не соответствуют регулярному выражению, но я сомневаюсь, что это будет работать без вышеупомянутого импорта.

Обратите внимание, я отошел от импорта в __init__.py и просто префикс своих методов и имен файлов с именем test_ и постфикс моих классов с помощью Test. Я считаю, что это делает код более самоописываемым, поскольку даже в классе Test могут существовать методы установки и вспомогательные методы (например, генераторы).

0 голосов
/ 07 апреля 2012

с носом:

nosetests --all-modules

С помощью py.test это можно сделать, поместив это в setup.cfg (файл конфигурации):

[pytest]
python_files=*.py

проверьте этот документ: Pytest Docs .

...