Ich versuche herauszufinden, wie ich meine Tests einschränken kann, so dass der Coverage-Reporter nur eine Funktion berücksichtigt, wenn ein Test speziell für diese Funktion geschrieben wurde.
Das folgende Beispiel aus dem PHPUnit-Dokument zeigt ziemlich gut was Ich versuche zu erreichen:
%Vor%Die @covers-Annotation kann im Testcode verwendet werden, um anzugeben, welche Methode (n), die eine Testmethode testen möchte:
Wenn der obige Test ausgeführt würde, wird nur die Funktion getBalance
als bedeckt und keine andere markiert.
Jetzt einige aktuelle Codebeispiele aus meinen JavaScript-Tests. Dieser Test zeigt das unerwünschte Verhalten, das ich loswerden möchte:
%Vor% Dieser Test markiert die Funktion getDateRange
als bedeckt, aber auch jede andere Funktion, die von innen getDateRange
aufgerufen wird. Wegen dieser Eigenart ist die tatsächliche Codeabdeckung für mein Projekt wahrscheinlich viel niedriger als die berichtete Codeabdeckung.
Wie kann ich dieses Verhalten stoppen? Gibt es eine Möglichkeit, Karma / Jasmine / Istanbul so zu verhalten, wie ich es möchte, oder muss ich zu einem anderen Framework für JavaScript-Tests wechseln?
Ich sehe keinen besonderen Grund für das, was Sie fragen. Ich würde sagen, wenn Ihr Test verursacht, dass eine verschachtelte Funktion aufgerufen wird, dann wird die Funktion auch abgedeckt. Sie testen dieses Codeteil tatsächlich indirekt. Warum sollte es also nicht in die Codedeckungsmetriken aufgenommen werden? Wenn die innere Funktion einen Fehler enthält, kann Ihr Test ihn auch dann erfassen, wenn er dies nicht direkt testet.
Sie können Ihren Code mit speziellen Kommentaren kommentieren, damit Istanbul bestimmte Wege ignoriert: Ссылка aber das ist mehr für das Gegenteil, denke ich, die Abdeckung nicht zu verringern, wenn Sie wissen, dass Sie keinen bestimmten Ausführungspfad abdecken wollen, vielleicht weil es zu schwer wäre, einen Testfall dafür zu schreiben.
Wenn Sie sich um Ihre "low level" -Funktionen kümmern, die isoliert getestet werden, dann stellen Sie sicher, dass Ihr Code modular aufgebaut ist, so dass Sie diese zuerst selbst testen können. Sie können auch verschiedene Testlaufkonfigurationen einrichten, sodass Sie über eine Suite verfügen, die nur die grundlegende Logik testet und die Abdeckung dafür meldet.
Wie in den Kommentaren vorgeschlagen, können Spott- und Abhängigkeitsinjektionen helfen, Ihre Tests gezielter zu gestalten, aber Sie möchten grundsätzlich immer Tests auf hoher Ebene durchführen, bei denen Sie die Integrationen dieser Teile zusammen überprüfen. Wenn Sie alles verspotten, dann testen Sie nie die tatsächlichen Stücke, die zusammenarbeiten.
Tags und Links javascript unit-testing code-coverage jasmine istanbul