2009-02-10 20 views
24

Gibt es eine Möglichkeit, die Codeabdeckung mit DUnit zu messen? Oder gibt es irgendwelche kostenlosen Tools, um das zu erreichen? Was verwendest du dafür? Welche Code-Abdeckung verwenden Sie normalerweise?Messcodeabdeckung in Delphi

Jim McKeeth: Danke für die ausführliche Antwort. Ich spreche von Komponententests im Sinne eines TDD-Ansatzes, nicht nur über Komponententests nach einem Fehler. Ich bin an der Codeabdeckung interessiert, die ich mit einigen grundlegenden vorgefertigten Komponententests erreichen kann.

+0

Ich habe noch keine der Antworten akzeptiert, weil ich Menschen ermutigen will, ihre Meinung über Unit-Tests zu schreiben, welche Tools sie verwenden und welche Abdeckung sie versuchen es zu erreichen. Also alle, fühlen Sie sich frei zu kommentieren;) – jpfollenius

Antwort

24

Ich habe gerade ein neues Open-Source-Projekt auf Google Code mit einem einfachen Code-Coverage-Tool für Delphi 2010 https://sourceforge.net/projects/delphicodecoverage/

Im Moment kann es Zeilenabdeckung messen, aber ich plane, Klassen- und Methoden Berichterstattung hinzufügen .

Es generiert HTML-Berichte mit einer Zusammenfassung sowie markierte Quelle zeigt Ihnen, welche Zeilen abgedeckt sind (grün), die nicht waren (rot) und den Rest der Zeilen, die keinen Code für sie generiert hatten.

Update: Ab Version 0.3 von Delphi Code Coverage Sie XML-Berichte kompatibel mit dem Hudson EMMA-Plugin Code-Coverage-Trends angezeigt werden innerhalb Hudson erzeugen kann.

Update: Version 0.5 Bug-Fixes, erhöhte Konfigurierbarkeit und gereinigt Berichte

Update bringt: Version 1.0 bringt Unterstützung für emma-Ausgang, Abdeckung von Klassen und Methoden und Berichterstattung über DLLs und BPLs

+0

Sehr einfaches und effizientes Werkzeug. Thx zum Teilen! – TridenT

+0

Nur ein oder zwei Worte der Unterstützung für Christer, dieses Tool ist bereits nützlich und wird wirklich nützlich. – Mmarquee

+3

Ich habe einen kleinen Assistenten erstellt, der die Befehlszeile für die Delphi-Code-Abdeckung unterstützt. Siehe http://code.google.com/p/delphi-code-coverage-wizard/ – TridenT

7

Beziehen Sie sich auf die Codeabdeckung von Komponententests oder veraltetem Code? Generell denke ich, dass nur testbarer Code, der einen Fehler aufweist, mit einem Unit Test abgedeckt werden sollte (ja, ich weiß, dass vielleicht ein heiliger Krieg beginnt, aber das ist, wo ich stehe). Das wäre also ein ziemlich geringer Prozentsatz.

Jetzt ist veralteter Code auf der anderen Seite eine andere Geschichte. Veralteter Code ist Code, der nicht verwendet wird. Du brauchst wahrscheinlich kein Tool, um dir das für eine Menge deines Codes mitzuteilen, schau einfach nach den kleinen blauen Punkten, nachdem du in Delphi kompiliert hast. Alles ohne einen blauen Punkt ist abgestanden. Wenn Code nicht verwendet wird, sollte er normalerweise entfernt werden. Das wäre also 100% Codeabdeckung.

Es gibt andere Szenarien für veralteten Code, z. B. wenn Sie speziellen Code verarbeiten müssen, wenn das Datum jemals am 31. Februar landet. Der Compiler weiß nicht, dass das nicht passieren kann, also kompiliert er ihn und gibt ihm einen blauen Punkt. Jetzt können Sie einen Komponententest dafür schreiben und testen und es könnte funktionieren, aber dann haben Sie Ihre Zeit ein zweites Mal verschwendet (zuerst für das Schreiben des Codes, dann für das Testen).

Es gibt Tools zu verfolgen, welche Code Pfade verwendet werden, wenn das Programm läuft, aber das ist nur simi-zuverlässig, da nicht alle Code Pfade jedes Mal verwendet werden. Wie dieser spezielle Code muss man Schaltjahr behandeln, es wird nur alle vier Jahre laufen. Wenn Sie es also herausnehmen, wird Ihr Programm alle vier Jahre unterbrochen.

