了解测试生成器

了解 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中解析测试用例。

由于有些标准数据使用了嵌套结构,解析后的测试用例会额外包含一个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>:为指定的练习生成测试(前提是它有生成器模板)