Tagesarchiv für den 24. Juli 2009

Unit-Tests mit check

Freitag, den 24. Juli 2009

Vor rund drei Wochen hatten wir hier “Kick-Off” eines brandneuen Software-Projektes. Das Thema dieser Software liegt mir schon seit Jahren am Herzen, und endlich sind Zeit und Kapazitäten da um das umzusetzen (wer mich etwas genauer kennt weiß wahrscheinlich um was es da geht - aber bitte vorerst noch nichts verraten!).

Die Software wird in C/C++ geschrieben und täglich in einem automatisierten Test-Lauf auf (fast) allen unterstützten Plattformen geprüft, unter anderem auf OpenSolaris, FreeBSD und diversen Linux-Distributionen. Hierfür werkelt ein XEN-Server, auf dem per Cron-Job werktäglich jede Nacht auf jeder DomU der aktuelle Sourcecode aus dem zentralen Subversion-Repository ausgecheckt, compiliert und getestet wird.

Um dieses Setup kümmert sich ein eigener Mitarbeiter bei uns, der alleine mit der Portierung (systemspezifische Init-Scripte usw.) und der Pflege der Testumgebung fast Vollzeit beschäftigt ist. Noch ist der Code ja eher übersichtlich: es steht gerade mal ein Codegerüst, mit dem sich ein Serverprozess starten und kontrollieren lässt, die übliche Log-Datei und PID-Datei schreibt sowie seine Konfigurationsdatei liest.

Für das Lesen der Konfigurationsdatei habe ich “keine Kosten und Mühen gescheut”™ und einen eigenen Parser mittels flex und bison geschrieben. War irgendwie ganz witzig - mein letzter Kontakt mit Parser-Entwicklung war im Studium, zum Nachgucken habe ich in meine damaligen Übungsprogramme vom Herbst 2001 (!) geschaut. 8-) Da wir aber zukünftig noch mehr mit Parsern machen werden, war dieser Schritt schonmal eine ganz praktische Auffrischung.

Für das automatisierte Testen setzen wir nach einigen Überlegungen nun auf check. Hierbei handelt es sich um eine u.a. von JUnit inspirierte, kleine aber feine Test-Bibliothek für C/C++-Anwendungen; mit ein paar Patches läuft die sogar unter Windows. Für den Konfigurations-Parser habe ich eben gleich die ersten Unit-Tests geschrieben. :-)

Wie wichtig (sinnvolle und umfangreiche) Unit-Tests für die Qualitätssicherung einer Software sind sollte ja hoffentlich bekannt sein. Die Entwicklung der Tests bremst natürlich anfangs ein wenig aus - dennoch ist es ein gutes Gefühl, mit dem Schreiben der Unit-Tests die Entwicklung einer Komponente ordentlich und ruhigen Gewissens abschließen zu können.
Das zweitwichtigste Werkzeug in unserer Entwicklung ist Valgrind. Die Unit-Test machen neben einer Funktionsprüfung nach Möglichkeit auch so eine Art “Lasttest”; dieser wird mit Valgrind analysiert um eventuelle Memory Leaks zu erkennen und dank Profiling zu optimieren.

Jedenfalls macht es schon jetzt viel Spaß, eine Software mal so “richtig ordentlich” zu entwickeln. :-)