Exercism-এ আপনার D অনুশীলনীগুলো কীভাবে টেস্ট করবেন শিখুন
প্রতিটি অনুশীলনী ইউনিট টেস্ট সরবরাহ করে। ইমপ্লিমেন্টেশনটি আপনাকে নিজে লিখতে হবে। প্রতিটি ফাইল একটি কনসোল এক্সিকিউটেবল তৈরি করবে, যা টেস্টগুলো রান করে। টেস্ট এক্সিকিউটেবল রান করলে প্রতিটি ফেল করা টেস্টের জন্য মেসেজ প্রিন্ট হয় এবং টেস্ট ফেল করলে একটি অ-শূন্য এক্সিট স্ট্যাটাস রিপোর্ট করে।
দ্রষ্টব্য আপনি প্রতিবার আপনার প্রজেক্ট বিল্ড করলেই টেস্ট স্যুটের বিপরীতে আপনার কোড পরীক্ষা করা হয়। আপনার কোড এক বা একাধিক টেস্ট পাস না করলেও, যদি সেটি বৈধ 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 ফাইলের লাইন ১০২-এ। এটি দিয়ে আপনি কোন টেস্টটি প্রত্যাশা পূরণ করছে না, তা সঠিকভাবে চিহ্নিত করতে পারেন।