2011-01-30 122 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中調用套件類。