Skip to main content

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 .c haben
  • Header Dateien können beliebig benannt sein.
  • Nur eine der Dateien darf eine main Funktion 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.