hat derzeit ein Projekt konfiguriert wie so Berichterstattung über Djangos verwalten Befehl auszuführen:Wie Deckung testen richtig mit Django + Nose
Dies wie folgt in einem Bericht ergibt:
Name Stmts Miss Branch BrMiss Cover Missing
--------------------------------------------------------------------------
notify.decorators 4 1 0 0 75% 4
notify.handlers 6 1 2 0 88% 11
notify.notification_types 46 39 2 0 19% 8-55, 59, 62, 66
notify.notifications 51 51 0 0 0% 11-141
--------------------------------------------------------------------------
TOTAL 107 92 4 0 17%
Es gibt jedoch ein Problem mit diesem Bericht. Es ist falsch. Coverage markiert Linien fehlen, obwohl sie tatsächlich von Tests abgedeckt werden. wenn ich die Tests über nosetests
statt Djangos verwalten Befehl ich folgenden korrekten Bericht zum Beispiel erhalten laufen:
Name Stmts Miss Branch BrMiss Cover Missing
-----------------------------------------------------------------------------
notify.decorators 4 0 0 0 100%
notify.handlers 6 0 2 0 100%
notify.notification_types 46 0 2 0 100%
notify.notifications 51 25 0 0 51% 13, 18, 23, 28, 33, 38, 43, 48, 53, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 116, 121, 126, 131, 136, 141
-----------------------------------------------------------------------------
TOTAL 107 25 4 0 77%
Google führte mich in die FAQ Berichterstattung Website http://nedbatchelder.com/code/coverage/faq.html
F: Warum die Körper von Funktionen (oder Klassen) zeigen als ausgeführt, aber die def Zeilen nicht?
Dies geschieht, weil die Erfassung gestartet wird, nachdem die Funktionen definiert wurden. Die Definitionszeilen werden ohne Coverage-Messung ausgeführt, dann wird die Coverage gestartet und die Funktion aufgerufen. Dies bedeutet, dass der Körper gemessen wird, aber die Definition der Funktion selbst nicht.
Um dies zu beheben, starten Sie die Abdeckung früher. Wenn Sie Ihr Programm mit Coverage über die Befehlszeile ausführen, wird Ihr gesamtes Programm überwacht. Wenn Sie die API verwenden, müssen Sie vor dem Importieren der Module, die Ihre Funktionen definieren, coverage.start() aufrufen.
Die Frage ist, kann ich die Berichterstattung Berichte ordnungsgemäß über Django verwalten Befehl ausführen? Oder muss ich umgehen umgehen, um die Situation zu vermeiden, in der die Abdeckung gestartet wird, nachdem die "fehlenden" Zeilen ausgeführt wurden?
Dies ist die praktischste Lösung (obwohl hacky) und funktioniert perfekt und transparent mit Django-Nase – danigosa