Jon Limjap bringt es auf den Punkt: Es gibt nicht eine einzige Zahl, die sich als Standard für jedes Projekt eignet. Es gibt Projekte, die einen solchen Standard einfach nicht brauchen. Wo die akzeptierte Antwort meiner Meinung nach zu kurz greift, ist bei der Beschreibung, wie man diese Entscheidung für ein bestimmtes Projekt treffen könnte.
Ich werde einen Versuch wagen, dies zu tun. Ich bin kein Experte für Prüftechnik und würde mich über eine fundiertere Antwort freuen.
Wann sind die Anforderungen an den Erfassungsbereich des Codes festzulegen?
Erstens: Warum wollen Sie eine solche Norm überhaupt einführen? Ganz allgemein, wenn Sie empirisches Vertrauen in Ihr Verfahren einführen wollen. Was meine ich mit "empirischem Vertrauen"? Nun, das eigentliche Ziel Korrektheit . Bei der meisten Software können wir dies unmöglich für alle Eingaben wissen, also geben wir uns mit der Aussage zufrieden, dass der Code erprobt . Dies ist zwar besser zu erkennen, aber immer noch ein subjektiver Maßstab: Es wird immer umstritten sein, ob man ihn erfüllt hat oder nicht. Diese Debatten sind nützlich und sollten geführt werden, aber sie bringen auch Unsicherheit mit sich.
Code-Abdeckung ist eine objektive Messung: Sobald Sie Ihren Erfassungsbericht sehen, gibt es keine Unklarheiten mehr darüber, ob die Standards erfüllt wurden oder nicht. Beweist er die Korrektheit? Keineswegs, aber es besteht ein klarer Zusammenhang damit, wie gut der Code getestet ist, was wiederum unsere beste Möglichkeit ist, das Vertrauen in seine Korrektheit zu erhöhen. Die Codeabdeckung ist ein messbarer Näherungswert für unermessliche Qualitäten, die uns wichtig sind.
Einige spezifische Fälle, in denen ein empirischer Standard von Nutzen sein könnte:
- Die Interessengruppen zufriedenstellen. Bei vielen Projekten gibt es verschiedene Akteure, die ein Interesse an der Softwarequalität haben, aber möglicherweise nicht an der täglichen Entwicklung der Software beteiligt sind (Manager, technische Leiter usw.): Sie müssen sich entweder voll und ganz auf das Projekt verlassen oder es unter ständiger strenger Aufsicht überprüfen (vorausgesetzt, sie haben überhaupt das technische Verständnis dafür).
- Das Verhalten des Teams zu normalisieren. Wenn Sie in einem Team arbeiten, in dem mehrere Personen Code und Tests schreiben, gibt es viel Raum für Unklarheiten darüber, was als "gut getestet" gilt. Haben alle Ihre Kollegen die gleiche Vorstellung davon, welches Testniveau gut genug ist? Wahrscheinlich nicht. Wie können Sie das unter einen Hut bringen? Finden Sie einen Maßstab, auf den Sie sich alle einigen können, und akzeptieren Sie ihn als vernünftigen Näherungswert. Dies ist vor allem (aber nicht ausschließlich) in großen Teams nützlich, in denen die Leiter beispielsweise keine direkte Aufsicht über die jüngeren Entwickler haben. Vertrauensnetze sind ebenfalls wichtig, aber ohne objektive Messwerte kann das Gruppenverhalten leicht inkonsistent werden, selbst wenn alle in gutem Glauben handeln.
- Damit Sie ehrlich bleiben. Selbst wenn Sie der einzige Entwickler und der einzige Beteiligte an Ihrem Projekt sind, haben Sie vielleicht bestimmte Eigenschaften für die Software im Sinn. Anstatt ständig subjektive Einschätzungen darüber abzugeben, wie gut die Software getestet ist (was viel Arbeit bedeutet), können Sie die Codeabdeckung als vernünftigen Näherungswert verwenden und sie von Maschinen messen lassen.
Welche Metriken sind zu verwenden?
Die Codeabdeckung ist keine einheitliche Kennzahl; es gibt mehrere verschiedene Möglichkeiten, die Abdeckung zu messen. Auf welche Sie einen Standard setzen, hängt davon ab, was Sie mit diesem Standard erreichen wollen.
Ich werde zwei gängige Messgrößen als Beispiele dafür anführen, wann man sie zur Festlegung von Standards verwenden kann:
- Erfassungsbereich : Wie viel Prozent der Anweisungen wurden während des Tests ausgeführt? Nützlich, um ein Gefühl für die physische Deckung deines Codes: Wie viel von dem Code, den ich geschrieben habe, habe ich tatsächlich getestet?
- Diese Art der Abdeckung unterstützt ein schwächeres Korrektheitsargument, ist aber auch einfacher zu erreichen. Wenn Sie Code Coverage nur verwenden, um sicherzustellen dass Dinge getestet werden (und nicht als Indikator für die Testqualität darüber hinaus), dann ist die Anweisungsabdeckung wahrscheinlich ausreichend.
- Abdeckung der Branche : Wenn es eine Verzweigungslogik gibt (z. B. eine
if
), sind beide Zweige bewertet worden? Dies vermittelt ein besseres Gefühl für die logische Abdeckung deines Codes: Wie viele der möglichen Wege, die mein Code nehmen kann, habe ich getestet?
- Diese Art der Abdeckung ist ein viel besserer Indikator dafür, dass ein Programm mit einem umfassenden Satz von Eingaben getestet wurde. Wenn Sie die Codeabdeckung als besten empirischen Näherungswert für das Vertrauen in die Korrektheit verwenden, sollten Sie Standards festlegen, die auf der Zweigabdeckung oder Ähnlichem basieren.
Es gibt noch viele andere Metriken (die Zeilenabdeckung ähnelt der Anweisungsabdeckung, liefert aber bei mehrzeiligen Anweisungen andere numerische Ergebnisse; die bedingte Abdeckung und die Pfadabdeckung ähneln der Verzweigungsabdeckung, spiegeln aber eine detailliertere Sicht auf die möglichen Permutationen der Programmausführung wider, auf die man stoßen könnte).
Welcher Prozentsatz ist zu verlangen?
Abschließend möchte ich auf die ursprüngliche Frage zurückkommen: Wenn Sie Standards für die Codeabdeckung festlegen, wie hoch sollte diese Zahl sein?
Hoffentlich ist an dieser Stelle klar, dass es sich zunächst um eine Annäherung handelt, so dass jede Zahl, die wir wählen, von Natur aus eine Annäherung ist.
Einige Zahlen, die man wählen könnte:
- 100% . Vielleicht entscheiden Sie sich dafür, weil Sie sicher sein wollen, dass alles getestet wird. Dies gibt Ihnen keinen Einblick in die Qualität der Tests, aber es sagt Ihnen, dass ein Test von gewisser Qualität jede Anweisung (oder Verzweigung usw.) berührt hat: Wenn Ihre Testabdeckung unter 100% liegt, müssen Sie wissen eine Teilmenge Ihres Codes ist ungetestet.
- Manche mögen einwenden, dass dies albern sei und man nur die Teile des Codes testen sollte, die wirklich wichtig sind. Ich würde argumentieren, dass man auch nur die Teile des Codes pflegen sollte, die wirklich wichtig sind. Die Codeabdeckung kann auch durch das Entfernen von ungetestetem Code verbessert werden.
- 99% (oder 95%, andere Zahlen in den hohen Neunzigern.) Geeignet in Fällen, in denen Sie ein Maß an Vertrauen vermitteln wollen ähnlich zu 100 %, aber lassen Sie sich einen gewissen Spielraum, damit Sie sich nicht über die eine oder andere schwer zu testende Ecke des Codes Sorgen machen müssen.
- 80% . Ich habe diese Nummer schon ein paar Mal gesehen und weiß nicht genau, woher sie stammt. I denken es könnte sich um eine seltsame Zweckentfremdung der 80-20-Regel handeln; im Allgemeinen geht es darum, zu zeigen, dass Die meisten Ihres Codes getestet wird. (Ja, 51 % wären auch "die meisten", aber 80 % entsprechen eher dem, was die meisten Menschen mittlere von den meisten.) Dies ist für mittlere Fälle geeignet, in denen "gut getestet" keine hohe Priorität hat (Sie wollen keine Mühe auf Tests mit geringem Wert verschwenden), aber eine ausreichende Priorität hat, so dass Sie trotzdem einen Standard haben möchten.
Ich habe in der Praxis noch keine Werte unter 80 % gesehen und kann mir nur schwer vorstellen, dass man sie festlegen sollte. Die Aufgabe dieser Standards ist es, das Vertrauen in die Korrektheit zu erhöhen, und Zahlen unter 80 % sind nicht besonders vertrauenserweckend. (Ja, das ist subjektiv, aber wie gesagt, die Idee ist, die subjektive Entscheidung einmal zu treffen, wenn man den Standard festlegt, und dann eine objektive Messung für die Zukunft zu verwenden).
Sonstige Anmerkungen
Die obigen Ausführungen gehen davon aus, dass Korrektheit das Ziel ist. Die Codeabdeckung ist nur eine Information; sie kann für andere Ziele relevant sein. Wenn Sie beispielsweise auf Wartbarkeit Wert legen, ist Ihnen wahrscheinlich eine lose Kopplung wichtig, die durch Testbarkeit nachgewiesen werden kann, die wiederum (auf bestimmte Art und Weise) durch Codeabdeckung gemessen werden kann. Ihr Codeabdeckungsstandard bietet also auch eine empirische Grundlage für die Annäherung an die Qualität der "Wartbarkeit".
0 Stimmen
Heutzutage verfügen viele IDEs über Abdeckungshervorhebung. Stellen Sie sicher, dass Sie zumindest die wichtigsten Teile des Codes abdecken, als dass Sie daran denken, einen bestimmten Prozentsatz zu erreichen.
0 Stimmen
Unit-Tests können per Definition einzelne Methoden, ganze Klassen oder ganze Module sein. Selbst wenn Sie alle Methoden testen, testen Sie möglicherweise nicht alle Pfade oder alle Kombinationen, auf die ein Benutzer stößt. Mit Anweisungs- und Verzweigungsabdeckung und MCDCs wird die Situation noch komplexer.
0 Stimmen
Warum wird diese Frage nicht gelöscht oder ordnungsgemäß bearbeitet? Sie hat so viel Interesse geweckt, aber sie ist völlig irreführend.
0 Stimmen
Eine 100%ige Deckung ist das Minimum. Ich möchte wissen, ob ein Punk ein unerwartetes process.exit(1) eingeführt oder aus Spaß oder Unwissenheit irgendwo hingeworfen hat. Wenn man nicht jede Codezeile in einem Build ausführt, werde ich es einfach nicht wissen, bis dieser Code vielleicht irgendwann in der Produktion verwendet wird.
0 Stimmen
Ich denke, dass man sich das besser umgekehrt vorstellt. Die Codeabdeckung sagt sehr wenig aus, außer dass der Code ausgeführt wurde. LACK der Codeabdeckung andererseits bedeutet, dass der Code NIE ausgeführt wurde. Anstatt also eine hohe Codeabdeckung anzustreben, sollten wir vielleicht eher versuchen, so wenig ungetesteten Code wie möglich zu haben. (Der Grund für diese Unterscheidung ist, dass ausgeführter Code nicht unbedingt getesteter Code ist, aber nicht ausgeführter Code ist definitiv ungetesteter Code. IE: abgedeckter Code sollte nicht so sehr geschätzt werden, wie unabgedeckter Code vermieden werden sollte.)