Was ist Code Coverage und wie misst DU es?
Diese Frage wurde mir im Hinblick auf die Automatisierung der Codeabdeckung beim Testen gestellt. Es scheint, dass es außerhalb von automatisierten Werkzeugen mehr Kunst als Wissenschaft ist. Gibt es Beispiele aus der Praxis für die Verwendung der Codeabdeckung?
Die Codeabdeckung ist ein Maß dafür, wie viele Zeilen/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 auszuführen. Ein gutes Tool gibt Ihnen nicht nur den Prozentsatz des ausgeführten Codes an, sondern ermöglicht es Ihnen auch, die Daten aufzuspüren und genau zu sehen, welche Codezeilen während eines bestimmten Tests ausgeführt wurden.
Unser Team verwendet Magellan - eine Reihe interner Tools zur Codeabdeckung. Wenn Sie ein .NET-Shop sind, verfügt Visual Studio über integrierte Tools zum Erfassen der Codeabdeckung. Sie können auch einige benutzerdefinierte Werkzeuge rollen, wie dieser Artikel beschreibt.
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 - Codeabdeckung ist eines unserer Ausstiegskriterien für jeden Meilenstein. Wir haben tatsächlich drei Kennzahlen für die Codeabdeckung - die Abdeckung aus Komponententests (vom Entwicklungsteam), Szenarientests (vom Testteam) und die kombinierte Abdeckung.
Übrigens, während die Codeabdeckung eine gute Messgröße dafür ist, wie viel Sie testen, 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.
Die Codeabdeckung testet im Grunde genommen, wie viel Ihres Codes durch Tests abgedeckt wird. Wenn Sie also eine Codeabdeckung von 90% haben, bedeutet dies, dass 10% des Codes nicht durch Tests abgedeckt werden. 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, eine 100% ige Codeabdeckung zu erhalten?
Ein gutes Beispiel wird dies sein:
if(customer.IsOldCustomer())
{
}
else
{
}
Im obigen Code gibt es nun zwei Pfade/Zweige. Wenn Sie immer die Verzweigung "JA" treffen, decken Sie den else-Teil nicht ab und er wird in den Ergebnissen der Codeabdeckung angezeigt. Das ist gut, weil Sie jetzt wissen, 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.
Denken Sie daran, dass "100% Codeabdeckung" nicht bedeutet, dass alles vollständig getestet wird - während dies bedeutet, dass jede Codezeile getestet wird, bedeutet dies nicht, dass sie unter jeder (üblichen) Situation getestet werden.
Ich würde Code-Coverage verwenden, um Teile des Codes hervorzuheben, für die ich wahrscheinlich Tests schreiben sollte. Wenn beispielsweise das Code-Coverage-Tool myImportantFunction () während der Ausführung meiner aktuellen Komponententests nicht ausgeführt wird, sollten diese wahrscheinlich verbessert werden.
Grundsätzlich bedeutet 100% Codeabdeckung nicht, dass Ihr Code perfekt ist. Verwenden Sie es als Leitfaden, um umfassendere (Einheits-) Tests zu schreiben.
Ergänzung einiger Punkte zu vielen der vorherigen Antworten:
Codeabdeckung bedeutet, wie gut Ihr Testset Ihren Quellcode abdeckt. inwieweit wird der Quellcode von der Menge der Testfälle abgedeckt?.
Wie in den obigen Antworten erwähnt, gibt es verschiedene Abdeckungskriterien, wie Pfade, Bedingungen, Funktionen, Aussagen usw. Es müssen jedoch zusätzliche Kriterien abgedeckt werden
Hinweis: Bei der statischen Codeanalyse wird festgestellt, ob nicht erreichbarer Code oder hängender Code vorhanden ist, d. H. Code, der von keinem anderen Funktionsaufruf abgedeckt wird. Und auch andere statische Abdeckung. Selbst wenn die statische Codeanalyse meldet, dass 100% Code abgedeckt ist, werden keine Berichte zu Ihrem Testsatz angezeigt, wenn alle möglichen Codeabdeckungen getestet wurden.
Die Codeabdeckung wurde in den vorherigen Antworten ausführlich erläutert. Das ist also eher eine Antwort auf den zweiten Teil der Frage.
Wir haben drei Tools verwendet, um die Codeabdeckung zu bestimmen.
Wir nutzen diese Tools um
Die Codeabdeckung ist lediglich ein Maß für den getesteten Code. Es gibt verschiedene Kriterien für die Abdeckung, die gemessen werden können. In der Regel sind es jedoch die verschiedenen Pfade, Bedingungen, Funktionen und Anweisungen innerhalb eines Programms, die die gesamte Abdeckung ausmachen. Die Codeabdeckungsmetrik ist nur ein Prozentsatz der Tests, die jedes dieser Abdeckungskriterien ausführen.
Was das Verfolgen der Testabdeckung von Einheiten in meinen Projekten angeht, verwende ich statische Code-Analysetools, um den Überblick zu behalten.
Für Perl gibt es das ausgezeichnete Devel :: Cover Modul, das ich regelmäßig für meine Module benutze.
Wenn der Build und die Installation von Module :: Build verwaltet werden, können Sie einfach ./Build testcover
Ausführen, um eine nette HTML-Site zu erhalten, die Ihnen die Abdeckung pro Sub, Zeile und Bedingung mit netten Farben anzeigt, die es einfach machen, welchen Code zu sehen Weg wurde nicht zurückgelegt.
In den vorherigen Antworten wurde die Codeabdeckung gut erklärt. Ich füge nur einige Kenntnisse in Bezug auf Tools hinzu, wenn Sie auf den Plattformen iOS
und OSX
arbeiten. Xcode bietet die Möglichkeit, die Codeabdeckung zu testen und zu überwachen.
Referenz-Links:
https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51
Beide sind hilfreiche Links zum Erlernen und Erkunden der Codeabdeckung mit Xcode.