Testcoverage in Perl

Ich habe hier aktuell ein relativ großes Projekt, welches über sehr wenig automatisiert ablaufende Tests verfügt. Dies soll nun geändert werden und der Code soll nach und nach mit Unit-Tests abgedeckt werden.Kreisdiagramm 30/70

Meines Erachtens ist es bei einem solchen Projekt wichtig, die Fortschritte zu messen, um die Motivation aufrecht zu erhalten. Ich habe mich also dazu entschieden, zuallererst die Testcoverage des Codes zu messen. Nach kurzer Recherche bin ich auf das wohl verbreitetste Modul Devel::Cover gestoßen.

Im Weiteren werde ich kurz erklären wie ich es in einem Beispielprojekt implementiert habe:

Zu allererst habe ich Devel::Cover installiert und danach folgende Dateien als Testscenario erstellt:
coverage/lib/Module.pm
coverage/lib/Module/Blog.pm
coverage/lib/Module/Forum.pm
coverage/t/lib/Module.t
coverage/t/lib/Module/Blog.t

Um nun die Coverage zu bestimmen habe ich folgendes Script coverage/coverage.sh erzeugt:

Hier wird zuerst das alte Ergebnis gelöscht und dann die neue Coverage berechnet. Hierbei sollen Tests (also .t-Dateien) und das Programm prove vom Ergebnis ausgenommen werden. Zudem setze ich ich das Verzeichnis lib/ als Bibliothekspfad, sodass es nicht in jedem Test stehen muss.

Nach dem Lauf von coverage.sh findet sich folgende HTML-Ausgabe in coverage/coverage_db/coverage.html:

Perl Coverage Summary

Wie man sieht, ist die Datei coverage/lib/Module/Forum.pm noch nicht enthalten, da für sie keine Tests existieren und die Datei somit dem System nicht bekannt ist. Da wir aber die Coverage über alle Dateien haben wollen, habe ich noch folgenden Test t/coverage.t geschrieben, welcher einfach alle Dateien required (dieses Skript ist noch nicht sonderlich ausgefeilt und ist eher als Prove of concept zu sehen):

Danach sieht die Coverage so aus:

Coverage Summary mit allen Files

Jetzt sieht man die Testabdeckung und kann seinen Fortschritt nachvollziehen. Hier ist natürlich zu beachten, dass Testcoverage kein Qualitätsziel ist und nur dem Finden von ungetestetem Code dient. Martin Fowler erklärt das in diesem Beitrag. Für vernünftige Tests muss man schon noch selbst sorgen.