Separate Code-Coverage-Berichte für Unit- und Integrationstests oder ein Bericht für beide?

10

Sollte es einen separaten Code-Coverage-Bericht für Unit- und Integrationstests oder einen Code-Coverage-Bericht für beide geben?

Der Gedanke dahinter ist, dass wir durch die Codeabdeckung sicherstellen können, dass unser Code so weit wie möglich durch Tests abgedeckt wurde (so viel wie eine Maschine jetzt sowieso kann).

Ein separater Bericht ist für uns bequemer zu wissen, was nicht durch Komponententests abgedeckt wurde und was nicht durch Integrationstests abgedeckt wurde. Auf diese Weise können wir jedoch den Prozentsatz der Gesamtabdeckung nicht sehen.

Marios
quelle
1
Ich werde für separate plump. Ich denke nicht, dass es ausreicht zu sagen "dieser Code wurde getestet", ohne zu wissen, wie er getestet wurde. Unit-Test und Integrationstest üben denselben Code aus, jedoch auf unterschiedliche Weise. Beispielsweise werden beim Unit-Test möglicherweise Randfallwerte verwendet, während bei der Integration Mittelwerte ("realistische") verwendet werden. Gleicher Code, sehr unterschiedliche Tests.
Mawg sagt, Monica
Genau aus diesem Grund führen wir Unit-Tests und Integrationstests in separaten Bibliotheken durch.
Robbie Dee
Dies hängt von den Anforderungen des Kunden ab.
Mouviciel

Antworten:

12

Vor allem müssen Sie eine kombinierte (Gesamt-) Abdeckung haben und analysieren. Wenn Sie daran denken, ist dies der natürlichste Weg, um Ihre Risiken richtig zu priorisieren und Ihre Testentwicklungsbemühungen zu konzentrieren.

In Kombination Berichterstattung zeigen Sie , was Code durch Tests nicht abgedeckt überhaupt , ist also höchst riskant und Notwendigkeit, zuerst untersucht werden. Separate Abdeckungsberichte helfen hier nicht weiter, da Sie damit nicht herausfinden können, ob der Code auf andere Weise oder überhaupt nicht getestet wurde.


Eine separate Abdeckungsanalyse kann ebenfalls nützlich sein, sollte jedoch nach Abschluss der kombinierten Analyse durchgeführt werden und vorzugsweise auch Ergebnisse der Analyse der kombinierten Abdeckung beinhalten.

Der Zweck der separaten Abdeckungsanalyse unterscheidet sich vom kombinierten. Eine separate Abdeckungsanalyse hilft dabei, das Design Ihrer Testsuite zu verbessern, im Gegensatz zur Analyse der kombinierten Abdeckung, mit der entschieden werden soll, welche Tests entwickelt werden sollen, egal was passiert.

"Oh, diese Lücke wird nicht abgedeckt, nur weil wir vergessen haben, diesen einfachen Einheitentest (Integrationstest) in unsere Einheitensuite (Integrationssuite) aufzunehmen. Fügen wir ihn hinzu." Eine separate Abdeckung und Analyse ist hier am nützlichsten, da man zusammen Lücken verbergen könnte dass Sie in bestimmten Suite abdecken möchten.

Aus der obigen Perspektive ist es jedoch immer noch wünschenswert, auch Ergebnisse einer kombinierten Abdeckungsanalyse zu haben, um schwierigere Fälle zu analysieren. Denken Sie daran, mit diesen Ergebnissen könnten Ihre Testentwicklungsentscheidungen effizienter sein, da Sie Informationen über "Partner" -Testsuiten haben.

"Hier gibt es eine Lücke, aber die Entwicklung eines Unit- (Integrations-) Tests zur Abdeckung wäre wirklich umständlich. Welche Optionen haben wir? Lassen Sie uns die kombinierte Abdeckung überprüfen ... oh, sie wird bereits an anderer Stelle behandelt, das heißt, sie wird in unserer Suite nicht abgedeckt." t kritisch wichtig. "

Mücke
quelle
5

