Μάθε πώς να δοκιμάζεις τις ασκήσεις σου σε D στο Exercism
Κάθε άσκηση παρέχει τις δοκιμές μονάδας. Την υλοποίηση τη γράφεις εσύ. Κάθε αρχείο θα παράγει ένα εκτελέσιμο για την κονσόλα που τρέχει τις δοκιμές. Το εκτελέσιμο των δοκιμών, όταν το τρέξεις, τυπώνει μηνύματα για κάθε αποτυχημένη δοκιμή και αναφέρει μη μηδενική κατάσταση εξόδου όταν οι δοκιμές αποτύχουν.
Σημείωση Ο κώδικάς σου δοκιμάζεται με το σύνολο δοκιμών κάθε φορά που χτίζεις το project σου. Αν ο κώδικάς σου δεν περνάει τη μία ή περισσότερες δοκιμές αλλά είναι έγκυρος κώδικας D, θα μεταγλωττιστεί παρ' όλα αυτά.
Η πορεία σε κάθε άσκηση είναι μια διαδικασία:
dub test
dmd source/*.d -de -w -main -unittest και μετά θα τρέξεις το εκτελέσιμο που θα προκύψει.Σημείωση: Η D υποστηρίζει δοκιμές μονάδας απευθείας στη γλώσσα, οπότε συνήθως οι δοκιμές μονάδας βρίσκονται στο ίδιο αρχείο με την υλοποίηση. Οι δοκιμές μονάδας εκτελούνται πριν από το σώμα της main και ενεργοποιούνται στο τελικό εκτελέσιμο με τον διακόπτη -unittest του μεταγλωττιστή.
Αν όλες οι δοκιμές περάσουν, η έξοδος των δοκιμών μπορεί να μοιάζει κάπως έτσι
$ 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
Η έξοδος των δοκιμών μπορεί να είναι δυσανάγνωστη όταν υπάρχουν αποτυχημένες δοκιμές.
$ 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
Υπάρχει πολύ αναλυτικό ίχνος στοίβας εκεί, αλλά η σημαντική γραμμή είναι αυτή πάνω από το ----------------
core.exception.AssertError@source/dnd_character.d(102): unittest failure
Αυτή η γραμμή σου λέει ότι ο αποτυχημένος ισχυρισμός βρίσκεται στη γραμμή 102 του αρχείου dnd_character.d. Μπορείς να το χρησιμοποιήσεις για να εντοπίσεις με ακρίβεια τη δοκιμή που δεν ανταποκρίνεται στις προσδοκίες.