2010-09-08 13 views
4

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

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

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

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

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

ответ

5

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

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

+0

Нос - замечательная вещь! – dmitko

+0

Можете ли вы дать решение для носа, я бы принял его! – sorin

+0

С носом вы используете nosetests в корневом каталоге или передаете директорию в качестве аргумента. По умолчанию он будет возвращаться. – Rod

1

documentation говорит, что

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

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

Update

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

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. """ 

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

+1

я сделал RTFM и именно это было проблемой. Я хотел изменить это поведение, у меня есть unittests, но все они встроены в файл модуля и вызваны из __main__. Я уверен, что в будущем мне захочется их переместить, но на данный момент я просто хочу отсканировать их все, даже в файлах, не использующих это имя. – sorin

+1

@Sorin: обновил мой ответ. См. Выше. –

6

С 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 файл как installable plugin и сделать расширение доступно путем установки плагина. В этом случае вам не нужен файл conftest.py.

+0

На данный момент я не могу проверить, работает ли этот метод, потому что сбой py.test, см. эту ошибку: http://bitbucket.org/hpk42/py-trunk/issue/119/fail- to-impot -__ init__py-internalerror – sorin

+0

Привет, Сорин. Хорошо, Ронни и я только что выпустили новую версию с несколькими исправлениями, включая проблему, которую вы видели. Выполнение «easy_install -U py» должно принести его вам. Спасибо за сообщение, получайте удовольствие. Holger – hpk42

5

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

[pytest] 
python_files=*.py 

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

с носа:

nosetests --all-modules 

 Смежные вопросы

  • Нет связанных вопросов^_^