设置
clojure.test
建立在一个想法上,即测试将调用一个断言函数,该函数将直接调用一个报告函数:is
调用 report
(通过 do-report
)。函数 report
是一个多方法,允许添加或覆盖密钥以实现替代的报告样式。它也是动态的,旨在在要使用全新的报告系统(TAP、JUnit 等)时重新绑定。
问题
如优秀的 kaocha 源代码 所讨论,这两种方法不兼容,这导致用户遇到了诸如 kaocha 的解决方案(以及猴子修补)、leiningen 的猴子修补、由于绑定 report
(绑定),Cursive 的测试运行程序始终不与其他工具集成等问题。
Alessandra Sierra 在尝试对 clojure.test
进行后续操作并创建了名为 Lazytest(我在过去一年中将其复活)的程序时Writing 也谈到了这个问题。她最终没有完成库,以及许多用于 Clojure 测试的其他替代方案都没有像人们希望的那样成功。
鉴于 clojure.test
将会继续存在,似乎明智地是让它更容易使用和适应,而无需更改基本 api。
潜在解决方案
将“要重新绑定的动态变量”从“默认报告函数”中分离出来,将使库和工具更容易选择扩展 report
或完全替换它,而无需担心它们会相互冲突或相撞。这可以通过向 clojure.test
添加一个新的动态变量 *reporter*
并使其调用 do-report
来实现,默认将 *reporter*
设置为 clojure.test/report
。(report
会保持动态,以避免改变正在运行的代码。)
此更改到位后,许多解决方案,如.Leiningen 的猴子补丁,只需將*report*
绑定到新函数,无需担心踩到任何其他库的“脚”。