Aprenda a testar seus exercícios de D no Exercism
Cada exercício fornece os testes de unidade. Você escreve a implementação. Cada arquivo gera um executável de console que roda os testes. Ao rodar o executável de testes, ele imprime mensagens para cada teste que falha e retorna um status de saída diferente de zero quando os testes falham.
Observação Seu código é testado com a suíte de testes toda vez que você compila o projeto. Se o seu código não passar em um ou mais testes, mas for código D válido, ele ainda será compilado.
Resolver cada exercício é um processo de:
dub test
dmd source/*.d -de -w -main -unittest e depois rode o binário gerado.Observação: o D tem suporte a testes de unidade direto na linguagem, então normalmente os testes de unidade ficam no mesmo arquivo que a implementação. Os testes de unidade rodam antes do corpo da main e são habilitados no executável final com a opção -unittest do compilador.
Se todos os testes passarem, a saída pode ser mais ou menos assim
$ 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 saída pode ser difícil de ler quando há testes que falham.
$ 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
Há um monte de stack trace detalhado ali, mas a linha importante é a que está acima de ----------------
core.exception.AssertError@source/dnd_character.d(102): unittest failure
Essa linha indica que a asserção que falhou está na linha 102 do arquivo dnd_character.d. Você pode usar isso para localizar exatamente o teste que não está atendendo às expectativas.