2016-12-05 15 views
1

Я знаю, как py.test обнаруживает тесты для запуска, но я не знаю, как заставить тесты ссылаться на файлы, содержащие код для тестирования.Как pytest находит файлы для проверки?

Мой проект выглядит следующим образом:

arith.py 
tests/ 
    test_airth.py 

В моем проекте корневого каталога, у меня есть файл arith.py с

def plus(x, y): 
    return x + y 

В файле tests/test_arith.py я имею

import arith 
def test_plus(): 
    assert arith.plus(3, 5) == 8 

Когда Я запускаю в корневом каталоге проекта

pytest 

Он обнаруживает мой тестовый файл, потому что я следовал правилам обнаружения испытаний. Но pytest отвечает

ImportError при импорте тест модуля тесты/test_arith.py»

Я выбежала pytest от корня проекта, так почему это не нравится мой импорт? Он хочет найти файлы, которые я тестирую в каталоге tests!

Как правильно настроить импорт, чтобы мои тестовые файлы в каталоге tests/ могли видеть файлы, находящиеся в тестировании, которые находятся в корневом каталоге проекта? (Примеры в документации pytest, похоже, не делают ничего особенного ... возможно, тесты находятся в том же каталоге, что и файлы под тестом? Они описывают обнаружение тестов очень подробно, но я, должно быть, пропустил, как настроить тесты, чтобы они можно увидеть код они тестирования)

ответ

2

Если у вас есть макет, как это (то, что я делаю.):

. 
├── myprogram 
│   ├── __init__.py 
│   ├── core.py 
│   └── db.py 
├── setup.py 
└── tests 
    ├── test_core.py 
    └── test_db.py 

вы должны ссылаться pytest следующим образом:

py.test tests 

Я уверен, что это абсолютный/относительный путь к каталогу тестов , Это также предполагает, что вы сделали что-то вроде python -m pip install -e . в своем корневом каталоге. И у вас там есть .git или .hg :)

Это немного странно, так много нужно. Наверняка есть лучший способ?

Фактически, что является лучшим способом. Я не думаю, что это спорно, чтобы объявить о том, что лучший способ распространять приложение Python как пакет Python, предпочтительно wheel. Для этого вам, вероятно, понадобится setup.py.

Устанавливая свой пакет (желательно в изолированной песочнице venv/virtualenv), вы убедитесь, что знаете, какие пакеты необходимы для установки/запуска ваш. Если ваш пакет установлен, это означает, что любой скрипт, который делает import myprogram (используя мой пример макета), сможет импортировать ваш пакет. Это то, что вы будете делать в своем тестовом наборе.

Тогда ваше тестовое открытие так же просто, как рассказать pytest, где его найти.

+0

Nice. Интересно, что я пытаюсь распространять один файл, который используют клиенты, просто говоря «import thething». Я создал большие многофайловые приложения, в которых 'pytest' часть, и да, каталог тестов был братом' main', 'models',' views' и, конечно, 'env'. Когда они упакованы таким образом, клиенты будут говорить «от моделей импортировать что угодно» или «импортировать модели». Чтобы получить то, что я хочу, я предполагаю, что мне нужно не просто иметь «thething.py», а вместо этого «thething /» братьев из «тестов» и поместить весь мой код в 'thething/__ init __. Py'. Это всего лишь пара сотен строк ... –

+1

Если вы пытаетесь предоставить что-то, что хотите, чтобы люди импортировали, вы * определенно хотите создать пакет, даже если это всего лишь один файл. Вы все еще можете сделать это с помощью 'setup.py'. И если вы примете такой подход, вы можете иметь 'thething.py' и' tests/'в той же папке. –

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

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