2015-04-04 5 views
8

Meine Tests führen eindeutig jede Funktion aus, und es gibt auch keine ungenutzten Importe. Doch nach der Berichterstattung Bericht, 62% des Codes wurde nie in der folgenden Datei ausgeführt:Flaschentest - Warum schließt die Abdeckung Importanweisungen und Dekoratoren aus?

enter image description here

Kann jemand bitte darauf hinweisen, was könnte ich tun falsch sein?

Hier ist, wie ich die Testsuite zu initialisieren und der Abdeckung:

cov = coverage(branch=True, omit=['website/*', 'run_test_suite.py']) 
    cov.start() 

    try: 
     unittest.main(argv=[sys.argv[0]]) 
    except: 
     pass 

    cov.stop() 
    cov.save() 

    print "\n\nCoverage Report:\n" 
    cov.report() 

    print "HTML version: " + os.path.join(BASEDIR, "tmp/coverage/index.html") 
    cov.html_report(directory='tmp/coverage') 
    cov.erase() 

Antwort

7

Dies ist die dritte Frage in den coverage.py FAQ:

F: Warum die Leichen von Funktionen zu tun (oder Klassen) anzeigen wie ausgeführt, aber die def Zeilen nicht?

Dies geschieht, weil die Abdeckung gestartet wird, nachdem die Funktionen definiert wurden. Die Definitionszeilen werden ohne Überdeckung Messung ausgeführt, dann wird die Überdeckung gestartet, dann wird die Funktion aufgerufen. Dies bedeutet, dass der Körper gemessen wird, aber die Definition der Funktion selbst ist nicht.

Um dies zu beheben, starten Sie die Abdeckung früher. Wenn Sie die Befehlszeile zu führen Sie Ihr Programm mit Abdeckung, dann wird Ihr gesamtes Programm überwacht werden. Wenn Sie die API verwenden, müssen Sie vor dem Importieren der Module, die Ihre Funktionen definieren, coverage.start() aufrufen.

Die einfachste Sache zu tun ist, Ihnen Tests unter Abdeckung laufen:

$ coverage run -m unittest discover 

Skript Ihrer individuellen Tests hinaus, was die Abdeckung Befehlszeile, wird es tun würde, nicht viel tun, nur einfacher zu bedienen sein die Befehlszeile.