Wenn ich Code habe, der eine Testabdeckung von 80% aufweist (alle Tests bestehen), kann ich dann sagen, dass er von höherer Qualität ist als Code ohne Testabdeckung?
Oder ist es fair zu sagen, dass es besser zu warten ist?
Wenn ich Code habe, der eine Testabdeckung von 80% aufweist (alle Tests bestehen), kann ich dann sagen, dass er von höherer Qualität ist als Code ohne Testabdeckung?
Oder ist es fair zu sagen, dass es besser zu warten ist?
Antworten:
Im engeren Sinne ist es nicht fair, Ansprüche geltend zu machen, bis die Qualität der Testsuite feststeht. Das Bestehen von 100% der Tests ist nicht sinnvoll, wenn die meisten Tests trivial sind oder sich wiederholen.
Die Frage ist: Hat einer dieser Tests in der Projektgeschichte Fehler aufgedeckt? Das Ziel eines Tests ist es, Fehler zu finden. Und wenn nicht, scheiterten sie als Tests. Anstatt die Codequalität zu verbessern, geben sie Ihnen möglicherweise nur ein falsches Sicherheitsgefühl.
Um Ihre Testdesigns zu verbessern, können Sie (1) Whitebox-Techniken, (2) Blackbox-Techniken und (3) Mutationstests verwenden.
(1) Hier einige gute Whitebox-Techniken, die Sie für Ihre Testdesigns anwenden können. Ein Whitebox-Test wird unter Berücksichtigung des spezifischen Quellcodes erstellt. Ein wichtiger Aspekt beim Testen von Whiteboxen ist die Codeabdeckung:
if
oder while
) einen Test, der die Richtigkeit erzwingt, und einen anderen, der die Falschheit erzwingt? [Entscheidungsberichterstattung]&&
) oder eine Disjunktion (Verwendungen ||
) ist, einen Test, bei dem er wahr / falsch ist? [Bedingungsüberdeckung]break
von einer Schleife abgedeckt?(2) Blackbox-Techniken werden verwendet, wenn die Anforderungen verfügbar sind, der Code selbst jedoch nicht. Diese können zu hochwertigen Tests führen:
(3) Nehmen wir zum Schluss an, Sie haben bereits viele gute Tests für die Abdeckung von Whiteboxen und angewandte Blackbox-Techniken. Was kannst du noch tun? Es ist Zeit, Ihre Tests zu testen . Eine Technik, die Sie verwenden können, ist das Testen von Mutationen.
Unter Mutationstests nehmen Sie eine Modifikation (Kopie) Ihres Programms vor, in der Hoffnung, einen Fehler zu verursachen. Eine Mutation könnte sein:
Ändern Sie eine Referenz einer Variablen in eine andere Variable. Füge die abs () Funktion ein; Ändern Sie kleiner als zu größer als; Eine Aussage löschen; Ersetzen Sie eine Variable durch eine Konstante. Löschen Sie eine überschreibende Methode. Löschen Sie einen Verweis auf eine Super-Methode. Ändern Sie die Argumentreihenfolge
Erstellen Sie mehrere Dutzend Mutanten an verschiedenen Stellen in Ihrem Programm [das Programm muss zum Testen noch kompiliert werden]. Wenn Ihre Tests diese Fehler nicht finden, müssen Sie jetzt einen Test schreiben, der den Fehler in der mutierten Version Ihres Programms findet. Sobald ein Test den Fehler gefunden hat, haben Sie den Mutanten getötet und können einen anderen versuchen.
Nachtrag : Ich habe vergessen, diesen Effekt zu erwähnen: Bugs neigen zur Häufung . Das heißt, je mehr Fehler Sie in einem Modul finden, desto höher ist die Wahrscheinlichkeit, dass Sie mehr Fehler finden. Wenn Sie also einen Test haben, der fehlschlägt (dh der Test ist erfolgreich, da das Ziel darin besteht, Fehler zu finden), sollten Sie nicht nur den Fehler beheben, sondern auch weitere Tests für das Modul schreiben Techniken oben.
Solange Sie ständig Fehler finden, müssen die Testbemühungen fortgesetzt werden. Nur wenn die Anzahl der gefundenen neuen Fehler sinkt, können Sie sicher sein, dass Sie gute Testbemühungen für diese Entwicklungsphase unternommen haben.
Nach einer Definition ist es wartungsfreundlicher, da jede Änderung durch die Tests mit größerer Wahrscheinlichkeit aufgefangen wird.
Die Tatsache, dass Code die Komponententests besteht, bedeutet jedoch nicht, dass er von höherer Qualität ist. Möglicherweise ist der Code mit irrelevanten Kommentaren und unangemessenen Datenstrukturen noch immer schlecht formatiert, kann die Tests jedoch bestehen.
Ich weiß, welchen Code ich lieber pflegen und erweitern möchte.
Code mit absolut keinen Tests kann extrem hohe Qualität, Lesbarkeit, Schönheit und Effizienz (oder völliger Müll) aufweisen. Nein, es ist nicht fair zu sagen, dass Code mit 80% Testabdeckung von höherer Qualität ist als Code ohne Testabdeckung.
Es könnte fair zu sagen , dass Code 80% mit abgedeckt guten Tests ist wahrscheinlich von akzeptabler Qualität, und wahrscheinlich relativ wartbar. Aber es garantiert wirklich wenig.
Ich würde es mehr refactorable nennen. Refactoring wird extrem einfach, wenn Code mit vielen Tests abgedeckt wird.
Es wäre fair, es als wartbarer zu bezeichnen.
Ich würde dem wartbaren Teil zustimmen. Michael Feathers hat kürzlich ein Video mit dem Titel " Die tiefe Synergie zwischen Testbarkeit und gutem Design " gepostet, in dem er dieses Thema diskutiert. In dem Vortrag sagt er, dass die Beziehung eine Möglichkeit ist, das heißt, dass gut gestalteter Code testbar ist, aber testbarer Code nicht unbedingt gut gestaltet ist.
Es ist erwähnenswert, dass das Video-Streaming im Video nicht besonders gut ist. Daher kann es sich lohnen, es herunterzuladen, wenn Sie es vollständig ansehen möchten.
Diese Frage stelle ich mir seit einiger Zeit im Zusammenhang mit der "Bedingungsdeckung". Wie wäre es mit dieser Seite von atollic.com "Warum Codeabdeckungsanalyse?"
Technisch gesehen findet die Codeabdeckungsanalyse Bereiche in Ihrem Programm, die nicht von Ihren Testfällen abgedeckt werden, sodass Sie zusätzliche Tests erstellen können, die ansonsten nicht getestete Teile Ihres Programms abdecken. Es ist daher wichtig zu verstehen, dass die Codeabdeckung Ihnen hilft, die Qualität Ihrer Testverfahren und nicht die Qualität des Codes selbst zu verstehen .
Dies scheint hier sehr relevant zu sein. Wenn Sie einen Testfallsatz haben, der es schafft, ein bestimmtes Maß an (Code- oder sonstigem) Abdeckung zu erreichen, rufen Sie den zu testenden Code höchstwahrscheinlich mit einem ziemlich umfassenden Satz von Eingabewerten auf! Dies sagt nicht viel über den zu testenden Code aus (es sei denn, der Code bläst auf oder erzeugt erkennbare Fehler), gibt Ihnen jedoch Vertrauen in Ihren Testfall .
In einem interessanten Necker Cube- Wechsel wird der Testcode nun vom Testcode getestet!
Es gibt viele Möglichkeiten, um sicherzustellen, dass ein Programm das tut, was Sie beabsichtigen, und um sicherzustellen, dass Änderungen keine unbeabsichtigten Auswirkungen haben.
Testen ist eins. Die Vermeidung von Datenmutationen ist eine andere. So ist ein Typensystem. Oder formelle Verifizierung.
Obwohl ich der Meinung bin, dass das Testen im Allgemeinen eine gute Sache ist, bedeutet ein bestimmter Prozentsatz des Testens möglicherweise nicht viel. Ich würde mich lieber auf etwas verlassen, das ohne Tests in Haskell geschrieben wurde, als auf eine gut getestete PHP-Bibliothek