Test در مسیر D

بیاموزید چطور تمرین‌های D خود را در Exercism Test کنید.


هر تمرین تست‌های واحد را فراهم می‌کند. شما پیاده‌سازی را ارائه می‌دهید. هر فایل یک فایل اجرایی کنسولی تولید می‌کند که تست‌ها را اجرا می‌کند. اجرای فایل اجرایی تست برای هر تست شکست‌خورده پیام‌هایی چاپ می‌کند و وقتی تست‌ها شکست بخورند، وضعیت خروج غیرصفر گزارش می‌کند.

توجه کد شما هر بار که پروژه‌تان را بیلد می‌کنید در برابر مجموعه تست آزمایش می‌شود. اگر کد شما یکی از تست‌ها یا چند تست را پاس نکند اما کد 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

آن خط به شما می‌گوید که ادعای شکست‌خورده در خط ۱۰۲ از فایل dnd_character.d قرار دارد. می‌توانید از آن استفاده کنید تا تستی را که انتظارات را برآورده نمی‌کند دقیقاً پیدا کنید.