بیاموزید چطور تمرینهای D خود را در Exercism Test کنید.
هر تمرین تستهای واحد را فراهم میکند. شما پیادهسازی را ارائه میدهید. هر فایل یک فایل اجرایی کنسولی تولید میکند که تستها را اجرا میکند. اجرای فایل اجرایی تست برای هر تست شکستخورده پیامهایی چاپ میکند و وقتی تستها شکست بخورند، وضعیت خروج غیرصفر گزارش میکند.
توجه کد شما هر بار که پروژهتان را بیلد میکنید در برابر مجموعه تست آزمایش میشود. اگر کد شما یکی از تستها یا چند تست را پاس نکند اما کد 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
آن خط به شما میگوید که ادعای شکستخورده در خط ۱۰۲ از فایل dnd_character.d قرار دارد.
میتوانید از آن استفاده کنید تا تستی را که انتظارات را برآورده نمیکند دقیقاً پیدا کنید.