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