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
InformationsquelleAutor Christoph | 2013-09-02