2010-11-24 14 views
16

組織に別のJVM言語を受け入れる方法の1つは、Javaコードを単体テストするために初めて使用することです。「Boss、単なる単体テストをXXXに書きます。それは決して生産に行くことはありません。Clojureを使って単体テストを行うJava

Clojureでこれを行うためのチュートリアルはありますか?

私はJava RESTサーバーをテストするためにScalaを使用し始めました。 Scalaでテストを書くことで、予想されるXML出力を組み込み、データベース呼び出しを文字のListオブジェクトなどで模擬することができます。その特性によってテスト用の共通コードを抽象化することが非常に簡単になります。

+5

ここではスカラータグが誤解を招くと思います。それは本当に求められていますか? –

答えて

10

基本的には、clojure.test(または他の多くのclojureテストライブラリの1つ)と標準の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のようなビルドツールは、maven clojureプラグインを使って自動的に "mvn test"の一部として実行します。 REPLでは、あなたのような何かを行うことができます。

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

のJava機能をテストする:ここで

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環境にクロージャーテストを挿入する最良の方法は何ですか?現在の状態ではTeamCityを使用しており、アルゴリズムは次のとおりです。特定の注釈で注釈が付けられたすべてのクラスはクラスパスからロードされ、すべての@Testメソッドを呼び出すJUnitに渡されます。どんな助けもありがとう。 – hsestupin

+1

Mavenを使用している場合は、テストを作成して環境に組み込む方法に関する有用な情報があると思います。私はClojureで書かれたテストをTeamCity/JUnit実行の一部にする方法は知らない。テストを見つけて呼び出すテストランナーを書くことは可能でしょうが、それは価値があるよりももっと努力のようです。 –

4

Leiningentest.checkを使用して、標準のMavenのレイアウトを想定した例である

package quicktest; 
public class Discontinuities { 
    public static double f5(double x) { 
     return x/(x-5); 
    } 
} 

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"]) 

ポンポン:

<?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]}} 
+0

devstopfixの指示に従ってみましたが、 'lein test'を実行したときに例外が発生しました。clj'ファイルが見つかりません: '例外" main "java.io.FileNotFoundException:クラスパスでquicktest/test_discontinuities__init.classまたはquicktest/test_discontinuities.cljを見つけることができませんでした:'再生のためのより完全な手順を書いていますエラー。 https://gist.github.com/gregory-nisbet/dc4e67380caad8bf21a3314c84c8d06b –

+0

私は、上記のコードを試して、2つの問題を発見しました。1. clojureテストは、test_discontinuities.cljというファイルに保存する必要があります(テストと不連続の間の下線)、クラス名にダッシュを含むJava固有の問題のためです。 2.-project.cljファイルは、単に "test"ではなく:test-pathsエントリに "test/clojure"を持つ必要があります。これらの2つのことを修正した後、私はleinテストでテストを実行することができました。 –

+0

@ denis-fuenzalida両方に感謝します - 私は例で誤字を訂正しました – devstopfix

関連する問題