تعرّف على كيفية اختبار تمارين 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. يمكنك استخدام ذلك لتحديد الاختبار الذي لا يحقق التوقعات بدقة.