Правильный способ размещения файлов pytest в структуре каталогов? [Дубликат]

Вы можете сделать

a.divide(b, MathContext.DECIMAL128)

Вы можете выбрать количество бит, которое вы хотите либо 32,64,128.

Проверьте эту ссылку:

http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6&state=class&package=java.math&class=MathContext

109
задан IanS 2 March 2018 в 11:54
поделиться

9 ответов

Да, исходная папка не находится в пути Python, если вы cd в каталоге тестов.

У вас есть 2 варианта:

  1. Добавьте путь к тестовым файлам вручную, например:
    import sys, os
    myPath = os.path.dirname(os.path.abspath(__file__))
    sys.path.insert(0, myPath + '/../')
    
  2. Запустите тесты с помощью env var PYTHONPATH=../.
58
ответ дан Lii 15 August 2018 в 16:19
поделиться
  • 1
    когда am i cd в каталог? Я запускаю py.test из моего корня. если я ошибаюсь, и вы имеете в виду, как pytest проходит через мои папки – MattoTodd 20 April 2012 в 22:46
  • 2
    если бы это была проблема cd, я бы тоже не ударил ее по mac? – MattoTodd 20 April 2012 в 22:46
  • 3
    О, я неправильно понял и думал, что это не работает из каталога тестов. все еще трюк в предложении 1 будет работать. Я использую только Linux, поэтому не могу объяснить поведение других ОС. – Not_a_Golfer 20 April 2012 в 22:50
  • 4
    у вас есть такой импорт на всех ваших файлах test.py? – MattoTodd 20 April 2012 в 22:50
  • 5
    да, но моя структура каталогов обычно немного отличается - я обычно держу / src и / test в корневом каталоге. – Not_a_Golfer 20 April 2012 в 22:51

Я не уверен, почему py.test не добавляет текущий каталог в сам PYTHONPATH, но вот обходной путь (который должен выполняться из корня вашего репозитория):

python -m pytest tests/

It работает, потому что Python добавляет текущий каталог в PYTHONPATH для вас.

134
ответ дан Apteryx 15 August 2018 в 16:19
поделиться
  • 1
    Это довольно аккуратное обходное решение, например. для тестирования скриптов и модулей, которые не являются пакетами / устанавливаются! – Christoph 30 May 2016 в 08:41
  • 2
    Для этого требуется переписать относительный импорт в абсолютные, если у вас есть код для запуска приложения не на уровне, из которого вы выполняете команду. Например: project/test/all-my-tests и project/src/app.py, и из-за этого изменения необходимо косвенно вызвать app.py, используя файл __main__.py в project/src, чтобы можно было использовать вызов python -m src. Насколько я могу судить, довольно грязный материал. – Zelphir 26 September 2016 в 15:44
  • 3
    @Zelphir: Использование абсолютного импорта является рекомендуемой практикой. В Habnabit есть хорошая статья о лучших методах упаковки: blog.habnab.it/blog/2013/07/21/python-packages-and-you , а PEP8 говорит, что «неявный относительный импорт никогда не должен быть использованы и удалены в Python 3. & quot; См. python.org/dev/peps/pep-0008 . – Apteryx 4 November 2016 в 21:23
  • 4
    @Apteryx Вы имеете в виду & quot; project-absolute & quot; правильно? Потому что такие вещи, как /home/user/dev/projectxyz/src ..., будут действительно плохими и не будут работать на других машинах в большинстве случаев. Я думаю, что я имел в виду, что я должен всегда писать весь корень проекта в путь к модулю, даже если модуль находится в той же папке, что и файл. Я не знал, что это считается лучшей практикой, так что это полезная информация, спасибо. Я согласен с большинством pep8, хотя он все еще не идеален. – Zelphir 6 November 2016 в 20:44
  • 5
    @ Zelphir, да, вот что я имел в виду. Я считаю, что термин абсолютный импорт в Python всегда относится к «проект-абсолют». См. python.org/dev/peps/pep-0328/#rationale-for-absolute-imports . На самом деле, я уверен, что вы не можете импортировать из случайных, абсолютных местоположений путей, по крайней мере, используя значение по умолчанию & quot; import & quot; механизм. – Apteryx 7 November 2016 в 19:37

У меня была та же проблема. Я исправил это, добавив пустой файл __init__.py в мой каталог tests.

80
ответ дан Aron Curzon 15 August 2018 в 16:19
поделиться
  • 1
    Обратите внимание, что это NOT , рекомендованное py.test: avoid “__init__.py” files in your test directories. This way your tests can run easily against an installed version of mypkg, independently from the installed package if it contains the tests or not. SRC: pytest.org/latest/goodpractises.html – K.-Michael Aye 30 May 2014 в 22:52
  • 2
    Я пришел сюда с тем же вопросом и обнаружил, что удаление __init__.py из моего каталога тестов разрешило его для меня. – 101 13 October 2015 в 00:24
  • 3
    @ K.-MichaelAye Как вы должны импортировать модули в свои тесты, если каталог тестов не является пакетом? – mafrosis 3 November 2015 в 16:11
  • 4
    Добавление __init__.py в подкаталоги test/ делает работу с абсолютным импортом для запуска определенных тестов в этой подкаталоге с установленными модулями. Благодарю. – Bryce Guinta 9 September 2016 в 22:01
  • 5
    вы идете: doc.pytest.org/en/latest/goodpractices.html действительно легко найти с помощью google. – K.-Michael Aye 12 January 2017 в 01:56

