Testen im D-Track

Erfahre, wie du deine D-Übungen auf Exercism testest


Jede Übung liefert die Unit-Tests. Du lieferst die Implementierung. Jede Datei erzeugt ein ausführbares Konsolenprogramm, das die Tests ausführt. Wenn du das Testprogramm ausführst, werden für jeden fehlgeschlagenen Test Meldungen ausgegeben, und wenn Tests fehlschlagen, wird ein Exit-Code ungleich null gemeldet.

Hinweis: Dein Code wird jedes Mal gegen die Testsuite getestet, wenn du dein Projekt baust. Wenn dein Code einen oder mehrere Tests nicht besteht, aber gültiger D-Code ist, wird er trotzdem kompiliert.

Bei jeder Übung gehst du so vor:

  • Die Tests mit dub test ausführen
    • Wenn du dich entschieden hast, DUB nicht zu installieren, verwendest du stattdessen dmd source/*.d -de -w -main -unittest und führst anschließend die erzeugte Binärdatei aus.
  • Für jeden Unit-Test:
    • Behebe die Kompilierfehler, damit der Test fehlschlägt.
    • Implementiere gerade so viel, dass der Test besteht.
    • Refaktoriere deine Implementierung, um die Lesbarkeit zu verbessern, Duplikate zu reduzieren usw.
    • Aktiviere den nächsten Test

Hinweis: D unterstützt Unit-Tests direkt in der Sprache, deshalb stehen die Unit-Tests normalerweise in derselben Datei wie die Implementierung. Die Unit-Tests werden vor dem Rumpf von main ausgeführt und im fertigen ausführbaren Programm über den Compiler-Schalter -unittest aktiviert.

Die Ausgabe der Unit-Tests interpretieren

Wenn alle Tests erfolgreich sind, könnte die Testausgabe so aussehen

$ dub test
             Generating test runner configuration 'dnd-character-test-library' for 'library' (library).
    Starting Performing "unittest" build using dmd for x86_64.
    Building dnd-character ~master: building configuration [dnd-character-test-library]
     Linking dnd-character-test-library
     Running dnd-character-test-library
1 modules passed unittests

Bei fehlgeschlagenen Tests kann die Testausgabe schwer zu lesen sein.

$ dub test
             Generating test runner configuration 'dnd-character-test-library' for 'library' (library).
    Starting Performing "unittest" build using dmd for x86_64.
    Building dnd-character ~master: building configuration [dnd-character-test-library]
     Linking dnd-character-test-library
     Running dnd-character-test-library
core.exception.AssertError@source/dnd_character.d(102): unittest failure
----------------
??:? _d_unittestp [0x5568ff91bf05]
source/dnd_character.d:102 void dnd_character.__unittest_L30_C1() [0x5568ff911fee]
??:? void dnd_character.__modtest() [0x5568ff913760]
??:? int core.runtime.runModuleUnitTests().__foreachbody6(object.ModuleInfo*) [0x5568ff928f82]
??:? int object.ModuleInfo.opApply(scope int delegate(object.ModuleInfo*)).__lambda2(immutable(object.ModuleInfo*)) [0x5568ff9148f7]
??:? int rt.minfo.moduleinfos_apply(scope int delegate(immutable(object.ModuleInfo*))).__foreachbody2(ref rt.sections_elf_shared.DSO) [0x5568ff92003f]
??:? int rt.sections_elf_shared.DSO.opApply(scope int delegate(ref rt.sections_elf_shared.DSO)) [0x5568ff9200d1]
??:? int rt.minfo.moduleinfos_apply(scope int delegate(immutable(object.ModuleInfo*))) [0x5568ff91ffcd]
??:? int object.ModuleInfo.opApply(scope int delegate(object.ModuleInfo*)) [0x5568ff9148c9]
??:? runModuleUnitTests [0x5568ff928db7]
??:? void rt.dmain2._d_run_main2(char[][], ulong, extern (C) int function(char[][])*).runAll() [0x5568ff91d248]
??:? void rt.dmain2._d_run_main2(char[][], ulong, extern (C) int function(char[][])*).tryExec(scope void delegate()) [0x5568ff91d1d5]
??:? _d_run_main2 [0x5568ff91d13e]
??:? _d_run_main [0x5568ff91cf27]
/usr/include/dmd/druntime/import/core/internal/entrypoint.d:29 main [0x5568ff90f8f1]
??:? [0x7f473154a249]
??:? __libc_start_main [0x7f473154a304]
??:? _start [0x5568ff90f7e0]
1/1 modules FAILED unittests
Error Program exited with code 1

Dort steht ein ausführlicher Stacktrace, aber die wichtige Zeile ist die über ----------------

core.exception.AssertError@source/dnd_character.d(102): unittest failure

Diese Zeile sagt dir, dass die fehlgeschlagene Assertion in Zeile 102 der Datei dnd_character.d steht. Damit kannst du genau den Test finden, der die Erwartungen nicht erfüllt.