coverage.py ne couvre pas les script si py.le test s'exécute à partir d'un autre répertoire
J'ai un script python qui prend en arguments de ligne de commande, en travaillant avec certains fichiers.
Je suis en train d'écrire réussir les tests avec py.test
mettre ce script à l'épreuve, en l'exécutant 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/la couverture de mon script lorsqu'il est appelé à partir d'un temporaire de test répertoire créé avec py.test
's tmpdir
luminaire.
Couverture ne voir mon script lorsqu'elle est appelée dans le répertoire dans lequel il réside (et l'argument filename points d'un chemin d'accès à distance).
Dans les deux cas, mon tests passent! Couverture 3.6, pytest-2.3.5, pytest-cov 1.6, tous de PyPi.
Question: Comment puis-je obtenir une couverture de reconnaître mon script, même si elle est exécutée dans un autre répertoire? Est-ce un bug dans la couverture ou quelque chose qui est tout simplement pas possible de le faire? Serais surpris si ce dernier, après tout, tmpdir
est un mécanisme de stock de py.test...
Exemple Minimal:
J'ai un script my_script.py
qui vient d'échos le contenu d'un fichier arg_file.txt
fourni via l'argument de ligne de commande. Dans les deux tests différents, c'est une fois appelé dans un tmpdir
, et une fois dans le script de l'emplacement. Les deux tests passent, mais le dans le tmpdir test, je n'ai pas de renseignements sur la 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
test 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 =================================
- Désolé pour la non-réponse. Mais il me semble que vous aurez à regarder à l'intérieur de py.test pour voir la spécialité de tmpdir luminaire. Si dans une sorte de gestionnaire de contexte, la couverture est appelé après sa sortie (ou quelque chose comme ça).
- Merci. Je suis déjà en contact avec la couverture de développeur, je vais poster un résumé une fois que nous sommes arrivés au bas de cette.
- si vous êtes toujours intéressés à obtenir ce de travailler avec pytest-cov n'hésitez pas à ouvrir un sujet sur github.com/schlamar/pytest-cov. Je suis le nouveau responsable de pytest-cov et sont susceptibles de vous aider.
- merci, mais j'ai déjà travaillé autour de ce problème de mon côté (voir ma réponse ci-dessous). Alors que je le feriez normalement (correctement) ouvrir un rapport de bug à ce sujet, je n'ai pas le temps de s'en préoccuper et de le tester à nouveau et après une repro de la procédure, désolé.
- Je viens de vérifier, et j'ai encore de la repro à l'aide de la procédure ci-dessus, mais je ne suis même pas sûr si c'est en fait une légère erreur de l'utilisateur, lors de l'utilisation de la couverture pour couvrir truc appelé par
subprocess
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré le même problème lors de l'appel de "py.test --cov ..." 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'aide de "--développer" pour tox sera assurez-vous que la couverture de la collecte des données est appelée à partir du même répertoire que l'analyse de couverture.
Cette section tox.ini fait le travail pour moi d'avoir un environnement de test pour la couverture:
Ce qui s'est avéré être un problème de chemin relatif à confusion couverture lorsque la valeur mesurée script est exécuté à partir d'un autre répertoire. La couverture des fichiers résultat fini dans ce répertoire, au lieu de le répertoire racine du projet.
Pour résoudre ce problème, j'ai cessé d'utiliser
pytest-cov
, et utilisé purcoverage
à la place. J'ai utilisé les chemins d'accès complets au lieu des chemins relatifs là où c'est pertinent.Par exemple
définir la variable d'environnement nécessaires pour activer les sous-processus de la couverture par
export COVERAGE_PROCESS_START=/full/path/to/.coveragerc
.Dans le
.coveragerc
, la couverture résultat de fichier est spécifié viaet tout
--source
et--include
options devraient utiliser des chemins d'accès complets, trop.Ensuite, il a été possible de corriger la mesure de la couverture.
os.path.abspath()
. En tout cas, je ne sais pas si c'est encore un problème, mon vieux code que j'ai utilisé ce n'est pas un chemin complet dans.covragerc
.Une autre option avec tox est de définir la
PYTHONPATH
danstox.ini
:[testenv]
setenv =
PYTHONPATH = {toxinidir}
commands =
pytest --cov=<your package>
- codecov
selon ce blog:
https://thomas-cokelaer.info/blog/2017/01/pytest-cov-collects-no-data-on-travis/
Vous devez ajouter tous les
__init__.py
fichiers danstests
dossier! Cette solution fonctionne pour moi.