Name

CUnit 2.1-0

Homepage

cunit.sourceforge.net
Download bei Sourceforge

Lizenz

GNU Library or Lesser General Public License (LGPL)

Untersuchte Version

2.1-0

Letzter Untersuchungszeitpunkt

24.04.2012

Kurzbeschreibung

Mit CUnit lassen sich automatisierte Tests für C-Programme erstellen. Dabei können mehrere Tests in so genannten "Suiten" zusammengefasst werden. Den "Suiten" lassen sich über init-Funktionen bestimmte Startbedingungen zuweisen, so ist gewährleistest, dass die Tests immer unter den gleichen Bedingungen laufen.

Fazit

CUnit ist ein schmales und übersichtliches Test-Framework. Dennoch bietet es alle nötigen Funktionen, um umfangreiche Test durchzuführen. Erfahrene Nutzer können sich schnell in das Framework einarbeiten. Für unerfahrene Nutzer können die kurze Dokumentation und die nicht vorhandene Nutzergemeinschaft zu Schwierigkeiten führen.

Einsatzgebiete

CUnit wird im Bereich der C-Entwicklung eingesetzt. Es ermöglicht die Erstellung von White-Box-Tests.

Einsatzumgebungen

Standalone in der Konsole nutzbar und wird nativ von Netbeans unterstützt.

Installation

Für die Installation unter Windows mit MinGW werden bereits vorkompilierte Dateien bereitgestellt. Aus dem heruntergeladenen Archiv müssen die Ordner bin, include und lib in den MinGW Ordner kopiert werden.

Alternativ lässt sich CUnit für andere Compiler oder Betriebssystem selber kompilieren. Dazu wird ftjam benötigt. Hierzu muss die Jamrules.in in Jamrules umbenannt werden. Danach ist CUnit mittels "jam -f Jambase install" kompilierbar. Die kompilierten Dateien müssen wieder zu MinGW bzw. dem jeweiligen Compiler hinzugefügt werden.

Dokumentation

CUnit bietet auf seiner Projektseite eine englischsprachige Dokumentation an. Die Dokumentation ist klar durchstrukturiert und übersichtlich. In sechs kurzen Kapiteln werden die wichtigsten Punkte von CUnit beschrieben. Neben der Dokumentation befindet sich ebenfalls auf der Seite eine Doxygen Dokumentation. Ein einführendes Beispiel lässt sich direkt auf der Seite finden.

Wartung der Projektseite

Die Projektseite ist sehr kurz gehalten. Neben der Dokumentation finden sich ein Code-Beispiel, Screenshots und Kontaktinformationen auf der Seite. Anscheinend wurde die Dokumentation zum letzten Mal im Jahr 2005 aktualisiert, als die Version 2.0 erschienen ist. Dies entspricht in etwa dem letzten großen Update des Frameworks.

Nutzergruppen und Support

Auf der Sourceforge Projektseite finden sich zwei Foren und zwei Mailinglisten. Weder die Foren noch die Mailinglisten werden aktiv betreut und genutzt. Um eine Anfrage zu stellen ist eine Registrierung erforderlich, zum Lesen ist keine Registrierung erforderlich. Die meisten Support-Anfragen bleiben dort unbeantwortet. Weiterhin sind auf der CUnit Projektseite E-Mail Adressen vorhanden.

Intuitive Nutzbarkeit

CUnit lässt sich einfach verwenden. Neue Testfälle lassen sich einfach erstellen, in dem die Test-Funktionen geschrieben werden, ggf. init- und cleanup-Funktionen für die Test-Pakete (suites). Anschließend muss die Testumgebung initialisiert werden. Die Test-Pakete werden der Testumgebung hinzugefügt. Die einzelnen Testfälle werden ihren passenden Test-Paketen zugewiesen. Als nächstes müssen die Testfälle gestartet werden. Abschließend muss die Testumgebung bereinigt werden.

Automatisierung

Durch die verschiedenen Test-Pakete (suites) lassen sich die Test organisieren und automatisiert ablaufen. Nach dem Starten der Tests ist kein weiterer Eingriff nötig.

Einführendes Beispiel

CUnit Standalone
Anhand von zwei kleinen Funktionen soll die Funktionsweise von CUnit erklärt werden. Die Funktion sumValues() addiert zwei übergebene int-Werte und die Funktion returnChar() gibt einen übergebenen Char direkt wieder zurück. Dateien:
int sumValues(int a, int b) {
	return a+b;
}

