টেস্ট জেনারেটর সম্পর্কে জানুন

Clojure ট্র্যাক কীভাবে অনুশীলনীর টেস্ট তৈরি করতে টেস্ট জেনারেটর ব্যবহার করে, তা জানুন।


Clojure ট্র্যাক প্র্যাকটিস অনুশীলনীর টেস্ট স্বয়ংক্রিয়ভাবে তৈরি করতে একটি টেস্ট জেনারেটর ব্যবহার করে। এটি এই বিষয়টি কাজে লাগায় যে problem-specifications রিপো-তে সংজ্ঞায়িত বেশিরভাগ অনুশীলনীর একটি canonical-data.json ফাইলও থাকে, যেখানে স্ট্যান্ডার্ডাইজড টেস্ট ইনপুট ও আউটপুট থাকে, যা দিয়ে অনুশীলনীটি বাস্তবায়ন করা যায়।

ধাপ

একটি প্র্যাকটিস অনুশীলনীর টেস্ট তৈরি করতে টেস্ট জেনারেটরটি:

  1. অনুশীলনীর canonical-data.json ফাইল থেকে তার টেস্ট কেসগুলো পড়ে
  2. বাদ দেওয়া টেস্ট কেসগুলো বাদ দিতে tests.toml ফাইল ব্যবহার করে
  3. টেস্ট কেসগুলো রূপান্তর করে (ঐচ্ছিক)
  4. অনুশীলনীর জেনারেটর টেমপ্লেট ব্যবহার করে টেস্ট কেসগুলো রেন্ডার করে
  5. cljfmt দিয়ে রেন্ডার করা টেমপ্লেটটি ফরম্যাট করে
  6. ফরম্যাট করা টেমপ্লেটটি অনুশীলনীর টেস্ট ফাইলে লেখে

ধাপ ১: canonical-data.json ফাইল পড়া

টেস্ট জেনারেটরটি clojure/data.json লাইব্রেরি ব্যবহার করে অনুশীলনীর canonical-data.json থেকে টেস্ট কেসগুলো পার্স করে।

যেহেতু কিছু ক্যানোনিকাল ডেটা নেস্টিং ব্যবহার করে, তাই পার্স করা টেস্ট কেসে একটি অতিরিক্ত path ফিল্ড থাকে, যেখানে যেকোনো প্যারেন্ট এলিমেন্টের description প্রপার্টি এবং টেস্ট কেসের নিজের description প্রপার্টি থাকে।

নোট: কী (key) গুলো কিওয়ার্ড হিসেবে পার্স করা হয়।

ধাপ ২: tests.toml ফাইল থেকে বাদ দেওয়া টেস্টগুলো সরিয়ে ফেলা

প্রতিটি অনুশীলনীর একটি tests.toml ফাইল থাকে, যেখানে আলাদা আলাদা টেস্ট বাদ দেওয়া বা নিষ্ক্রিয় করা যায়। টেস্ট জেনারেটরটি বাদ দেওয়া হিসেবে চিহ্নিত (include = false) যেকোনো টেস্ট কেস সরিয়ে ফেলে।

ধাপ ৩: টেস্ট কেসগুলো রূপান্তর করা (ঐচ্ছিক)

ডেটা রেন্ডার করার আগে কিছু অনুশীলনীতে সামান্য অ্যাডজাস্টমেন্টের প্রয়োজন হতে পারে। যেমন, বর্ণনাটি আরও সংক্ষিপ্ত করতে চাইতে পারেন।

টেস্ট কেসে পরিবর্তন আনতে .meta/generator.clj নামে একটি ফাইল ডিফাইন করুন, যার নেমস্পেস হবে <slug>-generator। টেস্ট কেস রূপান্তর করার দুটি উপায় আছে:

  • টেস্ট কেস আপডেট করা
  • টেস্ট কেস যোগ করা/সরানো

টেস্ট কেস আপডেট করা

আলাদা আলাদা টেস্ট কেস আপডেট করতে, নিচের ফাংশনটি ডিফাইন করুন:

(defn update-test-case
  "Update a test case"
  [test-case]
  ;; function body
)
উদাহরণ

এই উদাহরণটি :path ভ্যালুর শেষ এলিমেন্টটি ছাড়া বাকি সব সরিয়ে ফেলে (এভাবে বর্ণনা ছোট হয়):

(ns difference-of-squares-generator)

(defn update-test-case [test-case]
  (update test-case :path #(take-last 1 %)))

টেস্ট কেস যোগ করা বা সরানো

টেস্ট কেস যোগ বা সরাতে, নিচের ফাংশনটি ডিফাইন করুন:

(defn add-remove-test-cases
  "Add/remove test case(s)"
  [test-cases]
  ;; function body
)
Note

আপনি যদি দুটি ফাংশনই ডিফাইন করেন, তাহলে আগে add-remove-test-cases কল হয় এবং পরে update-test-case।

ধাপ ৪: টেস্ট কেসগুলো রেন্ডার করা

এরপর (সম্ভাব্য রূপান্তরিত) টেস্ট কেসগুলো .meta/generator.tpl ফাইলে পাস করা হয়, যা ঠিক করে দেয় ওই টেস্ট কেসগুলোর ভিত্তিতে টেস্টগুলো কীভাবে রেন্ডার হবে।

ধাপ ৫: cljfmt দিয়ে রেন্ডার করা টেমপ্লেট ফরম্যাট করা

এরপর রেন্ডার করা টেমপ্লেটটি cljfmt দিয়ে ফরম্যাট করা হয়। এতে নিচের সুবিধাগুলো পাওয়া যায়:

  • অনুশীলনীগুলো ধারাবাহিকভাবে ফরম্যাট করা হয়
  • টেমপ্লেট লেখার সময় হোয়াইটস্পেস আর অ্যালাইনমেন্ট নিয়ে বেশি ভাবতে হয় না

ধাপ ৬: রেন্ডার করা টেমপ্লেট অনুশীলনীর টেস্ট ফাইলে লেখা

সবশেষে, রেন্ডার করা টেমপ্লেটের আউটপুট অনুশীলনীর টেস্ট ফাইলে লেখা হয়।

টেমপ্লেট

টেমপ্লেটগুলো hbs লাইব্রেরি দিয়ে রেন্ডার করা হয়, যা handlebars সিনট্যাক্স সাপোর্ট করে (handlebars.java ব্যবহার করে)।

কমান্ড-লাইন ইন্টারফেস

টেস্ট জেনারেটর চালানোর দুটি উপায় আছে:

  1. bin/generate-tests: যে সব অনুশীলনীর জেনারেটর টেমপ্লেট আছে, সেগুলোর টেস্ট তৈরি করে
  2. bin/generate-tests <slug>: নির্দিষ্ট অনুশীলনীর টেস্ট তৈরি করে, যদি তার জেনারেটর টেমপ্লেট থাকে