Was ist Codeabdeckung und wie messen SIE sie?

275

Was ist Codeabdeckung und wie messen SIE sie?

Diese Frage wurde mir bezüglich unserer automatisierten Testcode-Abdeckung gestellt. Es scheint zu sein, dass es außerhalb automatisierter Werkzeuge mehr Kunst als Wissenschaft ist. Gibt es Beispiele aus der Praxis für die Verwendung der Codeabdeckung?

Brian G.
quelle

Antworten:

241

Die Codeabdeckung ist ein Maß dafür, wie viele Linien / Blöcke / Bögen Ihres Codes ausgeführt werden, während die automatisierten Tests ausgeführt werden.

Die Codeabdeckung wird mithilfe eines speziellen Tools erfasst, um die Binärdateien zu instrumentieren, um Ablaufverfolgungsaufrufe hinzuzufügen und einen vollständigen Satz automatisierter Tests für das instrumentierte Produkt durchzuführen. Mit einem guten Tool erhalten Sie nicht nur den Prozentsatz des ausgeführten Codes, sondern können auch einen Drilldown in die Daten durchführen und genau sehen, welche Codezeilen während eines bestimmten Tests ausgeführt wurden.

Unser Team verwendet Magellan - ein internes Set von Tools zur Codeabdeckung. Wenn Sie ein .NET-Shop sind, verfügt Visual Studio über integrierte Tools zum Sammeln der Codeabdeckung. Sie können auch einige benutzerdefinierte Tools rollen, wie in diesem Artikel beschrieben.

Wenn Sie ein C ++ - Shop sind, hat Intel einige Tools , die für Windows und Linux ausgeführt werden, obwohl ich sie nicht verwendet habe. Ich habe auch gehört, dass es das gcov-Tool für GCC gibt, aber ich weiß nichts darüber und kann Ihnen keinen Link geben.

Wie wir es verwenden - die Codeabdeckung ist eines unserer Ausstiegskriterien für jeden Meilenstein. Wir haben tatsächlich drei Kennzahlen für die Codeabdeckung: Abdeckung durch Komponententests (vom Entwicklungsteam), Szenariotests (vom Testteam) und kombinierte Abdeckung.

Übrigens, während die Codeabdeckung eine gute Messgröße dafür ist, wie viele Tests Sie durchführen, ist sie nicht unbedingt eine gute Messgröße dafür, wie gut Sie Ihr Produkt testen. Es gibt andere Metriken, die Sie zusammen mit der Codeabdeckung verwenden sollten, um die Qualität sicherzustellen.

Franci Penov
quelle
40
"Es gibt andere Metriken, die Sie zusammen mit der Codeabdeckung verwenden sollten, um die Qualität sicherzustellen." Können Sie sagen, was sind diese anderen Metriken?
Troopers
Sie können auch Testwell CTC ++ verwenden , es ist ein ziemlich vollständiges Tool zur Codeabdeckung für C, C ++, C # und Java
B_PRIEUR
1
@Abdul Wenn Sie die Codeabdeckung messen, sollten Sie beide Arten von Tests ausführen und die Codeabdeckung für sie separat messen. Was "Codebögen" betrifft - das sind die Codeausführungszweige, wie wenn / dann.
Franci Penov
1
@Maverick Die meisten Leute gehen von Unit-Tests aus, wenn sie über Codeabdeckung sprechen. Bei Microsoft haben wir jedoch die Codeabdeckung sowohl aus Unit-Tests als auch aus Integrationstests gemessen.
Franci Penov
1
@darth_coder nichts allgemein. Die App wird ebenfalls nicht automatisch instrumentiert. Wenn die Instrumentierungsdaten nicht erfasst werden, ist das Vorhandensein der neuen App irrelevant. Der einzige Fall, in dem dies Auswirkungen haben könnte, besteht darin, dass die App zur gleichen Zeit ausgeführt wird, zu der automatisierte Tests ausgeführt werden, und dass instrumentierter Betriebssystemcode im selben Prozess wie die Testautomatisierung ausgeführt wird, wodurch möglicherweise ein Teil des Betriebssystemcodes als ausgeführt angezeigt wird von den Tests nicht berührt.
Franci Penov
189

Die Codeabdeckung testet im Wesentlichen, wie viel von Ihrem Code unter Tests abgedeckt ist. Wenn Sie also eine Codeabdeckung von 90% haben, bedeutet dies, dass 10% des Codes nicht durch Tests abgedeckt sind. Ich weiß, dass Sie vielleicht denken, dass 90% des Codes abgedeckt sind, aber Sie müssen aus einem anderen Blickwinkel schauen. Was hindert Sie daran, 100% Code abzudecken?

Ein gutes Beispiel wird dies sein:

