Question

Mon SUT ressemble à :

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 cours nosetests --with-coverage, j’obtiens des détails pour toutes sortes de modules que je préfère ignorer.Mais je ne peux pas utiliser le--cover-package=PACKAGE option parce que foo.py & bar.py ne sont pas dans un colis.(Voir le fil aprèshttp://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.htmlpour mes raisons de ne pas les mettre dans un paquet.)

Puis-je limiter la sortie de couverture à foo.py et bar.py ?

Mise à jour - En supposant qu'il n'y a pas de meilleure réponse que Nadiaci-dessous, j'ai posé une question complémentaire : "Comment puis-je écrire un script shell (bash) pour convertir tous les noms de fichiers correspondants dans le répertoire en options de ligne de commande ?"

Était-ce utile?

La solution

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:

Autres conseils

Vous pouvez utiliser:

--cover-package=.

ou même variable d'environnement ensemble

NOSE_COVER_PACKAGE=.

Testé avec le nez 1.1.2

J'ai beaucoup de fichiers/packages Python de premier niveau et je trouve ennuyeux de tous les lister manuellement à l'aide de --cover-package, j'ai donc créé deux alias pour moi-même.Alias nosetests_cover exécutera une couverture avec tous vos fichiers/packages Python de niveau supérieur répertoriés dans --cover-package.Alias nosetests_cover_sort fera de même et triera en outre 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"

Remarques:

  • Ceci vient de mon fichier .bashrc.Modifiez de manière appropriée 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 des packages seront incorrects et la couverture échouera silencieusement à les traiter (c'est-à-direau 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 sur Ubuntu 13.10, avec la version nose 1.3.0 et la version de couverture 3.7.1.C'est la seule configuration dans laquelle j'ai testé ces commandes.
  • Dans votre utilisation, supprimez --cover-erase et --cover-inclusive s'ils ne correspondent pas à vos besoins.
  • Si vous souhaitez trier dans l'ordre normal au lieu de l'ordre inverse, remplacez -nr avec -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 pour vous, lisez la section Détails ci-dessous pour comprendre les parties des commandes, puis modifiez les commandes selon vos besoins.

Détails:

Je ne prétends pas que ce soient les commandes les plus efficaces pour obtenir les résultats souhaités.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 des noms de fichiers/packages Python de niveau supérieur (avec ".py" supprimé des noms de fichiers) comme suit :

  • \$ -- S'échappe du $ caractère dans une chaîne entre guillemets doubles.
  • $( ) -- Insère le résultat de la commande contenue à l'intérieur.
  • ls -- Répertorie tous les noms du répertoire actuel (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 ex.supprime foo_bar.pyc et notes.txt).
  • | paste -s -d ',' -- Change la liste de séparation par nouvelle ligne en séparation par virgule.

Je devrais aussi expliquer le tri.

  • 2>&1 -- Rejoint stderr et stdout.
  • | fgrep '%' -- Supprime toutes les lignes de sortie sans % personnage.
  • | sort -nr -k 4 -- Trie les lignes restantes dans l'ordre numérique inverse selon la 4ème colonne (qui est la colonne du pourcentage de couverture).Si vous souhaitez un ordre normal au lieu d'un ordre inversé, remplacez -nr avec -n.

J'espère que cela aide quelqu'un !=)

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

Je ferais ceci:

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

Je préfère cette solution aux autres suggéré; il est simple et vous êtes explicites sur les paquets que vous souhaitez avoir une couverture pour. 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 Ne fonctionne pas --cover-package=. pour moi.

Pour tous ceux qui essaient de le faire avec setup.cfg, les travaux suivants. J'ai eu quelques difficultés à trouver comment spécifier plusieurs paquets.

[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top