coverage.py не покрывает скрипт, если py.test выполняет его из другого каталога
я получил скрипт python, который принимает аргументы командной строки, работая с некоторыми файлами.
Я пишу успешные тесты с py.test
прохождение этого скрипта через его шаги, выполнение его с помощью subprocess.call
.
теперь я хочу проанализировать покрытие кода с помощью coverage.py
.
Покрытие, при использовании через pytest-cov
плагин (который имеет встроенную обработку подпроцессов),не видит/не покрывает мой скрипт, когда он вызывается из временного каталога тестирования создан с py.test
' s tmpdir
приспособление.
Покрытие не вижу мой скрипт, когда он вызывается в каталоге, в котором он находится (и аргумент filename указывает на удаленный путь).
в обеих ситуациях, мой тесты! Покрытие 3.6, pytest-2.3.5, pytest-cov 1.6, все из PyPi.
вопрос: Как я могу получить покрытие для распознавания моего скрипта, даже если он выполняется в другом каталоге? Это ошибка в покрытии или что-то, что просто невозможно сделать? Удивлюсь если последнее, в конце концов,tmpdir
это фондовый механизм py.тест...
минимальный пример:
у меня есть скрипт my_script.py
который просто повторяет содержимое файла arg_file.txt
поставляется с помощью аргумента командной строки. В двух разных тестах это один раз называется в tmpdir
, и один раз в месте скрипта. Оба теста проходят, но в тесте tmpdir я не получаю никакой информации о покрытии!
тест:
~/pytest_experiment$ py.test -s
=================================== test session starts ====================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.5
plugins: cov
collected 2 items
tests/test_in_scriptdir.py
set_up: In directory /tmp/pytest-52/test_10
Running in directory /home/cbuchner/pytest_experiment
Command: ./my_script.py /tmp/pytest-52/test_10/arg_file.txt
--Contents of arg_file.txt--
.
tests/test_in_tmpdir.py
set_up: In directory /tmp/pytest-52/test_11
Running in directory /tmp/pytest-52/test_11
Command: /home/cbuchner/pytest_experiment/my_script.py arg_file.txt
--Contents of arg_file.txt--
.
================================= 2 passed in 0.06 seconds =================================
покрытие:
~/pytest_experiment$ py.test --cov=my_script.py tests/test_in_scriptdir.py=================================== test session starts ====================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.5
plugins: cov
collected 1 items
tests/test_in_scriptdir.py .
--------------------- coverage: platform linux2, python 2.7.4-final-0 ----------------------
Name Stmts Miss Cover
-------------------------------
my_script 3 0 100%
================================= 1 passed in 0.09 seconds =================================
~/pytest_experiment$ py.test --cov=my_script.py tests/test_in_tmpdir.py=================================== test session starts ====================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.5
plugins: cov
collected 1 items
tests/test_in_tmpdir.py .Coverage.py warning: No data was collected.
--------------------- coverage: platform linux2, python 2.7.4-final-0 ----------------------
Name Stmts Miss Cover
---------------------------
================================= 1 passed in 0.09 seconds =================================
файлы здесь:https://gist.github.com/bilderbuchi/6412754
Edit: Interstingly, при запуске тестов покрытия с -s
, тоже есть более любопытный выход-покрытие предупреждает, что No data was collected
, когда, очевидно, он был собран, и в
3 ответов
я столкнулся с той же проблемой при вызове "py.тест-ков ...- из токсикологии. Я нашел подсказку на этой странице:http://blog.ionelmc.ro/2014/05/25/python-packaging/ даже если он не упоминает об этом явно. Использование "--develop " для tox гарантирует, что сбор данных покрытия вызывается из того же каталога, что и анализ покрытия. Этот раздел в токс.ini сделал это работать для меня, чтобы иметь тестовую среду для покрытия:
[tox]
envlist = ...,py34,cov
[testenv:cov]
# necessary to make cov find the .coverage file
# see http://blog.ionelmc.ro/2014/05/25/python-packaging/
usedevelop = true
commands = py.test --cov=<MODULE_NAME>
deps = pytest pytest-cov
это оказалось проблемой относительных путей, запутывающих покрытие, когда измеренный скрипт запускается из другого каталога. Файлы результатов покрытия оказались в этом каталоге, а не в корневом каталоге проекта.
чтобы решить эту проблему, я перестал использовать pytest-cov
, и используется pure coverage
вместо. Я использовал полные пути вместо относительных путей, где это уместно.
так, например,
определите переменную среды, необходимую для включения покрытия подпроцесса через export COVERAGE_PROCESS_START=/full/path/to/.coveragerc
.
В .coveragerc
, файл результата покрытия указывается через
[run]
data_file = /full/path/to/.coverage
и ни --source
и --include
параметры также должны использовать полные пути.
Тогда можно было получить правильное измерение покрытия.
другой вариант с tox-установить PYTHONPATH
на tox.ini
:
[testenv]
setenv =
PYTHONPATH = {toxinidir}
commands =
pytest --cov=<your package>
- codecov