char* returnChar(char *str) {
	return str;
}
In CUnit können verschiedene Suiten angelegt werden, in den unterschiedlichen Suiten können einzelne Testfälle getestet werden. Damit gewährleistet ist, dass die Test immer zu gleichen Bedingungen ausgeführt werden bietet CUnit sogenannte init und clean Funktionen. Die init-Funktion wird vor jedem Test aufgerufen, die clean-Funktion nach jedem Test. In diesem Beispiel werden beide Funktionen nicht verwendet. In der Praxis könnten hier z.B. Variablen initialisiert werden oder Dateien ausgelesen werden.
int init_sumValuesSuite(void) {
	return 0;
}

int clean_sumValuesSuite(void) {
	return 0;
}
Für die einzelnen Testfälle werden jeweils eigene Funktionen geschrieben. In jeder Test-Funktion wird nur ein Testfall getestet. Bei den Test-Funktionen handelt es sich um einfache void-Funktionen. CU_ASSERT_TRUE(Bedingung) erwartet, dass die Bedingung true (ungleich 0) ist, wohingegen CU_ASSERT_FALSE(Bedingung) false (0) erwartet. Weitere vordefinierte Annahmen finden sich in der CUnit Dokumentation.
void test_sumValues(void) {
	CU_ASSERT_TRUE(sumValues(4,3) == 7);
	CU_ASSERT_FALSE(sumValues(4,3) == 8);
}
Nun muss noch die Testsuite erstellt werden. Dazu wird das Testframework mit CU_initialize_registry() initialisiert. Mit CU_add_suite(Name, init-Funktion, clean-Funktion) können neue Suiten erstellt werden. Die einzelnen Testfälle können mit CU_add_test(TestSuite,Name,Test-Funktion) den verschiedenen Testsuiten hinzugefügt werden. Dabei lässt sich die Zuordnung anhand der Reihenfolge organisieren. Testfälle werden immer der zuletzt erstellten Testsuite hinzufügt. Sollen verschiedene Suiten benutzt werden so wird erst die Testsuite erstellt und die zugehörigen Testfälle hinzugefügt, dann wird eine neue Testsuite erstellt und die zugehörigen Testfälle hinzufügt. CU_basic_run_test() führt die Test aus und CU_cleanup_registry() beendet das Testframework.
int main() {
	CU_pSuite suite;

	CU_initialize_registry();

	suite = CU_add_suite("sumValues Tests",init_sumValuesSuite,clean_sumValuesSuite); 
	
	CU_add_test(suite,"Sum Values", test_sumValues);
	
	...
	
	CU_basic_run_tests();
	CU_cleanup_registry();

	return 0;
}
Wird nun die kompilierte Datei aufgerufen zeigt CUnit an, ob alle Tests erfolgreich waren oder ob es zu Fehlern kam. Fehlgeschlagene Tests werden direkt zu Beginn angezeigt. Zur Veranschaulichung schlägt in diesem Beispiel ein Test fehl. Die Bedingung x!=5 ist false, da im Vorfeld x mit 5 initialisiert wurde.

CUnit mit NetBeans
NetBeans bietet von Haus aus eine Hilfe, um CUnit-Test zu erstellen. Es bietet neben einer halb-automischen Erstellung der Tests auch eine Visualisierung des Ergebnises an.

Um neue Testfälle zu erstellen klickt, man rechts auf die jeweilige C-Datei und wählt "Create Test" --> "New CUnit Test..."



Im neu geöffneten Fenster wählt man die jeweiligen Funktionen aus, die getestet werden sollen.



Ggf. den Speicherort und den Namen angeben.



Netbeans hat nun ein Grundgerüst erstellt. Die leeren Test-Funktionen müssen noch mit Inhalt gefüllt werden.
void testSumValues() {
    CU_ASSERT_TRUE(sumValues(4,3) == 7);
	CU_ASSERT_FALSE(sumValues(4,3) == 8);
}

Jetzt können die Tests durchgeführt werden. Dies geschieht mit einem Rechtsklick auf CUnit Test und dann auf Test.



Im unteren Bereich zeigt Netbeans das Ergebnis an.

Detaillierte Beschreibung

Eine detaillierte Beschreibung lässt sich in der CUnit Dokumentation finden.

Literatur

Es findet sich ein Kapitel in [Köh07].

Zurück zur Werkzeugübersicht
Zurück zur CSI-Hauptseite