Як тестувати вправи з D на Exercism
Кожна вправа надає модульні тести. Реалізацію надаємо ми. Кожен файл створює консольний виконуваний файл, який запускає тести. Запуск виконуваного файлу з тестами виводить повідомлення для кожного невдалого тесту та повертає ненульовий код виходу, коли тести не проходять.
Зауваження Ваш код перевіряється набором тестів щоразу, коли ми збираємо свій проєкт. Якщо код не проходить один або більше тестів, але є коректним кодом 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. Так ми можемо визначити, який саме тест не відповідає очікуванням.