设置
clojure.test
构建在这样一个概念之上,即一个测试将调用一个断言函数,该函数直接调用一个报告函数:is
调用 report
(通过 do-report
)。函数 report
是一个多方法(multimethod),允许通过添加或覆盖键来允许实现替代报告样式。它也是动态的,旨在如果需要使用全新的报告系统(TAP、JUnit 等)则重新绑定。
问题
如优秀 kaocha 源代码中所讨论的,这两种方法不兼容,这导致了一些问题,例如 kaocha 的解决方案(以及猴子补丁),Leiningen 的猴子补丁,Cursive 的测试运行程序由于 绑定 report
而不总是与其他工具集成,以及其他问题。
Alessandra Sierra 在尝试跟随 clojure.test
的后续项目 Lazytest(我在过去一年中将其复活)时也提到了这个问题。她最终没有完成这个库,许多其他替代 Clojure 测试的方案也没有像人们希望的那样成功。
鉴于 clojure.test
会一直存在,因此似乎明智地让它更容易使用和适应,而无需更改基本 api。
潜在解决方案
将“要重新绑定的动态变量”和“默认报告函数”分开将使库和工具更易于选择扩展 report
或完全替换它,而无需担心它们会相互冲突或重叠。这可以通过向 clojure.test
添加一个新的动态变量 *reporter*
并将 *reporter*
默认设置为 clojure.test/report
来实现。(report
将保持动态,这样就不会改变正在运行的代码。)
有了这样的改变,像 Leiningen 的 猴子补丁 这样的解决方案只需将 *report*
绑定到一个新的函数上,无需担心会影响到其他库。