Testen im Fortran-Track

Lerne, wie du deine Fortran-Übungen auf Exercism testest


Jede Übung liefert die Unit-Tests und ein CMake-Build-Rezept. Die Implementierung schreibst du selbst. Jede Testdatei wird gegen deine Implementierung gelinkt und ergibt so ein Konsolenprogramm, das die Tests ausführt. Wenn du das Testprogramm ausführst, gibt es für jeden fehlschlagenden Test eine Meldung aus und meldet einen Exit-Status ungleich null, sobald Tests fehlschlagen.

Die Testdatei heißt <exercise>_test.f90, für die Übung „Bob“ ist die Datei mit den Tests also bob_test.f90. Jeder Test hat einen Kommentar, der den Test beschreibt, und danach den eigentlichen Test, der mit call assert_equal beginnt, z. B.

  ! Test 16: non-letters with question
  call assert_equal("Sure.", hey(":) ?"), "non-letters with question")

Um einen Test zu deaktivieren, kommentierst du ihn einfach mit einem '!' aus, z. B.

  ! Test 16: non-letters with question
  ! call assert_equal("Sure.", hey(":) ?"), "non-letters with question")

Eine Übung durchzuarbeiten läuft so ab:

  • Den ersten Build mit CMake erstellen
  • Für jeden Unit-Test:
    • Die Kompilierfehler beheben, damit der Test fehlschlägt.
    • Genau so viel implementieren, dass der Test besteht.
    • Deine Implementierung refaktorieren, um die Lesbarkeit zu verbessern, Duplikate zu reduzieren usw.
    • Den nächsten Test einkommentieren

Den ersten Build mit CMake erstellen

Jede Übung bringt eine CMakeLists.txt-Datei zusammen mit den Unit-Tests mit. Sie enthält das fertige CMake-Rezept, das den Build für dich übernimmt. Du solltest diese Datei nicht bearbeiten müssen. Das mitgelieferte Rezept geht davon aus, dass deine Implementierung in einer Quelldatei liegt, die nach der Übung benannt ist.

Zum Beispiel erwartet die Übung „Bob“ eine Implementierung in der Datei bob.f90.

Erstelle deine ersten Implementierungsdateien, bevor du CMake ausführst. Wenn du die Datei bob.f90 beim Ausführen von CMake für die Übung „Bob“ nicht hast, erzeugt CMake einen Fehler darüber, dass Dateien nicht gefunden werden. Diese Dateien dürfen leer sein, aber sie müssen existieren.

Mit diesem Rezept kann CMake ein passendes Projekt für deine Umgebung erzeugen, indem du cmake -G mit einem passenden Generator und dem Pfad zum Verzeichnis der Übung ausführst. CMake erzeugt ein Build-Skript, das zu deinem Betriebssystem passt. Damit diese generierten Dateien von deinem Übungsquellcode getrennt bleiben, ist es üblich, ein Verzeichnis namens build anzulegen, das sowohl die generierten Build-Dateien als auch den kompilierten Code enthält.

So bleibt dein Übungsordner übersichtlich und aufgeräumt.

**Hinweis: Wenn cmake zum ersten Mal aufgerufen wird, wird die testlib automatisch heruntergeladen. Die testlib wird benötigt, damit die Unit-Tests funktionieren.

Da du CMake ausführen wirst, um die Build-Anweisungen für jede Übung zu erstellen, möchtest du vielleicht ein Bash-Skript (Linux/MacOS) oder eine Batchdatei (Windows) für diesen Befehl anlegen.

Sobald CMake die Build-Umgebung erstellt hat, kannst du deinen Code mit dem passenden Befehl für deine Umgebung bauen:

  • Linux mit make: make
  • Windows mit Visual Studio: Wähle im Menü Build / Build Solution aus.
  • Windows mit MingW: mingw32-make.exe
  • Windows mit nMake: nmake.exe
  • MacOS mit Xcode: Wähle Build aus der Symbolleiste aus.

Beispiele für das Ausführen von CMake in verschiedenen Umgebungen findest du unten.

Linux\MacOS mit Make

Der Generatorname für CMake ist Unix Makefiles. Angenommen, die aktuelle Übung ist bob und wir sind im Übungsordner:

$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" ..
$ make

Dieses Beispiel zeigt, wie du leere Dateien für die Implementierung anlegst, bevor du CMake ausführst.

Tippe einfach make im Build-Verzeichnis ein, um die Tests zu kompilieren. Das sollte Kompilierfehler erzeugen. Sobald die Fehler behoben sind, führe make erneut aus. Wenn alle Build-Fehler behoben sind, führe die Tests aus:

$ ctest -V

Windows mit Visual Studio 2017

Der Generatorname für CMake ist Visual Studio 15. Derselbe Generator unterstützt alle IDE-Editionen von Visual Studio 2017: Community, Professional und Enterprise. Angenommen, die aktuelle Übung ist bob und wir sind im Übungsordner:

> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "Visual Studio 15" ..

Dieses Beispiel zeigt, wie du leere Dateien für die Implementierung anlegst, bevor du CMake ausführst.

Windows mit MingW

Der Generatorname für CMake ist MinGW Makefiles. Angenommen, die aktuelle Übung ist bob und wir sind im Übungsordner:

> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "MinGW Makefiles" ..

Dieses Beispiel zeigt, wie du leere Dateien für die Implementierung anlegst, bevor du CMake ausführst.

Tippe einfach make im Build-Verzeichnis ein, um die Tests zu kompilieren. Das sollte Kompilierfehler erzeugen. Sobald die Fehler behoben sind, führe make erneut aus. Wenn alle Build-Fehler behoben sind, führe die Tests aus:

MacOS mit Xcode

Der Generatorname für CMake ist Xcode. Angenommen, die aktuelle Übung ist bob und wir sind im Übungsordner:

$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G Xcode ..

Dieses Beispiel zeigt, wie du leere Dateien für die Implementierung anlegst, bevor du CMake ausführst.

Tippe einfach make im Build-Verzeichnis ein, um die Tests zu kompilieren. Das sollte Kompilierfehler erzeugen. Sobald die Fehler behoben sind, führe make erneut aus. Wenn alle Build-Fehler behoben sind, führe die Tests aus:

$ ctest -V

Testlib

Die Tests hängen von einer kleinen Bibliothek namens testlib ab, die von GitHub heruntergeladen wird, wenn der Build zum ersten Mal mit cmake konfiguriert wird.

Falls der Download fehlschlägt, kannst du ihn manuell durchführen, z. B.

mkdir testlib
cd testlib
wget https://raw.githubusercontent.com/exercism/fortran/master/testlib/CMakeLists.txt
wget https://raw.githubusercontent.com/exercism/fortran/master/testlib/TesterMain.f90