Вы можете работать с PYTHONPATH в корне проекта

PYTHONPATH=. py.test

Или использовать pip install как редактируемый импорт

pip install -e .   # install package using setup.py in editable mode
28
ответ дан Ford Guo 15 August 2018 в 16:19
поделиться
  • 1
    Это не сработало для меня с каталогом test не в структуре каталогов src и вызовом из каталога, содержащего оба каталога test и src. – Zelphir 13 March 2016 в 23:53

conftest solution

Наименее инвазивным решением является добавление пустого файла с именем conftest.py в каталог repo/:

$ touch repo/conftest.py

Вот и все. Не нужно писать пользовательский код для искажения sys.path или не перетаскивать PYTHONPATH или помещать __init__.py в dirs, где он не принадлежит.

Каталог проекта затем:

repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
     └── test_app.py

Объяснение

pytest ищет модули conftest в тестовой коллекции для сбора пользовательских перехватчиков и приспособлений, а для импорта пользовательских объектов из них добавляется pytest родительский каталог conftest.py на sys.path.

Другие структуры проекта

Если у вас есть другая структура проекта, поместите conftest.py в корневой каталог пакета ( один, который содержит пакеты, но не является самим пакетом, поэтому не содержит __init__.py), например:

repo
├── conftest.py
├── spam
│   ├── __init__.py
│   ├── bacon.py
│   └── egg.py
├── eggs
│   ├── __init__.py
│   └── sausage.py
└── tests
     ├── test_bacon.py
     └── test_egg.py

Куда идти отсюда

Конечно, conftest - это не только некоторые файлы, которые помогают обнаружить исходный код; это то, где происходят все специфические для проекта усовершенствования pytest и настройка вашего тестового набора. pytest содержит много информации о модулях conftest, разбросанных по всем их документам ; начните с conftest.py: локальные плагины для каждого каталога

Кроме того, у SO есть отличный вопрос о модулях conftest: В py.test, что такое использование файлов conftest.py?

3
ответ дан hoefling 15 August 2018 в 16:19
поделиться

Я начал получать странные ошибки ConftestImportFailure: ImportError («Нет модуля с именем ...», когда я случайно добавил файл __init__.py в мой каталог src (который не должен был быть пакетом Python, просто контейнером всех источник).

4
ответ дан jbasko 15 August 2018 в 16:19
поделиться

Я создал это как ответ на ваш вопрос и свое собственное замешательство. Я надеюсь, что это помогает. Обратите внимание на PYTHONPATH как в командной строке py.test, так и в tox.ini.

https://github.com/jeffmacdonald/pytest_test

В частности: вы должны сообщить py.test и tox, где найти модули, которые вы включаете.

С помощью py.test вы можете сделать это:

PYTHONPATH=. py.test

И с помощью tox добавьте это в ваш tox.ini:

[testenv]
deps= -r{toxinidir}/requirements.txt
commands=py.test
setenv =
    PYTHONPATH = {toxinidir}
16
ответ дан Jeff MacDonald 15 August 2018 в 16:19
поделиться
  • 1
    Не могли бы вы дать короткое объяснение проекту, который вы связали? – JF Meier 15 July 2016 в 14:06
  • 2
    Возможно, это только я, но README в проекте довольно подробно, и мой комментарий к stackoverflow говорит, почему я создал репо. – Jeff MacDonald 15 July 2016 в 14:10
  • 3
    Хотя это не является строго необходимым, обычная политика заключается в том, чтобы иметь основной контент ответа в самом ответе, потому что он гарантирует, что ответ будет понятен через х лет с того момента, когда связанный ресурс может исчезнуть. – JF Meier 15 July 2016 в 14:13
  • 4
    Честная оценка. Я обновлю его. – Jeff MacDonald 15 July 2016 в 14:22
  • 5
    Спасибо (FYI: Я не проголосовал за вас). – JF Meier 15 July 2016 в 14:28

Я получал эту ошибку из-за чего-то еще более простого (можно даже сказать тривиально). Я не установил модуль pytest. Поэтому простой apt install python-pytest исправил это для меня.

'pytest' был бы указан в setup.py как тестовая зависимость. Убедитесь, что вы также установили требования к тестированию.

2
ответ дан pbskumar 15 August 2018 в 16:19
поделиться

Выполнить pytest как модуль с: python -m pytest tests

12
ответ дан Stefano Messina 15 August 2018 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: