coverage.py ne couvre pas le script si py.test l'exécute à partir d'un autre répertoire
j'ai un script python qui prend des arguments en ligne de commande, en travaillant avec certains fichiers.
J'écris des tests réussis avec py.test
mettre ce script à son rythme, l'exécuter avec subprocess.call
.
Maintenant, je veux analyser la couverture de code avec coverage.py
.
La couverture, lorsqu'il est utilisé via le pytest-cov
plugin (qui a sous-processus de manutention intégré), ne voit pas / ne couvre pas mon script quand il est appelé à partir d'un répertoire de test temporaire créé avec py.test
tmpdir
luminaire.
Couverture voir mon script quand il est appelé dans le répertoire où il réside (et l'argument filename pointe vers un chemin distant).
Dans les deux cas, mon tests réussis! Couverture 3.6, pytest-2.3.5, pytest-cov 1.6, tous de PyPi.
Question: Comment puis-je obtenir la couverture pour reconnaître mon script même s'il est exécuté dans un autre répertoire? Est-ce un bug dans la couverture, ou quelque chose qui n'est tout simplement pas possible à faire? Serait surpris si ce dernier, après tous, tmpdir
est un mécanisme stock de py.test...
un Minimum de exemple:
j'ai un script my_script.py
qui fait juste écho au contenu d'un fichier arg_file.txt
fourni par l'intermédiaire d'un argument en ligne de commande. Dans deux tests différents, ceci est une fois appelé dans un tmpdir
, et une fois dans le script. Les deux tests sont réussis, mais dans le test tmpdir, Je n'obtiens aucune information de couverture!
Test:
~/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 =================================
Couverture:
~/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 =================================
Les fichiers sont ici: https://gist.github.com/bilderbuchi/6412754
Edit: Interstingly, lors de l'exécution de la couverture des tests avec -s
, aussi, il y a de plus curieux de sortie - couverture avertit que No data was collected
, quand évidemment il a été recueilli, et dans le tmpdir
tester l'avertit que Module my_script.py was never imported.
??
~/pytest_experiment$ py.test -s --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
set_up: In directory /tmp/pytest-63/test_10
Running in directory /home/cbuchner/pytest_experiment
Command: ./my_script.py /tmp/pytest-63/test_10/arg_file.txt
--Contents of arg_file.txt--
Coverage.py warning: No data was collected.
.
--------------------- 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 -s --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
set_up: In directory /tmp/pytest-64/test_10
Running in directory /tmp/pytest-64/test_10
Command: /home/cbuchner/pytest_experiment/my_script.py arg_file.txt
--Contents of arg_file.txt--
Coverage.py warning: Module my_script.py was never imported.
Coverage.py warning: No data was collected.
Coverage.py warning: Module my_script.py was never imported.
Coverage.py warning: No data was collected.
.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 =================================
3 réponses
j'ai rencontré le même problème en appelant "py.test -- cov ..."à partir de tox. J'ai trouvé une astuce sur cette page: http://blog.ionelmc.ro/2014/05/25/python-packaging/ même si elle ne mentionne pas explicitement. L'utilisation de" --develop " pour tox permettra de s'assurer que la collecte des données de couverture est appelée à partir du même répertoire que l'analyse de couverture. Cette section en tox.ini fait le travail pour moi d'avoir un environnement de test pour la couverture:
[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
il s'est avéré qu'il s'agissait d'un problème de couverture de chemins relatifs confus lorsque le script mesuré est lancé à partir d'un autre répertoire. Les fichiers de résultats de couverture ont fini dans ce répertoire, au lieu du répertoire racine du projet.
pour résoudre ce problème, j'ai arrêté d'utiliser pytest-cov
, et utilisé pur coverage
à la place. J'ai utilisé des chemins complets au lieu de chemins relatifs chaque fois que cela était pertinent.
Si, par exemple,
définissez la variable d'environnement nécessaire pour activer la couverture de sous-processus via export COVERAGE_PROCESS_START=/full/path/to/.coveragerc
.
Dans le .coveragerc
, le fichier de résultat de la couverture est spécifié via
[run]
data_file = /full/path/to/.coverage
et --source
et --include
les options doivent utiliser des chemins complets, aussi.
Il était alors possible d'obtenir une mesure correcte de la couverture.
une autre option avec tox est de définir le PYTHONPATH
tox.ini
:
[testenv]
setenv =
PYTHONPATH = {toxinidir}
commands =
pytest --cov=<your package>
- codecov