if(customer.IsOldCustomer()) 
{
}
else 
{
}

Im obigen Code gibt es nun zwei Pfade / Zweige. Wenn Sie immer auf den Zweig "JA" klicken, wird der andere Teil nicht abgedeckt, und er wird in den Ergebnissen der Codeabdeckung angezeigt. Das ist gut, denn jetzt wissen Sie, was nicht abgedeckt ist, und Sie können einen Test schreiben, um den anderen Teil abzudecken. Wenn es keine Codeabdeckung gab, sitzen Sie nur auf einer Zeitbombe, um zu explodieren.

NCover ist ein gutes Werkzeug zum Messen der Codeabdeckung.

Azamsharp
quelle
5
Die beste Antwort vor fast 10 Jahren! Verdammt! :)
Nikos
4
Einfache und aussagekräftige Antwort :)
Parveen
Ja. Der einzige, der Sinn machte. Obwohl ich mir nicht einmal die Mühe gemacht habe, weiter nach unten zu scrollen. Hier hörte ich auf. Lesezeichen.
TheRealChx101
64

Denken Sie daran, dass "100% Code-Abdeckung" nicht bedeutet, dass alles vollständig getestet wird - während dies bedeutet, dass jede Codezeile getestet wird, bedeutet dies nicht, dass sie in jeder (allgemeinen) Situation getestet werden.

Ich würde Code-Coverage verwenden, um Code-Bits hervorzuheben, für die ich wahrscheinlich Tests schreiben sollte. Wenn beispielsweise das Code-Coverage-Tool myImportantFunction () nicht ausgeführt wird, während meine aktuellen Unit-Tests ausgeführt werden, sollten sie wahrscheinlich verbessert werden.

Grundsätzlich bedeutet 100% Code-Abdeckung nicht, dass Ihr Code perfekt ist. Verwenden Sie es als Leitfaden, um umfassendere (Einheits-) Tests zu schreiben.

dbr
quelle
1
- "100% Codeabdeckung" bedeutet nicht, dass alles vollständig getestet wird - während es bedeutet, dass jede Codezeile getestet wird, bedeutet dies nicht, dass sie in jeder (gemeinsamen) Situation getestet werden. - "in jeder (gemeinsamen) Situation Situation "Ist dies in Bezug auf Dateneingabe und Parameter? Ich habe Schwierigkeiten zu verstehen, warum es nicht gleichbedeutend ist, wenn alles getestet wird.
Abdul
20
Nur weil jede Zeile Ihres Codes zu einem bestimmten Zeitpunkt in Ihren Tests ausgeführt wird, bedeutet dies nicht, dass Sie jedes mögliche Szenario getestet haben, unter dem der Code ausgeführt werden könnte. Wenn Sie nur eine Funktion hatten, die übernommen xund zurückgegeben wurde, x/xund den Test mit my_func (2) ausgeführt haben, haben Sie eine 100% ige Abdeckung (da der Code der Funktion ausgeführt wurde), aber Sie haben ein großes Problem übersehen, wenn 0 der Parameter ist. Das heißt, Sie haben auch bei 100% iger Abdeckung nicht alle erforderlichen Szenarien getestet.
Steve
Können Sie bitte diese Situation untersuchen, wenn Unit-Testfälle nicht für alle Methoden geschrieben wurden? Wird die Codeabdeckung immer noch 100% betragen? stackoverflow.com/questions/43395968/…
Sachin Kumar
52

Ein paar Punkte zu vielen der vorherigen Antworten ergänzen:

Codeabdeckung bedeutet, wie gut Ihr Testsatz Ihren Quellcode abdeckt. dh inwieweit wird der Quellcode von den Testfällen abgedeckt?

