Clojureトラックが演習のテストを生成するためにテストジェネレーターをどう使っているかを学びます。
Clojureトラックでは、テストジェネレーターを使ってプラクティス演習のテストを自動生成しています。
これは、problem-specificationsリポジトリで定義されているほとんどの演習にcanonical-data.jsonファイルが付属していることを利用しています。このファイルには、演習を実装するために使える標準化されたテストの入力と出力が含まれています。
プラクティス演習のテストを生成するために、テストジェネレーターは次の処理を行います。
canonical-data.jsonファイルからテストケースを読み込むtests.tomlファイルを使って、除外されたテストケースを省略するcanonical-data.jsonファイルを読み込むテストジェネレーターは、clojure/data.jsonライブラリを使って、演習のcanonical-data.jsonからテストケースを解析します。
カノニカルデータには入れ子になっているものもあるため、解析されたテストケースには、親要素のdescriptionプロパティと、そのテストケース自身のdescriptionプロパティを含むpathフィールドが追加されます。
注:キーはキーワードとして解析されます。
tests.tomlファイルから除外されたテストを省略する各演習にはtests.tomlファイルがあり、個々のテストを除外したり無効にしたりできます。
テストジェネレーターは、除外済み(include = false)とマークされたテストケースを削除します。
演習によっては、データをレンダリングする前に少し調整が必要な場合があります。 たとえば、説明をより簡潔にしたい場合があります。
テストケースを調整するには、<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
)
_両方_の関数を定義した場合、add-remove-test-casesが先に呼ばれ、update-test-caseが次に呼ばれます。
(変換された可能性のある)テストケースは、.meta/generator.tplファイルに渡されます。このファイルは、それらのテストケースに基づいてテストをどのようにレンダリングするかを定義します。
次に、レンダリングされたテンプレートがcljfmtでフォーマットされます。 これには次のようなメリットがあります。
最後に、レンダリングされたテンプレートの出力が演習のテストファイルに書き込まれます。
テンプレートはhbsライブラリを使ってレンダリングされます。このライブラリはhandlebars構文をサポートしています(handlebars.javaを使用)。
テストジェネレーターの実行方法は2つあります。
bin/generate-tests:ジェネレーターテンプレートを持つすべての演習のテストを生成するbin/generate-tests <slug>:指定した演習がジェネレーターテンプレートを持つ場合、その演習のテストを生成する