2009-01-19 10 views
32

Vor ein paar Tagen begann ich in einem Unit-Test-Framework namens check, zu untersuchen, und ich beabsichtige, den Test auf c-Code unter Linux auszuführen.Ist es zu viel Aufwand, den Komponententest mit Valgrind auszuführen?

Jetzt überprüfen und einige gut gestaltete Code und einige Testcode kann mir helfen , um zu überprüfen, dass die grundlegende Funktionalität korrekt ist, Ich meine, es ist ganz einfach schauen nur auf die Variablen in und Antwort zurück und dann entscheiden, ob Eine Funktion ist korrekt oder nicht.

Aber sagen wir, ich möchte eine dynamische Speicherstruktur mit viel aus malloc und frei, testen und es stellt sich heraus, dass ich Daten eingeben und die richtigen Daten wieder heraus bekommen kann. Aber das beweist nicht, dass ich nicht einige Speicher in diesem Prozess, gebrochen habe, sagen wir, ich habe vergessen, die Hälfte aus dem Speicher zu befreien und verlor die Zeiger (ein klassisches Memleak). Dieser Code würde wahrscheinlich den Großteil der Komponententests bestehen.

So jetzt für die Frage: ist es eine gute Idee, die gesamte Einheit Testcode mit d. H. Valgrind und lassen Sie ihn irgendwelche Malloc/freie Probleme zu erkennen? (Oder vielleicht in etwas wie Electric Fence kompilieren?)

Es fühlt sich an wie eine gute Idee, aber ich bin mir nicht sicher, was ich selbst bin immer in hier .....

Dank Johan


Update: Dank Douglas und Jonathan, es so scheint, ist eine gute Idee und etwas, das ich mit :-)

-Update fortgesetzt werden sollte: Valgrind ist ein lustiges Werkzeug, aber die ersten Memleaks, die ich dabei fand, waren im Testframework und nicht mein eigener Code (ziemlich lustig). Also ein Tipp zum Rest draußen ist zu überprüfen, dass das Unit-Test-Framework, das Sie verwenden, nicht undicht ist, bevor Sie Ihren eigenen Code auf den Kopf stellen. Ein leerer Testfall war alles was in meinem Fall benötigt wurde, da seitdem nichts anderes als das Unit Test Framework läuft.

Antwort

51

Wir tun es auf jeden Fall - es ist viel einfacher Valgrind gegen die Komponententests auszuführen als mit dem vollen Programm.

Auch Speicherfehler sind auf den Bereich des Codes, den der Komponententest testet, lokalisiert, was die Fehlerbehebung erleichtert.

Plus zu überprüfen, dass Sie es behoben haben, ist einfacher - weil Sie den Komponententest nicht einen komplizierteren Test gegen Ihr komplettes Programm ausführen.

Wenn Sie valgrind in einer automatisierten Weise ausführen möchten Sie wahrscheinlich --error-exitcode=<number> [default: 0]

einen alternativen Exit-Code Gibt zurück, wenn Valgrind alle im Vorfeld Fehler gemeldet. Wenn der Standardwert (Null) eingestellt ist, wird der Rückgabewert von Valgrind immer der Rückgabewert des Prozesses sein, der simuliert wird. Bei einem Wert ungleich wird stattdessen der Wert zurückgegeben, wenn Valgrind Fehler feststellt.Diese ist nützlich für die Verwendung von Valgrind als Teil einer automatisierten Test-Suite, da es macht einfach zu erkennen, Testfälle für , die Valgrind Fehler gemeldet hat, nur durch Inspizieren Rückkehrcodes.

http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts

+0

Es gibt auch '--xml = yes' und' --xml-file = ', die das automatische Lesen der Ergebnisse erleichtern. –

10

Als Douglas Leeder sagte, es Ihre Unit-Tests mit jedem Diagnose-Software lohnt ausgeführt wird, um die Hände legen kann, die wirklich tut, wird dafür sorgen, dass es funktioniert wie erwartet. Dazu gehört auch, die Speicher nicht zu missbrauchen, also ist Valgrind eine gute Idee.

Sie möchten wirklich, dass Ihre Komponententests beweisen, dass Ihr Code funktioniert.

Sie müssen sie nicht ständig unter valgrind ausführen - aber es sollte so trivial wie möglich sein, und Sie sollten dies regelmäßig tun (sagen Sie nach großen Änderungen).

Verwandte Themen