Sie erwähnen Ihr Testwerkzeug nicht. Viele haben "Kombinations" -Funktionen, mit denen Sie die Ergebnisse mehrerer Läufe oder Suiten zusammenfassen können. Wenn Sie eine aggregierte Abdeckungsmetrik wünschen, untersuchen Sie die Kombinationsfunktion in Ihrem Abdeckungstool.


Können wir jetzt über den Elefanten im Raum sprechen?

Da ist kein Löffel. Und es gibt keinen "Prozentsatz der Gesamtabdeckung". Zumindest kein einfacher.

Der Abdeckungsprozentsatz ist eine leicht verständliche Metrik, die zum besseren Verständnis des Umfangs, der Tiefe und des Bereichs von Testsuiten dargestellt wird. Aber wie bei jedem einfachen Benchmark ist es sehr einfach, sich als magischer Talisman des "vollständigen Testens" auf diesen Wert zu fixieren .

Angenommen, Sie haben den Ruhm einer "100% igen Testabdeckung" erreicht. Yay! Aber was heißt das? 100% der Codezeilen werden getestet, oder? Was ist dann mit dieser Zeile?

launch_missile = launch_authorized and launch_cmd_given else previous_launch_status

Das "Abdecken" dieser Linie bedeutet etwas - aber nicht viel, da es eine Vielzahl von Bedingungen gibt, die Trueoder Falsemit einiger Wahrscheinlichkeit vorliegen , aber es ist unwahrscheinlich, dass Sie alle Kombinationen dieser Bedingungen getestet haben. Selbst wenn diese Linie ein Dutzend Mal abgedeckt wird, wenn eine der Bedingungen relativ ungewöhnlich ist, haben Sie nicht annähernd alle tatsächlichen Ergebnisse getestet, die in der Praxis auftreten könnten. Um dies klarer zu machen, ein synthetischeres Beispiel:

engage_laser = (laser_armed and safety_disengaged) or random.random() < 0.0000003

Wie oft müssten Sie diese Linie abdecken, um sie wirklich ausführlich zu testen? Wie oft müssten Sie es abdecken, um es in Kombination mit allen anderen Variablen im Programm (mit ihren eigenen, möglicherweise ähnlich seltenen) Wahrscheinlichkeiten zu testen?

Ich sage nicht, dass Abdeckungsmetriken nutzlos sind. Sie sind wirklich großartig . Sie konzentrieren sich auf eines der Hauptprobleme: Wie umfassend wird mein Softwaresystem getestet? Sie helfen dabei, von "Wir haben einige Tests" zu "Wir haben gründlich getestet" zu wechseln.

Während Sie jedoch an "kombinierten Bewertungen" arbeiten, ist die Realität, dass Ihre Bewertung in der Regel eher für "Anweisungsabdeckung" als für "Bedingung", "Prädikat" oder "Pfadabdeckung" gilt . Unabhängig von der Anzahl Ihrer aggregierten Bewertungen ist es unwahrscheinlich, dass Sie ein genaues Bild davon erhalten, wie viele potenzielle Status und Statuskombinationen Ihres Programms getestet werden. Während Sie daran arbeiten, Ihren Abdeckungsprozentsatz zu erhöhen, sollten Sie auch Ihre Prädikatabdeckung messen. Sie erhalten eine realistischere - und fast immer ernüchternde - Sicht auf die Testausdehnung.

Jonathan Eunice
quelle
Die Art der verwendeten Abdeckungsmetriken scheint völlig orthogonal zur Frage zu sein. Jede Metrik kann für Unit-Test oder Integrationstest oder beides berechnet werden
jk.
Sicher. Auf die gleiche Weise können Sie "Meilen pro Gallone" (verbrauchter Kraftstoff) unabhängig von der Art des verwendeten Fahrzeugs und orthogonal dazu berechnen. Ich würde argumentieren, dass das Zusammenführen der Ergebnisse von Booster-Raketen mit schwerem Hub, Langstrecken-LKWs und sparsamen Autos eine irreführende Kombinationsmetrik ergibt. Ich stelle mir vor, Sie könnten für einen bestimmten Zweck immer noch eine "flottenübergreifende" Zahl verwenden.
Jonathan Eunice
Interessante, aber leicht vom Thema abweichende Antwort ... trotzdem positiv bewertet!
HDave