認識測試產生器

了解 Clojure track 如何使用測試產生器為練習產生測試


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中的測試案例。

由於某些標準資料使用巢狀結構,解析後的測試案例會包含額外的path欄位,其中含有任何父元素的description屬性,以及測試案例本身的description屬性。

注意:鍵會解析為關鍵字。

步驟 2:從tests.toml檔案略過已排除的測試

每個練習都有一個tests.toml檔案,可在其中排除/停用個別測試。 測試產生器會移除任何標記為已排除的測試案例(include = false)。

步驟 3:轉換測試案例(選用)

有些練習在渲染資料前可能需要一些調整。 例如,你可能想讓描述不要那麼冗長。

如要調整測試案例,請定義一個帶有<slug>-generator命名空間的.meta/generator.clj檔案。 你可以用兩種方式轉換測試案例:

  • 更新測試案例
  • 新增/移除測試案例

更新測試案例

如要更新個別測試案例,請定義下列函式:

(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>:為指定的練習產生測試,前提是該練習具有產生器範本