テストジェネレーターについて学ぶ

Clojureトラックが演習のテストを生成するためにテストジェネレーターをどう使っているかを学びます。


Clojureトラックでは、テストジェネレーターを使ってプラクティス演習のテストを自動生成しています。 これは、problem-specificationsリポジトリで定義されているほとんどの演習にcanonical-data.jsonファイルが付属していることを利用しています。このファイルには、演習を実装するために使える標準化されたテストの入力と出力が含まれています。

手順

プラクティス演習のテストを生成するために、テストジェネレーターは次の処理を行います。

  1. 演習のcanonical-data.jsonファイルからテストケースを読み込む
  2. tests.tomlファイルを使って、除外されたテストケースを省略する
  3. テストケースを変換する(任意)
  4. 演習のジェネレーターテンプレートを使ってテストケースをレンダリングする
  5. レンダリングされたテンプレートをcljfmtでフォーマットする
  6. フォーマットされたテンプレートを演習のテストファイルに書き込む

ステップ1:canonical-data.jsonファイルを読み込む

テストジェネレーターは、clojure/data.jsonライブラリを使って、演習のcanonical-data.jsonからテストケースを解析します。

カノニカルデータには入れ子になっているものもあるため、解析されたテストケースには、親要素のdescriptionプロパティと、そのテストケース自身のdescriptionプロパティを含むpathフィールドが追加されます。

注:キーはキーワードとして解析されます。

ステップ2:tests.tomlファイルから除外されたテストを省略する

各演習にはtests.tomlファイルがあり、個々のテストを除外したり無効にしたりできます。 テストジェネレーターは、除外済み(include = false)とマークされたテストケースを削除します。

ステップ3:テストケースを変換する(任意)

演習によっては、データをレンダリングする前に少し調整が必要な場合があります。 たとえば、説明をより簡潔にしたい場合があります。

テストケースを調整するには、<slug>-generator名前空間を持つ.meta/generator.cljファイルを定義します。 テストケースを変換する方法は2つあります。

  • テストケースを更新する
  • テストケースを追加・削除する

テストケースを更新する

個々のテストケースを更新するには、次の関数を定義します。

(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を使用)。

コマンドラインインターフェース

テストジェネレーターの実行方法は2つあります。

  1. bin/generate-tests:ジェネレーターテンプレートを持つすべての演習のテストを生成する
  2. bin/generate-tests <slug>:指定した演習がジェネレーターテンプレートを持つ場合、その演習のテストを生成する