Wie in den obigen Antworten erwähnt, gibt es verschiedene Abdeckungskriterien, wie Pfade, Bedingungen, Funktionen, Anweisungen usw. Es müssen jedoch zusätzliche Kriterien abgedeckt werden

  1. Bedingungsabdeckung: Alle booleschen Ausdrücke, die auf wahr und falsch ausgewertet werden sollen.
  2. Entscheidungsabdeckung: Nicht nur boolesche Ausdrücke, die einmal auf wahr und falsch ausgewertet werden sollen, sondern alle nachfolgenden if-elseif-else-Körper.
  3. Schleifenabdeckung: bedeutet, dass jede mögliche Schleife einmal, mehrmals und nullmal ausgeführt wurde. Wenn wir von einer Höchstgrenze ausgehen, testen Sie, wenn möglich, die Höchstgrenzen und eine mehr als die Höchstgrenzen.
  4. Eingangs- und Ausgangsabdeckung: Testen Sie alle möglichen Anrufe und deren Rückgabewert.
  5. Parameterwertabdeckung (PVC). Um zu überprüfen, ob alle möglichen Werte für einen Parameter getestet wurden. Beispielsweise kann eine Zeichenfolge eine der folgenden sein: a) null, b) leer, c) Leerzeichen (Leerzeichen, Tabulatoren, neue Zeile), d) gültige Zeichenfolge, e) ungültige Zeichenfolge, f) Einzelbytezeichenfolge, g ) Doppelbyte-Zeichenfolge. Wenn nicht jeder mögliche Parameterwert getestet wird, kann dies zu einem Fehler führen. Wenn Sie nur eine davon testen, kann dies zu einer 100% igen Codeabdeckung führen, da jede Zeile abgedeckt ist. Da jedoch nur eine von sieben Optionen getestet wird, bedeutet dies, dass nur 14,2% des Parameterwerts abgedeckt sind.
  6. Vererbungsabdeckung: Im Fall einer objektorientierten Quelle sollte bei der Rückgabe eines abgeleiteten Objekts, auf das von der Basisklasse verwiesen wird, die Abdeckung getestet werden, um zu bewerten, ob ein Geschwisterobjekt zurückgegeben wird.

Hinweis: Bei der statischen Code-Analyse wird festgestellt, ob nicht erreichbarer Code oder hängender Code vorhanden ist, dh Code, der von keinem anderen Funktionsaufruf abgedeckt wird. Und auch andere statische Abdeckung. Selbst wenn bei der statischen Code-Analyse angegeben wird, dass 100% Code abgedeckt ist, werden keine Berichte zu Ihrem Testsatz angezeigt, wenn die gesamte mögliche Codeabdeckung getestet wurde.

Chand51
quelle
2
Schöne Ergänzung hier zu den anderen Antworten
HDave
14

Die Codeabdeckung wurde in den vorherigen Antworten gut erklärt. Dies ist also eher eine Antwort auf den zweiten Teil der Frage.

Wir haben drei Tools verwendet, um die Codeabdeckung zu bestimmen.

  1. JTest - ein proprietäres Tool, das über JUnit erstellt wurde. (Es werden auch Komponententests generiert.)
  2. Cobertura - ein Open-Source-Tool zur Codeabdeckung, das problemlos mit JUnit-Tests gekoppelt werden kann, um Berichte zu erstellen.
  3. Emma - eine andere - diese haben wir für einen etwas anderen Zweck verwendet als Unit-Tests. Es wurde verwendet, um Berichterstattungsberichte zu erstellen, wenn Endbenutzer auf die Webanwendung zugreifen. In Verbindung mit Webtest-Tools (Beispiel: Canoo) erhalten Sie sehr nützliche Berichterstattungsberichte, aus denen hervorgeht, wie viel Code während der typischen Verwendung durch Endbenutzer abgedeckt wird.

Wir verwenden diese Tools, um

  • Überprüfen Sie, ob Entwickler gute Komponententests geschrieben haben
  • Stellen Sie sicher, dass der gesamte Code während des Black-Box-Tests durchlaufen wird
Vivek Kodira
quelle
6

Die Codeabdeckung ist lediglich ein Maß für den getesteten Code. Es gibt eine Vielzahl von Abdeckungskriterien, die gemessen werden können. In der Regel sind es jedoch die verschiedenen Pfade, Bedingungen, Funktionen und Anweisungen innerhalb eines Programms, die die Gesamtabdeckung ausmachen. Die Metrik für die Codeabdeckung ist nur ein Prozentsatz der Tests, die jedes dieser Abdeckungskriterien ausführen.

In Bezug auf die Verfolgung der Abdeckung von Unit-Tests in meinen Projekten verwende ich statische Code-Analyse-Tools, um den Überblick zu behalten.

SaaS-Entwickler
quelle
5

Für Perl gibt es das hervorragende Devel :: Cover- Modul, das ich regelmäßig für meine Module verwende.

Wenn der Build und die Installation von Module :: Build verwaltet werden, können Sie einfach ./Build testcovereine schöne HTML-Site erstellen , die die Abdeckung pro Unterabschnitt, Zeile und Zustand angibt. Mit schönen Farben können Sie leicht erkennen, welcher Codepfad nicht abgedeckt wurde.

moritz
quelle
1

In den vorherigen Antworten wurde die Codeabdeckung gut erklärt. Ich bin nur etwas Wissen Hinzufügen zu Werkzeugen aus , wenn Ihr auf arbeiten iOSund OSXPlattformen, bietet Xcode , die Anlage zu testen und überwachen Codeabdeckung.

Referenzlinks:

https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

Beide sind hilfreiche Links zum Erlernen und Erkunden der Codeabdeckung mit Xcode.

taha027
quelle