Aprende a probar tus ejercicios de D en Exercism
Cada ejercicio proporciona las pruebas unitarias. Tú aportas la implementación. Cada fichero produce un ejecutable de consola que ejecuta las pruebas. Al ejecutar el ejecutable de pruebas, se imprimen mensajes para cada prueba que falla y se notifica un código de salida distinto de cero cuando las pruebas fallan.
Nota: Tu código se somete a la suite de pruebas cada vez que compilas tu proyecto. Si tu código no pasa una o varias pruebas pero es código D válido, se compilará de todos modos.
Trabajar en cada ejercicio es un proceso que consiste en:
dub test
dmd source/*.d -de -w -main -unittest y después ejecutarías el binario resultante.Nota: D admite las pruebas unitarias directamente en el lenguaje, así que normalmente las pruebas unitarias se encuentran en el mismo fichero que la implementación. Las pruebas unitarias se ejecutan antes del cuerpo de main y se habilitan en el ejecutable final usando la opción del compilador -unittest.
Si todas las pruebas se superan, la salida de las pruebas podría ser similar a esta
$ 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
La salida de las pruebas puede ser difícil de leer cuando hay pruebas que fallan.
$ 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
Hay una traza de pila muy detallada ahí, pero la línea importante es la que está encima de ----------------
core.exception.AssertError@source/dnd_character.d(102): unittest failure
Esa línea te indica que la aserción que falla está en la línea 102 del fichero dnd_character.d. Puedes usar eso para localizar la prueba que no cumple las expectativas.