1

ich für eine lange Zeit gesucht und gefunden überraschenderweise keine befriedigende Antwort.Python Einheit Testabdeckung für mehrere Module

Ich habe mehrere Module/Dateien in meinem Python-Projekt, das ich Unit-Tests geschrieben unittest für die Verwendung. Die Struktur ist so, dass ich Produktionsmodule module_A.py und module_B.py in einem Verzeichnis (sagen wir myproject/production) und entsprechende Test-Dateien test_module_A.py und test_module_B.py in einem Geschwister-Verzeichnis (zB myproject/tests) haben.

Jetzt habe ich coverage.py installiert und wollen alle Tests mit dem Projekt (dh alle .py -Dateien mit dem Präfix test_ aus dem tests Verzeichnis) und erhalten eine Abdeckung Bericht zeigt die Abdeckung für alle Produktions-Modulen zugeordnet laufen (module_A.py und module_B.py).

Ich fand heraus, dass ich dies tun können Sie die folgenden Befehle aus dem myproject/tests Verzeichnis, indem Sie:

  • coverage erase
  • coverage run -a --source myproject.production test_module_A.py
  • coverage run -a --source myproject.production test_module_B.py
  • coverage report

Das gibt mir dieser schöne Tisch mit Alle meine Produktionsmodule aufgelistet und ihre Abdeckung Ergebnisse. So weit, ist es gut.

Aber kann ich dies tun, mit nur einem Befehl? Angenommen, ich habe nicht 2, sondern 20 oder 200 Tests, die ich in einen Bericht aufnehmen möchte, erscheint es "lächerlich", dies "von Hand" zu tun.

Es muss einen Weg geben, dies zu automatisieren, aber ich kann es nicht zu finden scheinen. Sicherlich könnte ein Shell-Script das tun, aber das ist ziemlich ungeschickt. Ich denke an so etwas wie unittest discover, aber für coverage.py dies scheint nicht zu funktionieren.

Oder könnte ich erreichen dies irgendwie den coverage-API? Bis jetzt hatte ich kein Glück, es zu versuchen.

.

LÖSUNG: (Kredit an Herrn Ned Batchelder)

Von myproject/tests Verzeichnis Lauf:

coverage run --source myproject.production -m unittest discover && coverage report

Eine Linie, genau das tun, was nötig war.

+0

Sie nose2 wissen Sie, könnte ein Versuch sein. https://github.com/nose-devs/nose2 – yacc

Antwort

1

Dies sollte es tun:

coverage.py run -m unittest discover 
+0

Genau das, was ich gesucht habe. Ich wusste, dass ich gerade etwas an deinem Paket vermisste. Vielen Dank! Die vollständige Lösung für mich war 'coverage run --source myproject.production -m unittest discover && coverage report'. Lief wie am Schnürchen. – JohnGalt