تعرّف على مولّدات الاختبارات

تعرّف على كيفية استخدام مسار Clojure لمولّدات الاختبارات لتوليد اختبارات التمارين.


يستخدم مسار Clojure مولّد اختبارات لتوليد اختبارات التمارين التدريبية تلقائيًا. وهو يستفيد من كون معظم التمارين المعرّفة في مستودع problem-specifications تحتوي أيضًا على ملف canonical-data.json يضم مدخلات ومخرجات اختبار موحّدة يمكن استخدامها لتنفيذ التمرين.

الخطوات

لتوليد اختبارات تمرين تدريبي، يقوم مولّد الاختبارات بما يلي:

  1. يقرأ حالات اختبار التمرين من ملف canonical-data.json الخاص به
  2. يستخدم ملف tests.toml لحذف حالات الاختبار المستبعدة
  3. يحوّل حالات الاختبار (اختياري)
  4. يصوغ حالات الاختبار باستخدام قالب المولّد الخاص بالتمرين
  5. ينسّق القالب المُصاغ باستخدام cljfmt
  6. يكتب القالب المنسّق في ملف اختبار التمرين

الخطوة 1: قراءة ملف canonical-data.json

يحلّل مولّد الاختبارات حالات الاختبار من ملف canonical-data.json الخاص بالتمرين باستخدام مكتبة clojure/data.json.

ولأن بعض البيانات القياسية يستخدم التداخل، تتضمن حالة الاختبار المحلّلة حقلًا إضافيًا هو path يحتوي خصائص description لأي عناصر أب، وكذلك خاصية description الخاصة بحالة الاختبار نفسها.

ملاحظة: تُحلَّل المفاتيح ككلمات مفتاحية.

الخطوة 2: حذف الاختبارات المستبعدة من ملف tests.toml

لكل تمرين ملف tests.toml يمكن فيه استبعاد اختبارات فردية أو تعطيلها. وسيحذف مولّد الاختبارات أي حالات اختبار موسومة بأنها مستبعدة (include = false).

الخطوة 3: تحويل حالات الاختبار (اختياري)

قد تحتاج بعض التمارين إلى بعض التعديلات قبل إصاغة البيانات. مثلًا، قد ترغب في جعل الوصف أقل إسهابًا.

لتعديل حالات الاختبار، عرّف ملف .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 ثانيًا.

الخطوة 4: إصاغة حالات الاختبار

تُمرَّر بعد ذلك حالات الاختبار (المحوّلة إن وُجدت) إلى ملف .meta/generator.tpl، الذي يحدد كيف ينبغي إصاغة الاختبارات بناءً على تلك الحالات.

الخطوة 5: تنسيق القالب المُصاغ باستخدام cljfmt

ثم يُنسَّق القالب المُصاغ باستخدام cljfmt. ولذلك الفوائد التالية:

  • تُنسَّق التمارين باتساق
  • لا تحتاج إلى القلق كثيرًا بشأن المسافات البيضاء والمحاذاة عند كتابة القوالب

الخطوة 6: كتابة القالب المُصاغ في ملف اختبار التمرين

وأخيرًا، يُكتب ناتج القالب المُصاغ في ملف اختبار التمرين.

القوالب

تُصاغ القوالب باستخدام مكتبة hbs، التي تدعم صيغة handlebars (باستخدام handlebars.java).

واجهة سطر الأوامر

هناك أسلوبان لتشغيل مولّد الاختبارات:

  1. bin/generate-tests: توليد اختبارات كل التمارين التي لها قالب مولّد
  2. bin/generate-tests <slug>: توليد اختبارات التمرين المحدد، إذا كان له قالب مولّد