Ich glaube, ich habe deine Frage zu DUnit und Code Coverage nicht wirklich beantwortet, aber ich denke, dass ich dir vielleicht weitere Fragen hinterlassen habe, als du angefangen hast. Nach welcher Art von Codeabdeckung suchen Sie?

UPDATE: Wenn Sie einen TDD-Ansatz verwenden, wird kein Code geschrieben, bis Sie einen Test dafür schreiben, also haben Sie von Natur aus eine 100-Testabdeckung. Natürlich, nur weil jede Methode durch einen Test ausgeübt wird, bedeutet das nicht, dass ihr gesamtes Spektrum an Verhaltensweisen ausgeübt wird. SmartInspect bietet eine wirklich einfache Methode zu messen, welche Methoden zusammen mit dem Timing usw. aufgerufen werden. Es ist ein bisschen weniger als AQTime, aber nicht frei. Mit etwas mehr Arbeit von Ihrem Teil können Sie Instrumentierung hinzufügen, um jeden Codepfad zu messen (Verzweigungen von "if" -Anweisungen, etc.) Natürlich können Sie Ihren Methoden auch Ihre eigene Protokollierung hinzufügen, um einen Abdeckungsbericht zu erstellen, und das ist kostenlos (Nun, erwarte für deine Zeit, das ist wahrscheinlich mehr wert als die Werkzeuge). Wenn Sie JEDI Debug verwenden, können Sie auch einen Call-Stack erhalten.

TDD kann nicht einfach rückwirkend auf vorhandenen Code ohne viel Refactoring angewendet werden. Obwohl die neueren Delphi-IDEs die Möglichkeit haben, Unit-Test-Stubs für jede öffentliche Methode zu generieren, erhalten Sie eine 100% ige Abdeckung Ihrer öffentlichen Methoden. Was Sie in diese Stubs schreiben, bestimmt, wie effektiv diese Abdeckung ist.

+0

Danke. Ich habe die Frage bearbeitet, um klarer zu machen, was ich meine. – jpfollenius

+0

Ich habe etwas mehr hinzugefügt, um TDD abzudecken. –

+0

"... aber das ist nur simi-zuverlässig ... Ihr Programm wird alle vier Jahre unterbrochen." Das heißt, Unit-Tests für Code, der (momentan) keine Fehler aufweist, können dazu beitragen, zu verhindern, dass der Code gelöscht wird, wenn die Code-Coverage nur in Nicht-Schaltjahren ausgeführt wird. :) Ich persönlich denke, dass alle Funktionen, die mit Daten zu tun haben, in Unit Tests mit allen Arten von Ivvy Daten ausgeübt werden sollten. Gleiches gilt für "grundlegende" Funktionen, die sich mit "Umweltfaktoren" befassen. Sie möchten nicht vom aktuellen Computer-Setup/Datum für Ihre Test-/Abdeckungsergebnisse abhängig sein. –

11

Ich kenne keine kostenlosen Tools. AQTime ist fast der Defacto-Standard für das Profiling von Delphi. Ich habe es nicht benutzt, aber eine schnelle Suche fand Discover for Delphi, die jetzt Open Source ist, aber nur Codeabdeckung.

Eines dieser Tools sollte Ihnen eine Vorstellung davon geben, wie viel Codeabdeckung Ihre Komponententests erhalten.

+0

Discover für Delphi ist jetzt Open Source https://sourceforge.net/projects/discoverd/ –

5

Ich benutze Discover for Delphi und es macht die Arbeit, für Unit-Tests mit DUnit und Funktionstests mit TestComplete.

Discover kann für die Ausführung über die Befehlszeile für die Automatisierung konfiguriert werden. Wie in:

Discover.exe Project.dpr -s -c -m 
+2

Entdecken Sie hier http://sourceforge.net/projects/discoverd/ jetzt. – philnext

2

Entdecken Sie funktioniert gut für mich. Im Gegensatz zu AQTime verlangsamt es Ihre Anwendung kaum. Das ist natürlich kein Problem für Sie. Ich denke, dass die neuesten Versionen von AQTime in dieser Hinsicht besser sind.

1

Ich benutze Discover "seit Jahren, arbeitete hervorragend bis einschließlich BDS2006 (das war die letzte pre-XE * Version von Delphi, die ich benutzt habe und immer noch benutze), aber der aktuelle offene Status, es ist unklar, wie zu machen Es funktioniert mit XE * -Versionen von Delphi Ame wirklich, weil ich dieses Werkzeug liebte, schnell und praktisch in fast jeder Hinsicht. So jetzt bin ich auf Delphi-Code-Coverage ...