Δοκιμές στο track της D

Μάθε πώς να δοκιμάζεις τις ασκήσεις σου σε D στο Exercism


Κάθε άσκηση παρέχει τις δοκιμές μονάδας. Την υλοποίηση τη γράφεις εσύ. Κάθε αρχείο θα παράγει ένα εκτελέσιμο για την κονσόλα που τρέχει τις δοκιμές. Το εκτελέσιμο των δοκιμών, όταν το τρέξεις, τυπώνει μηνύματα για κάθε αποτυχημένη δοκιμή και αναφέρει μη μηδενική κατάσταση εξόδου όταν οι δοκιμές αποτύχουν.

Σημείωση Ο κώδικάς σου δοκιμάζεται με το σύνολο δοκιμών κάθε φορά που χτίζεις το project σου. Αν ο κώδικάς σου δεν περνάει τη μία ή περισσότερες δοκιμές αλλά είναι έγκυρος κώδικας D, θα μεταγλωττιστεί παρ' όλα αυτά.

Η πορεία σε κάθε άσκηση είναι μια διαδικασία:

  • Τρέχεις τις δοκιμές με dub test
    • Αν έχεις επιλέξει να μην εγκαταστήσεις το DUB, θα χρησιμοποιήσεις αντ' αυτού 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. Μπορείς να το χρησιμοποιήσεις για να εντοπίσεις με ακρίβεια τη δοκιμή που δεν ανταποκρίνεται στις προσδοκίες.