Ich werde nächste Woche in meiner Abteilung einen Vortrag über Unit-Tests und testgetriebene Entwicklung halten. Als Teil davon werde ich einige reale Beispiele aus einem Code zeigen, den ich kürzlich geschrieben habe, aber ich möchte auch einige sehr einfache Beispiele zeigen, die ich im Vortrag schreiben werde.
Ich habe im Internet nach guten Beispielen gesucht, aber ich habe mich bemüht, solche zu finden, die besonders für unseren Entwicklungsbereich geeignet sind. Fast die gesamte Software, die wir schreiben, besteht aus tief eingebetteten Steuerungssystemen, die auf kleinen Mikrocontrollern ausgeführt werden. Es gibt eine Menge C-Code, der sich leicht auf Unit-Tests anwenden lässt (ich spreche über Unit-Tests auf dem PC und nicht auf dem Ziel selbst), solange Sie sich von der „untersten“ Ebene fernhalten: dem Material, das direkt spricht zu den Mikrocontroller-Peripheriegeräten. Die meisten Beispiele, die ich gefunden habe, basieren jedoch auf der Verarbeitung von Zeichenfolgen (z. B. das hervorragende Beispiel für römische Dive Into Python-Zahlen), und da wir kaum Zeichenfolgen verwenden, ist dies nicht wirklich geeignet (was die einzigen Bibliotheksfunktionen betrifft, die in unserem Code normalerweise verwendet werden) sind memcpy
, memcmp
und memset
,strcat
oder reguläre Ausdrücke sind nicht ganz richtig).
Fahren Sie mit der Frage fort: Kann jemand einige gute Beispiele für Funktionen anbieten, mit denen ich Unit-Tests in einer Live-Sitzung demonstrieren kann? Eine gute Antwort nach meiner (vorbehaltlich Änderungen) Meinung wäre wahrscheinlich:
- Eine Funktion, die einfach genug ist, dass jeder (auch diejenigen, die nur gelegentlich Code schreiben) verstehen kann;
- Eine Funktion, die nicht sinnlos erscheint (dh das Ermitteln der Parität oder der CRC ist wahrscheinlich besser als eine Funktion, die zwei Zahlen miteinander multipliziert und eine Zufallskonstante hinzufügt);
- Eine Funktion, die kurz genug ist, um vor einem Raum von Menschen zu schreiben (ich kann die vielen Zwischenablagen von Vim nutzen, um Fehler zu reduzieren ...);
- Eine Funktion, die Zahlen, Arrays, Zeiger oder Strukturen als Parameter verwendet und etwas Ähnliches zurückgibt, anstatt Zeichenfolgen zu verarbeiten.
- Eine Funktion mit einem einfachen Fehler (z. B.
>
nicht>=
), der einfach einzufügen ist, funktioniert in den meisten Fällen noch, bricht jedoch mit einem bestimmten Randfall: Einfach zu identifizieren und mit einem Komponententest zu beheben.
Irgendwelche Gedanken?
Obwohl dies wahrscheinlich nicht relevant ist, werden die Tests selbst wahrscheinlich mit dem Google Test Framework in C ++ geschrieben: Alle unsere Header sind bereits mit dem #ifdef __cplusplus extern "C" {
Wrapper versehen. Dies hat mit den Tests, die ich bisher durchgeführt habe, gut funktioniert.
Antworten:
Hier ist eine einfache Funktion, die eine Prüfsumme über len Bytes erzeugen soll .
Es hat einen Fencepost-Bug: In der for-Anweisung sollte der Test sein
i < len
.Was Spaß macht, ist, wenn Sie es auf eine Textzeichenfolge wie diese anwenden ...
Sie erhalten die "richtige Antwort"! Das liegt daran, dass das zusätzliche Byte, das mit einer Prüfsumme versehen wurde, das Null-Zeichenfolgen-Abschlusszeichen war. Auf diese Weise können Sie diese Prüfsummenfunktion in den Code einfügen und möglicherweise sogar mit diesem Code versenden, ohne ein Problem zu bemerken - das heißt, bis Sie damit beginnen, sie auf etwas anderes als Textzeichenfolgen anzuwenden.
Hier ist ein einfacher Unit-Test, der diesen Fehler aufzeigt (meistens ... :-)
quelle
Was ist mit der Implementierung einer Sortierfunktion wie Bubble Sort ? Sobald Sie die Sortierfunktion aktiviert haben, können Sie mit der binären Suche fortfahren, die für die Einführung von Unit-Tests und TDD ebenso gut geeignet ist.
Sortieren und Suchen hängen von Vergleichen ab, was leicht zu verwechseln ist. Es beinhaltet auch das Vertauschen von Zeigern, um die herum Vorsicht geboten ist. Beides ist fehleranfällig, also zögern Sie nicht, es durcheinander zu bringen :)
Noch ein paar Ideen:
qsort
. Die Tests sollten dennoch erfolgreich sein und beweisen, dass Ihre neue Sortierfunktion auch funktioniert.quelle