2011-01-30 161 views
14

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

但是,目前Clojure代码似乎更倾向于使用“(run-all-tests)”和朋友通过clojure.test API完成单元测试。

是否有一种很好的方式来将这些Clojure测试包装在某种包装中,以便它们可以从JUnit自动调用?

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

+2

我可能会向行家依靠leiningen – 2011-01-31 01:36:32

回答

3

做会叫的最简单的事情run-all-tests来自单个JUnit测试。您可以捕获输出并查看指示通过/失败/错误计数的最后一行。如果您看到失败或错误,您可以使JUnit测试失败。但是,如果你想与每个Clojure测试交互,你必须实现与clojure.test中发现的功能类似的功能。也就是说,每个名称空间中的每个值都会查找存储在元数据值中的函数。该值是您的测试功能。

test.clj的第661-686行给出了测试如何存储并随后在Clojure中运行的一个很好的概要。

2

目前没有JUnit集成我知道。除了要求从单一的JUnit测试运行所有测试,建议由@psyllo可以如下建立更深入的整合:

  1. 建立,对于Clojure中定义的每个测试方法生成的junit.framework.Test实例的功能。看看clojure.test/test-ns如何找到所有的测试方法。
  2. 创建一个junit.framework.TestSuite的实例,它将所有生成的测试添加到特定的ns和AOT中,以编译此套件类。
  3. 您可以从java/junit中调用套件类。