الاختبار في مسار D

تعرّف على كيفية اختبار تمارين D الخاصة بك على Exercism


يوفّر كل تمرين اختبارات الوحدة. وأنت تكتب التنفيذ. ينتج كل ملف ملفًا تنفيذيًا يعمل في الطرفية ويشغّل الاختبارات. عند تشغيل الملف التنفيذي للاختبارات، تُطبع رسالة لكل اختبار فاشل، ويُبلّغ بحالة خروج غير صفرية عند فشل الاختبارات.

ملاحظة يُختبر الكود الذي تكتبه مقابل مجموعة الاختبارات في كل مرة تبني فيها مشروعك. إذا لم يجتز كودك اختبارًا واحدًا أو أكثر لكنه كود 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. يمكنك استخدام ذلك لتحديد الاختبار الذي لا يحقق التوقعات بدقة.