了解 Clojure 轨道如何使用测试生成器为练习生成测试
Clojure 轨道使用测试生成器来自动生成实践练习的测试。
它利用了一个事实:problem-specifications 代码仓库中定义的大多数练习同时还带有一个canonical-data.json文件,其中包含标准化的测试输入和输出,可以用来实现该练习。
为了生成一个实践练习的测试,测试生成器会:
canonical-data.json文件中读取测试用例tests.toml文件来省略和排除测试用例canonical-data.json文件测试生成器使用 clojure/data.json 库从练习的canonical-data.json中解析测试用例。
由于有些标准数据使用了嵌套结构,解析后的测试用例会额外包含一个path字段,其中含有所有父级元素的description属性,以及该测试用例自身的description属性。
注意:键会被解析为关键字。
tests.toml文件中省略被排除的测试每个练习都有一个tests.toml文件,可以在其中排除或禁用单个测试。
测试生成器会移除所有被标记为排除(include = false)的测试用例。
有些练习可能需要在渲染数据之前做一些调整。 例如,你可能想让描述更简洁一些。
要调整测试用例,请定义一个.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
)
如果你同时定义了这两个函数,会先调用add-remove-test-cases,再调用update-test-case。
然后,(可能已被转换过的)测试用例会被传给.meta/generator.tpl文件,该文件定义了如何根据这些测试用例渲染测试。
接着使用 cljfmt 格式化渲染后的模板。 这样做有以下好处:
最后,渲染后的模板输出会被写入练习的测试文件。
模板使用 hbs 库渲染,该库支持 handlebars 语法(借助 handlebars.java)。
测试生成器有两种运行方式:
bin/generate-tests:为所有带有生成器模板的练习生成测试bin/generate-tests <slug>:为指定的练习生成测试(前提是它有生成器模板)