Come testare nel track D

Scopri come testare i tuoi esercizi D su Exercism


Ogni esercizio fornisce i test di unità. L'implementazione la scrivi tu. Ogni file produrrà un eseguibile da console che esegue i test. Eseguire l'eseguibile dei test stampa un messaggio per ogni test che fallisce e segnala uno stato di uscita diverso da zero quando i test falliscono.

Nota: il codice viene confrontato con la suite di test ogni volta che compili il progetto. Se il codice non supera uno o più test ma è codice D valido, verrà comunque compilato.

Affrontare ogni esercizio è un percorso fatto di:

  • Eseguire i test con dub test
    • Se hai scelto di non installare DUB, userai invece dmd source/*.d -de -w -main -unittest, poi esegui il binario risultante.
  • Per ogni test di unità:
    • Risolvi gli errori di compilazione per far fallire il test.
    • Implementa solo quanto basta per far passare il test.
    • Riorganizza l'implementazione per migliorare la leggibilità, ridurre le duplicazioni, ecc.
    • Abilita il test successivo

Nota: D supporta i test di unità direttamente nel linguaggio, quindi di solito i test di unità si trovano nello stesso file dell'implementazione. I test di unità vengono eseguiti prima del corpo di main e sono abilitati nell'eseguibile finale usando l'opzione del compilatore -unittest.

Interpretare l'output dei test di unità

Se tutti i test passano, l'output dei test potrebbe essere simile a questo

$ 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

L'output dei test può essere difficile da leggere quando ci sono dei fallimenti.

$ 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

C'è una stack trace molto dettagliata, ma la riga importante è quella sopra ----------------

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

Quella riga ti dice che l'asserzione che fallisce si trova alla riga 102 del file dnd_character.d. Puoi usarla per individuare il test che non soddisfa le aspettative.