JUnit 和 Clojure 单元测试

2022-09-03 16:00:54

我正在创建一个包含Clojure和Java代码的库,并希望能够在整个代码库中运行单个测试JUnit套件。似乎这应该是可能的,因为它们都在JVM上运行,并且有很好的Clojure / Java互操作。

然而,目前Clojure代码似乎更喜欢使用“(run-all-tests)”和朋友通过clojure.test API进行的单元测试。

有没有一种好方法将这些Clojure测试包装在某种包装器中,以便可以从JUnit自动调用它们?

(当我自动说时,我的意思是不诉诸于编写JUnit测试用例的手动解决方案来包装并单独调用每个Clojure测试用例:-))


答案 1

最简单的方法是从单个 JUnit 测试调用。您可以捕获输出并查看指示通过/失败/错误计数的最后一行。如果看到失败或错误,则可以使 JUnit 测试失败。run-all-tests

但是,如果你想与每个Clojure测试进行交互,你必须实现与clojure.test类似的功能。也就是说,对于每个命名空间中的每个值,查找存储在元数据值中的函数。该值是您的测试函数。:test

test.clj 的第 661-686 行很好地概述了测试是如何存储以及稍后在 Clojure 中运行的。


答案 2

目前,据我所知,没有 JUnit 集成。除了按照@psyllo从单个 JUnit 测试调用运行所有测试之外,您还可以构建更彻底的集成,如下所示:

  1. 构建一个函数,该函数为 clojure 中定义的每个测试方法生成一个实例。看看如何找到所有的测试方法。junit.framework.Testclojure.test/test-ns
  2. 创建一个实例,其中添加了为特定 ns 生成的所有测试,并且 AOT 编译此套件类。junit.framework.TestSuite
  3. 您可以从java / junit调用套件类。

推荐