Kann ich die Ausgabe der Nasenabdeckung auf ein Verzeichnis (statt auf ein Paket) beschränken?

StackOverflow https://stackoverflow.com/questions/855114

Frage

Mein SUT sieht so aus:

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

Wenn ich renne nosetests --with-coverage, Ich bekomme Details für alle möglichen Module, die ich lieber ignorieren würde.Aber ich kann das nicht verwenden--cover-package=PACKAGE Option, weil foo.py & bar.py sind nicht in einem Paket.(Siehe den Thread danachhttp://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.htmlaus meinen Gründen, sie nicht in ein Paket zu packen.)

Kann ich die Abdeckungsausgabe nur auf foo.py und bar.py beschränken?

Aktualisieren - Vorausgesetzt, es gibt keine bessere Antwort als Nadiaist unten, ich habe eine Folgefrage gestellt: „Wie schreibe ich ein (Bash-)Shell-Skript, um alle übereinstimmenden Dateinamen im Verzeichnis in Befehlszeilenoptionen umzuwandeln?“

War es hilfreich?

Lösung

Sie können es wie folgt verwendet werden:

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

Ich hatte einen kurzen Blick auf die Nase Quellcode zu bestätigen:

Andere Tipps

Sie können mit:

--cover-package=.

oder sogar Umgebungsvariable

NOSE_COVER_PACKAGE=.

Getestet mit Nase 1.1.2

Ich habe viele Python-Dateien/-Pakete der obersten Ebene und finde es nervig, sie alle manuell mit --cover-package aufzulisten, also habe ich zwei Aliase für mich erstellt.Alias nosetests_cover führt eine Abdeckung mit allen Ihren Python-Dateien/Paketen der obersten Ebene durch, die in --cover-package aufgeführt sind.Alias nosetests_cover_sort wird das Gleiche tun und Ihre Ergebnisse zusätzlich nach dem Abdeckungsprozentsatz sortieren.

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"

Anmerkungen:

  • Dies ist aus meiner .bashrc-Datei.Ändern Sie entsprechend, wenn Sie Bash nicht verwenden.
  • Diese müssen von Ihrem obersten Verzeichnis aus ausgeführt werden.Andernfalls sind die Paketnamen falsch und die Abdeckung kann sie stillschweigend nicht verarbeiten (d. h.Anstatt Ihnen mitzuteilen, dass Ihr --cover-package falsch ist, verhält es sich so, als hätten Sie die Option überhaupt nicht angegeben.
  • Ich verwende derzeit Python 2.7.6 auf Ubuntu 13.10, mit Nose-Version 1.3.0 und Coverage-Version 3.7.1.Dies ist das einzige Setup, in dem ich diese Befehle getestet habe.
  • Entfernen Sie bei Ihrer Verwendung --cover-erase und --cover-inclusive, wenn diese nicht Ihren Anforderungen entsprechen.
  • Wenn Sie in normaler Reihenfolge statt in umgekehrter Reihenfolge sortieren möchten, ersetzen Sie -nr mit -n im Sortierbefehl.
  • Bei diesen Befehlen wird davon ausgegangen, dass alle Ihre Python-Dateien/-Pakete der obersten Ebene ohne einen Punkt benannt sind (außer dem Punkt in „.py“).Wenn dies auf Sie nicht zutrifft, lesen Sie den Abschnitt „Details“ unten, um die Befehlsteile zu verstehen, und ändern Sie dann die Befehle entsprechend.

Einzelheiten:

Ich behaupte nicht, dass dies die effizientesten Befehle sind, um die gewünschten Ergebnisse zu erzielen.Das sind nur die Befehle, die mir zufällig eingefallen sind.=P

Das Wichtigste, was es zu erklären gilt, wäre das Argument für --cover-package.Es erstellt die durch Kommas getrennte Liste der Python-Datei-/Paketnamen der obersten Ebene (wobei „.py“ aus den Dateinamen entfernt wird) wie folgt:

  • \$ -- Entkommt dem $ Zeichen in einer Zeichenfolge in doppelten Anführungszeichen.
  • $( ) – Fügt das Ergebnis des darin enthaltenen Befehls ein.
  • ls – Listet alle Namen im aktuellen Verzeichnis auf (muss das Python-Verzeichnis der obersten Ebene sein).
  • | sed -r 's/[.]py$//' – Ersetzt in der Liste „foo_bar.py“ durch „foo_bar“.
  • | fgrep -v '.' – Entfernt in der Liste alle Namen ohne Punkt (z. B.Entfernt foo_bar.pyc und NOTES.txt).
  • | paste -s -d ',' – Ändert die Liste von durch Zeilenumbrüche getrennter Liste in durch Kommas getrennte Liste.

Ich sollte auch die Sortierung erklären.

  • 2>&1 – Verbindet stderr und stdout.
  • | fgrep '%' – Entfernt alle Ausgabezeilen ohne a % Charakter.
  • | sort -nr -k 4 – Sortiert die verbleibenden Zeilen in umgekehrter numerischer Reihenfolge nach der 4. Spalte (die Spalte für den Abdeckungsprozentsatz).Wenn Sie die normale Reihenfolge statt der umgekehrten Reihenfolge wünschen, ersetzen Sie sie -nr mit -n.

Hoffe, das hilft jemandem!=)

Wenn Sie Abdeckung: py 3.0 , dann Code in dem Python-Verzeichnis standardmäßig ignoriert, einschließlich der Standard-Bibliothek und alle installierten Pakete.

Ich würde dies tun:

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

Ich ziehe diese Lösung zu den anderen vorgeschlagen; es ist einfach, aber Sie sind explizit darüber, welche Pakete Sie wollen für die Berichterstattung haben. Nadjas Antwort beinhaltet viel mehr redundante Typisierung, Stuart Antwort verwendet sed und schafft noch ein Paket von touch __init__.py Aufrufen und --cover-package=. nicht für mich arbeiten.

Für jeden, der versucht, dies zu tun mit setup.cfg, die folgenden Werke. Ich hatte einige Probleme, herauszufinden, wie mehrere Pakete angeben.

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

Sie können die akzeptierte Antwort wie so --cover-package=foo,bar verbessern

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top