2010-11-24 185 views
16

讓組織接受備用JVM語言的方法之一是首先將其用於單元測試Java代碼 - 「老闆,我只是要在XXX中編寫一些單元測試。它永遠不會投入生產。「使用Clojure進行單元測試Java

有沒有在Clojure做這個任何教程?

我剛開始使用Scala來測試Java REST服務器。在Scala中編寫測試允許我嵌入預期的XML輸出,用數字對象等模擬數據庫調用,更不用說特性使得抽象出測試的通用代碼變得非常容易。

+5

我認爲scala標籤在這裏有誤導性。它真的需要嗎? – 2010-11-24 18:10:44

回答

10

基本上你需要的是clojure.test(或許多其他clojure測試庫之一)和標準Clojure Java interop

例子:

(ns example.test-java-util 
    (:use 
    [clojure.test]) 
    (:import [java.util HashSet])) 

(defn new-empty-set [] 
    (HashSet.)) 

(deftest test-empty-set 
    (is (= 0 (.size (new-empty-set)))) 
    (is (= true (.isEmpty (new-empty-set)))) 
    (is (= (new-empty-set) (new-empty-set)))) 

(deftest test-add-remove 
    (is (= (new-empty-set) 
     (doto (new-empty-set) 
      (.add "xyz") 
      (.remove "xyz"))))) 

然後你會在各種不同的方式運行。使用maven clojure插件構建像Maven這樣的工具可以自動運行它們作爲「mvn測試」的一部分。是一個示例使用Leiningentest.check假設一個標準的Maven佈局

example.test-java-util> (run-tests 'example.test-java-util) 

Testing example.test-java-util 

Ran 1 tests containing 4 assertions. 
0 failures, 0 errors. 
{:type :summary, :test 1, :pass 4, :fail 0, :error 0} 
+0

在我看來,你的答案根據問題的標題不包含任何真正有用的信息。你能否解釋一下在標準Java JUnit環境中插入一些clojure測試的最佳方式是什麼?在當前狀態下,我們使用TeamCity,算法如下:所有使用特定註釋註解的類都從classpath加載並傳遞給JUnit,它只調用所有的@Test方法。任何幫助,將不勝感激。 – hsestupin 2012-12-21 09:00:01

+1

好吧,如果您碰巧使用Maven,那麼我認爲它提供了一些有關如何編寫測試並將其集成到您的環境中的有用信息。我不知道用Clojure編寫的測試成爲TeamCity/JUnit執行的一部分。應該可以編寫一個能夠找到並調用測試的測試運行器,但這看起來似乎比付出更多的努力。 – 2012-12-21 17:51:36

4

這裏:

pom.xml 
project.clj 
src 
    main 
    java 
     quicktest 
     Discontinuities.java 
    test 
    clojure 
     quicktest 
     test_discontinuities.clj 

Java的功能測試:

package quicktest; 
public class Discontinuities { 
    public static double f5(double x) { 
     return x/(x-5); 
    } 
} 
在REPL,你可以這樣做

Clojure測試用例:

(ns quicktest.test-discontinuities 
    (:import [quicktest Discontinuities]) 
    (:require [clojure.test :refer :all] 
    [clojure.test.check :as tc] 
    [clojure.test.check.generators :as gen] 
    [clojure.test.check.properties :as prop] 
    [clojure.test.check.clojure-test :as ct :refer (defspec)])) 

(deftest test-single-case 
    (is (= 2.0 (Discontinuities/f5 10)))) 

(defspec test-discontinuities 1e4 
     (prop/for-all [x gen/nat ] 
         (let [y (Discontinuities/f5 x)] 
          (is (<= y x))))) 

項目:

(defproject quicktest/discontinuities "0.1" 
      :dependencies [[org.clojure/clojure "1.8.0"] 
          [org.clojure/test.check "0.9.0"]] 
      :java-source-paths ["src/main/java"] 
      :test-paths ["src/test/clojure"]) 

的POM:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>quicktest</groupId> 
    <artifactId>discontinuities</artifactId> 
    <version>0.1</version> 
</project> 

運行帶:

mvn compile 
lein deps 
lein test 

結果

函數中的缺陷很快發現:

FAIL in (test-discontinuities) (test_discontinuities.clj:13) 
expected: (<= y x) 
actual: (not (<= Infinity 5)) 
{:test-var "test-discontinuities", 
:result false, 
:seed 1431128331945, 
:failing-size 23, 
:num-tests 24, 
:fail [5], 
:shrunk {:total-nodes-visited 3, :depth 0, :result false, :smallest [5]}}