Как сделать py.test или нос для поиска тестов во всех файлах python? - PullRequest
4 голосов
/ 08 сентября 2010

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

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 14 сентября 2010

С 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)

Это расширит процесс сбора для создания тестового узла "Модуль" для каждого файла ".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.

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

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

[pytest]
python_files=*.py

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

с носом:

nosetests --all-modules
5 голосов
/ 08 сентября 2010

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

Вы можете обойти регулярное выражение, используемое для фильтрации файлов в носу с помощьюследующий кодСоздайте модуль 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, и у вас должны быть запущены ваши тесты.Имейте в виду, что вы фактически загружаете все модули и ищете в них тесты.Остерегайтесь любого побочного эффекта загрузки модуля.

1 голос
/ 08 сентября 2010

Документация гласит, что

По умолчанию все каталоги, не начинающиеся с точки, просматриваются в поисках файлов 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.

...