设置
clojure.test
构建在这样一个想法之上:测试会调用一个断言函数,该函数直接调用报告函数:is
调用 report
(通过 do-report
)。函数 report
是一个多方法,允许添加或覆盖键以允许实现不同的报告风格。它还动态,如果需要使用全新的报告系统(TAP、JUnit 等),则可以重绑定。
问题
如优秀的 kaocha 源代码 所述,这两种方法不兼容,这导致了诸如 kaocha 的解决方案(以及猴子修补)、Leiningen 的猴子修补、Cursive 的测试运行器不总是与其他工具集成的< a rel="nofollow" href="https://clojurians.slack.com/archives/C0744GXCJ/p1720462210536379?thread_ts=1713354339.092179&cid=C0744GXCJ" target="_blank">绑定 report
等问题,以及其他问题。
Alessandra Sierra 在尝试对 clojure.test
的后续操作时也讨论了这个问题,她创建了一个名为 Lazytest 的测试框架(我在过去一年中将其复活)。她最终没有完成库的工作,并且Clojure测试的其他替代品也没有像人们所希望的那样成功。
鉴于 clojure.test
将会继续使用,因此似乎明智的做法是使其更容易使用和适应,而不改变其基本API。
潜在解决方案
将“动态变量以供重绑定”与“默认报告函数”分开,将使库和工具更容易选择扩展 report
或完全替换它,而无需担心它们是否会冲突或相互干扰。这可以通过向 clojure.test
添加一个新的动态变量 *reporter*
实现,该变量由 do-report
调用,并将 *reporter*
默认设置为 clojure.test/report
。(report
将保持动态,以避免更改现有代码。)
在实施此类更改后,Leiningen 等猴子修补 工作区可以简单地绑定 *report*
并使用新的函数,而无需担心会踩到其他Library的脚跟。