آشنایی با مولدهای تست

یاد بگیرید مسیر Clojure چگونه از مولدهای تست برای تولید تست تمرین‌ها استفاده می‌کند


مسیر Clojure از یک مولد test برای تولید خودکار testهای تمرینهای عملی استفاده می‌کند. این مولد از این واقعیت بهره می‌برد که بیشتر تمرین‌هایی که در مخزن problem-specifications تعریف شده‌اند، یک فایل canonical-data.json هم دارند؛ فایلی که ورودی‌ها و خروجی‌های استانداردشده‌ی test را در خود دارد و می‌توان از آن‌ها برای پیاده‌سازی تمرین استفاده کرد.

مراحل

برای تولید testهای یک تمرین عملی، مولد test این کارها را انجام می‌دهد:

  1. موارد test تمرین را از فایل canonical-data.json آن می‌خواند
  2. از فایل tests.toml برای کنار گذاشتن موارد test کنارگذاشته‌شده استفاده می‌کند
  3. موارد test را تغییر می‌دهد (اختیاری)
  4. موارد test را با استفاده از قالب مولد تمرین رندر می‌کند
  5. قالب رندرشده را با cljfmt قالب‌بندی می‌کند
  6. قالب قالب‌بندی‌شده را در فایل test تمرین می‌نویسد

مرحله ۱: خواندن فایل canonical-data.json

مولد test، موارد test را از فایل canonical-data.json تمرین و با استفاده از کتابخانه‌ی clojure/data.json تجزیه می‌کند.

از آنجا که برخی داده‌های canonical از تودرتویی استفاده می‌کنند، هر مورد test تجزیه‌شده یک فیلد اضافی path هم دارد که ویژگی‌های description عناصر والد و همچنین ویژگی description خود مورد test را در بر می‌گیرد.

توجه: کلیدها به‌صورت keyword تجزیه می‌شوند.

مرحله ۲: حذف testهای کنارگذاشته‌شده از فایل tests.toml

هر تمرین یک فایل tests.toml دارد که در آن می‌توان هر test را به‌صورت جداگانه کنار گذاشت یا غیرفعال کرد. مولد test هر مورد testی را که کنارگذاشته‌شده علامت خورده باشد (include = false)، حذف می‌کند.

مرحله ۳: تغییر دادن موارد test (اختیاری)

بعضی تمرین‌ها ممکن است پیش از رندر داده‌ها به کمی دستکاری نیاز داشته باشند. برای نمونه، ممکن است بخواهید توضیحات را کوتاه‌تر کنید.

برای دستکاری موارد test، فایلی به نام .meta/generator.clj با فضای‌نام <slug>-generator تعریف کنید. برای تغییر موارد test دو راه دارید:

  • به‌روزرسانی مورد(های) test
  • افزودن یا حذف مورد(های) test

به‌روزرسانی مورد(های) test

برای به‌روزرسانی موردهای test به‌صورت جداگانه، تابع زیر را تعریف کنید:

(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 %)))

افزودن یا حذف مورد(های) test

برای افزودن یا حذف موارد test، تابع زیر را تعریف کنید:

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

اگر هر دو تابع را تعریف کنید، ابتدا add-remove-test-cases و سپس update-test-case فراخوانی می‌شود.

مرحله ۴: رندر موارد test

سپس موارد test (که ممکن است تغییر کرده باشند) به فایل .meta/generator.tpl داده می‌شوند؛ فایلی که تعیین می‌کند testها بر پایه‌ی آن موارد test چگونه رندر شوند.

مرحله ۵: قالب‌بندی قالب رندرشده با cljfmt

سپس قالب رندرشده با cljfmt قالب‌بندی می‌شود. این کار مزایای زیر را دارد:

  • تمرین‌ها به‌شکل یکسانی قالب‌بندی می‌شوند
  • لازم نیست هنگام نوشتن قالب‌ها زیاد نگران فاصله‌ها و ترازبندی باشید

مرحله ۶: نوشتن قالب رندرشده در فایل test تمرین

در پایان، خروجی قالب رندرشده در فایل test تمرین نوشته می‌شود.

قالب‌ها

قالب‌ها با کتابخانه‌ی hbs رندر می‌شوند که از نحوه‌ی نگارش handlebars پشتیبانی می‌کند (با استفاده از handlebars.java).

CLI

مولد test را به دو طریق می‌توان اجرا کرد:

  1. bin/generate-tests: تولید testها برای همه‌ی تمرین‌هایی که قالب مولد دارند
  2. bin/generate-tests <slug>: تولید testها برای تمرین مشخص‌شده، در صورتی که قالب مولد داشته باشد