Tesztelés a D kurzuson

Tanuld meg, hogyan teszteld a D-s feladataidat az Exercism-ön


Minden feladat biztosítja az egységteszteket. A megvalósítást neked kell elkészítened. Minden fájl egy konzolos futtatható programot hoz létre, amely lefuttatja a teszteket. A teszt futtatható program elindítása minden sikertelen teszthez üzenetet ír ki, és ha a tesztek elbuknak, nullától eltérő kilépési státuszt jelez.

Megjegyzés Minden alkalommal, amikor felépíted a projektedet, a kódodat a tesztekkel szemben teszteljük. Ha a kódod nem megy át egy vagy több teszten, de érvényes D-kód, akkor is lefordul.

Az egyes feladatok végigvitele a következő folyamat:

  • A tesztek futtatása a dub test paranccsal
    • Ha úgy döntöttél, hogy nem telepíted a DUB-ot, helyette a dmd source/*.d -de -w -main -unittest parancsot használod, majd lefuttatod az így kapott binárist.
  • Minden egységtesztnél:
    • Oldd meg a fordítási hibákat, hogy a teszt elbukjon.
    • Pont annyit valósíts meg, hogy a teszt sikeres legyen.
    • Refaktoráld a megvalósítást az olvashatóság javítása, a duplikáció csökkentése stb. érdekében.
    • Engedélyezd a következő tesztet

Megjegyzés: A D nyelv közvetlenül támogatja az egységtesztelést, ezért az egységtesztek általában ugyanabban a fájlban vannak, mint a megvalósítás. Az egységtesztek a main törzse előtt futnak le, és a végső futtatható programban a -unittest fordítókapcsolóval kapcsolhatók be.

Az egységteszt-kimenet értelmezése

Ha minden teszt sikeres, a tesztek kimenete valahogy így nézhet ki

$ 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

A tesztek kimenete nehezen olvasható, ha vannak sikertelen tesztek.

$ 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

Sok részletes stacktrace van ott, de a fontos sor az, amelyik a ---------------- felett van.

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

Ez a sor megmutatja, hogy a sikertelen állítás a dnd_character.d fájl 102. sorában található. Ezzel pontosan beazonosíthatod azt a tesztet, amelyik nem felel meg az elvárásoknak.