C
Beispiele
Im Beispiel-Repository befinden sich Beispielaufgaben.
Tests
Tests sind mit dem eigenen Testframework CUnit zu schreiben, welches sich im Repository befindet. In der Testdatei ist zunächst das Framework zu inkludieren:
my_test.c
#include "CUnit.h"
Weiterhin muss die Testdatei eine main-Funktion haben:
my_test.c
int main(int argc, char** args){
// Optional: Alle Testfälle vorab deklarieren damit diese bei Endlosschleifen/Segmentation Faults
// in der Auswertung erscheinen - auch wenn der erste Testfall bereits zum Abbruch führt
testDeclare("fac1");
testDeclare("eratosthenes 1");
// Start des Testfalls mit dem Namen fac1
// Nach jedem `testStart` bzw. nach jedem Assert wird das Testergebnis auf dem Dateisystem zwischengespeichert.
// Kommt es bei einem Testfall zu einer Endlosschleife oder zu einem Segmentation Fault, wird die
// Auswertung abgebrochen. Durch die Zwischenspeicherung kann der Testfall identifiziert werden
// bei dem das aufgetreten ist.
// Achtung: Setup-Logik bei der Methoden in der Lösung aufgerufen werden lieber nach testStart
// ausführen. Ansonsten ist später nicht nachvollziehbar, wo die Ursache des Crashs oder der
// Endlosschleife liegt.
testStart("fac1");
assertIntEq("Fakultät von 5", 120, factorial(5));
testStart("eratosthenes 1");
bool ar [10] = {false,false,false,false,false,false,false,false,false,false};
eratosthenes(ar,10);
// Sobald eine Assertion für einen Testfall eintrifft, werden alle folgende Assertions ignoriert
// bis mit `testStart` ein neuer Testfall eröffnet wird. Das Verhalten entspricht somit dem von
// JUnit.
assertTrue("array[0] muss true sein, denn 2 ist Primzahl",ar[0]);
assertTrue("array[1] muss true sein, denn 3 ist Primzahl",ar[1]);
// Durch das Testframework reservierten Speicher freigeben, nicht vergessen
shutdown();
return 0;
}
Es gibt derzeit folgende Assertions:
bool assertTrue(char* message, bool val);bool assertIntEq(char* message, int expected, int found);bool assertDoubleEq(char* message, double expected, double found);bool assertStringEq(char* message,char* expected,char* this);
Speicheranalyse
Durch Inkludieren der Datei MemoryTest.h werden Aufrufe von free sowie malloc und calloc
gezählt und das Ergebnis nach der Testausführung mit als Feedback gegeben.
MemoryTest.h
#include <stdlib.h>
extern unsigned int speicherAlloc;
extern unsigned int speicherFree;
#define free(m)((speicherFree++,free(m)))
#define malloc(m)((speicherAlloc++,malloc(m)))
#define calloc(m,s)((speicherAlloc++,calloc(m,s)))
Konventionen
- Quelldateien müssen die Endung
.chaben - Header Dateien können beliebig benannt sein.
- Nur eine der Dateien darf eine
mainFunktion haben.
Umgebungen
Das Testframework CUnit ist hinterlegt. Zusätzliche Bibliotheken sind in der Testumgebung bisher
nicht installiert. Lediglich math.h wird vom Linker berücksichtigt mit -m.