2009-05-12 18 views
16

Mon SUT ressemble:Puis-je restreindre la sortie de la couverture nasale au répertoire (plutôt qu'à l'emballage)?

foo.py 
bar.py 
tests/__init__.py [empty] 
tests/foo_tests.py 
tests/bar_tests.py 
tests/integration/__init__.py [empty] 
tests/integration/foo_tests.py 
tests/integration/bar_tests.py 

Quand je lance nosetests --with-coverage, je reçois des détails pour toutes sortes de modules que je préfère ne pas tenir compte. Mais je ne peux pas utiliser l'option --cover-package=PACKAGE car foo.py & bar.py ne sont pas dans un paquet . (Voir le fil après http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html pour mes raisons pour ne pas les mettre dans un paquet.)

Puis-je limiter la production de couverture juste foo.py & bar.py?

Mise à jour - Si l'on suppose qu'il n'y a pas une meilleure réponse que Nadia « s ci-dessous, je l'ai posé une question de suivi: "How do I write some (bash) shell script to convert all matching filenames in directory to command-line options?"

+0

Avec les dernières versions du nez et de la couverture, le code dans les fichiers de test est ignoré sous le nez, vous ne devriez pas avoir besoin de spécifier le paquet à tout. – dbn

Répondre

21

Vous pouvez l'utiliser comme ceci:

--cover-package=foo --cover-package=bar 

J'ai eu un rapide coup d'oeil au code source de nez pour confirmer: This is the line

if options.cover_packages: 
     for pkgs in [tolist(x) for x in options.cover_packages]: 
+0

Je suis impressionné que vous ayez regardé la source. (J'aurais dû y penser.) Mais cela montre que j'ai besoin d'utiliser "--cover-package = foo - cover-package = bar". Si vous modifiez votre réponse, je l'accepterai (et je voterai pour cela). –

+1

Merci pour la note. J'ai corrigé la réponse. Je n'ai jamais utilisé le nez auparavant. Mais j'ai pensé que j'essaierais la question puisque personne d'autre n'a répondu. –

+0

Merci Nadia. Vous devez toujours supprimer les extensions ".py", car les arguments sont les noms de package, pas les noms de fichier. –

3

Si vous utilisez coverage:py 3.0, puis le code dans le répertoire Python est ignoré par défaut, y compris la bibliothèque standard et tous les paquets installés.

1
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed '[email protected]*/@@g'` 
+2

Ce sera bien si vous pouvez ajouter quelques détails à votre réponse. – akjoshi

12

Vous pouvez utiliser:

--cover-package=. 

ou même défini la variable

NOSE_COVER_PACKAGE=. 

testé avec nez 1.1.2

+0

Cela fonctionne. Merci. – cnu

+0

Comment peut-on atteindre la même chose avec les options de setup.cfg? –

+9

Je reçois la couverture rapportée à partir de paquets de site en utilisant ceci:/ –

2

Je ferais ceci:

nosetests --with-coverage --cover-package=foo,bar tests/* 

Je préfère cette solution aux autres suggéré; c'est simple mais vous êtes explicite sur les paquets pour lesquels vous souhaitez avoir une couverture. La réponse de Nadia implique beaucoup de frappe plus redondante, la réponse de Stuart utilise sed et crée encore un paquet en invoquant touch __init__.py et --cover-package=. ne fonctionne pas pour moi.

4

J'ai beaucoup de fichiers/paquets Python de haut niveau et trouve ennuyeux de les énumérer tous manuellement à l'aide --cover-paquet, donc j'ai fait deux alias pour moi-même. Alias ​​nosetests_cover exécutera la couverture avec tous vos fichiers Python haut niveau/packages répertoriés en package --cover. Alias ​​nosetests_cover_sort fera de même et triera également vos résultats par pourcentage de couverture.

nosetests_cover_cmd="nosetests --with-coverage --cover-erase --cover-inclusive --cover-package=\$(ls | sed -r 's/[.]py$//' | fgrep -v '.' | paste -s -d ',')" 
alias nosetests_cover=$nosetests_cover_cmd 
alias nosetests_cover_sort="$nosetests_cover_cmd 2>&1 | fgrep '%' | sort -nr -k 4" 

Notes:

  • C'est de mon .bashrc. Modifiez correctement si vous n'utilisez pas bash.
  • Ceux-ci doivent être exécutés à partir de votre répertoire de niveau supérieur. Sinon, les noms de paquets seront incorrects et la couverture échouera silencieusement à les traiter (c.-à-d.au lieu de vous dire que votre --cover-package est incorrect, il agira comme si vous n'aviez pas fourni l'option du tout).
  • J'utilise actuellement Python 2.7.6 sous Ubuntu 13.10, avec la version 1.3.0 et la version de couverture 3.7.1. C'est la seule configuration dans laquelle j'ai testé ces commandes.
  • Lors de votre utilisation, supprimez --cover-erase et --cover-inclusive s'ils ne correspondent pas à vos besoins.
  • Si vous souhaitez trier dans l'ordre normal plutôt que dans l'ordre inverse, remplacez -nr par -n dans la commande de tri.
  • Ces commandes supposent que tous vos fichiers/packages Python de niveau supérieur sont nommés sans point (autre que le point dans ".py"). Si ce n'est pas le cas, lisez la section Détails ci-dessous pour comprendre les parties de la commande, puis modifiez les commandes comme il convient.

Détails:

Je ne prétends pas que ce sont les commandes les plus efficaces pour atteindre les résultats que je veux. Ce sont juste les commandes que j'ai trouvées. = P

La principale chose à expliquer serait l'argument de --cover-package. Il construit la liste séparée par des virgules fichier Python haut niveau/noms de paquets (avec « .py » dépouillé des noms de fichiers) comme suit:

  • \$ - Protège le caractère $ dans une chaîne entre guillemets.
  • $() - Insère le résultat de la commande contenue dans.
  • ls - Répertorie tous les noms dans le répertoire courant (doit être le répertoire Python de niveau supérieur).
  • | sed -r 's/[.]py$//' - Dans la liste, remplace "foo_bar.py" par "foo_bar".
  • | fgrep -v '.' - Dans la liste, supprime tous les noms sans point (par exemple, supprime foo_bar.pyc et notes.txt).
  • | paste -s -d ',' - Modifie la liste de newline-separated à comma-separated.

Je devrais également expliquer le tri.

  • 2>&1 - Rejoint stderr et stdout.
  • | fgrep '%' - Supprime toutes les lignes de sortie sans caractère %.
  • | sort -nr -k 4 - Trie les lignes restantes dans l'ordre numérique inverse par la 4ème colonne (qui est la colonne pour le pourcentage de couverture). Si vous souhaitez une commande normale au lieu de l'ordre inverse, remplacez -nr par -n.

Espérons que ça aide quelqu'un! =)

2

Pour ceux qui tentent de le faire avec setup.cfg, voici ce qui fonctionne. J'ai eu du mal à comprendre comment spécifier plusieurs paquets.

[nosetests] 
with-coverage=1 
cover-html=1 
cover-package=module1,module2 
0

Vous pouvez améliorer la réponse acceptée comme si --cover-package=foo,bar