Как заставить py.test или нос искать тесты внутри всех файлов python?

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

Как я могу убедить py.test или nose искать тесты внутри всех файлов python, рекурсивно – «», в том числе те, которые не имеют test в именах файлов? »?

Внутри исходных файлов я соблюдаю стандартное соглашение об именах: class testSomeName с методами def test_some_name .

Если это невозможно, то какое другое решение я могу использовать для получения того же результата.

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

4 Solutions collect form web for “Как заставить py.test или нос искать тесты внутри всех файлов python?”

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

Вы можете обойти регулярное выражение, используемое для фильтрации файлов в носу с помощью следующего кода. Создайте модуль python (например, my_nosetests.py )

 import nose from nose.plugins.base import Plugin class ExtensionPlugin(Plugin): name = "ExtensionPlugin" def options(self, parser, env): Plugin.options(self,parser,env) def configure(self, options, config): Plugin.configure(self, options, config) self.enabled = True def wantFile(self, file): return file.endswith('.py') def wantDirectory(self,directory): return True def wantModule(self,file): return True if __name__ == '__main__': includeDirs = ["-w", ".", ".."] nose.main(addplugins=[ExtensionPlugin()], argv=sys.argv.extend(includeDirs)) 

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

С py.test это просто. Создайте файл conftest.py с этим контентом:

 # content of conftest.py file at root of your project def pytest_collect_file(path, parent): if path.ext == ".py": return parent.Module(path, parent) 

Это расширит процесс сбора, чтобы создать тестовый узел «Module» для каждого «.py» файла. Ввод этого файла в файл conftest.py делает его расширением для проекта, которое автоматически загружается, если вы conftest.py :

 py.test 

В информационных целях вы также можете ввести:

 py.test --collectonly 

чтобы узнать, какие тесты и файлы собраны, например вывод:

 <Directory 'morecollect'> <Module 'conftest.py'> <Directory 'pkg'> <Module 'test_x.py'> <Function 'test_hello2'> <Module 'x.py'> # this is collected because of our conftest.py extension <Function 'test_hello'> 

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

Поместите файл «setup.cfg» в корень проекта, и он содержит две строки:

 [pytest] python_files=*.py 

затем py.test выберите тесты из всех *.py файлов. Здесь объясняется: pytest docs

с носом:

 nosetests --all-modules 

В документации говорится, что

По умолчанию все каталоги, не начинающиеся с точки, пересекаются, ища файлы test _ * .py и * _test.py. Эти файлы Python импортируются под их именем пакета.

Можете ли вы убедиться, что это относится к вашему коду?

Обновить

(Caveat Emptor: я не пробовал / не тестировал это) Как насчет использования крючков для сбора каталогов и файлов?

py.test вызывает следующие два основных крючка для сбора файлов и каталогов:

 def pytest_collect_directory(path, parent): """ return Collection node or None for the given path. """ def pytest_collect_file(path, parent): """ return Collection node or None for the given path. """ 

Оба возвращают узел коллекции для заданного пути. Все возвращенные узлы из всех реализаций крюка будут участвовать в протоколе сбора и запуска. parent объект является родительским узлом и может использоваться для доступа к параметрам командной строки через объект parent.config .

  • using setup_class для инициализации «конфликты» с параметрами параметризации
  • определение покрытия теста с помощью py.test + gevent
  • Запуск py.test от emacs
  • Как получить py.test для распознавания conftest.py в подкаталоге?
  • pytest-xdist: LookupError: setuptools-scm не смог обнаружить версию
  • pytest capsys: проверка вывода и получение сообщения?
  • Pytest использует одно и то же устройство дважды в одной функции
  • Параметрирование Py.Test на основе параметризованного прибора
  • Python - лучший язык программирования в мире.