Unit testing 使用Clojure对Java进行单元测试

Unit testing 使用Clojure对Java进行单元测试,unit-testing,clojure,Unit Testing,Clojure,让一个组织接受另一种JVM语言的方法之一是首先将其用于Java代码的单元测试——“老板,我只想用XXX编写一些单元测试。它永远不会投入生产。” 在Clojure中有这样做的教程吗 我刚刚开始使用Scala来测试JavaREST服务器。在Scala中编写测试使我能够嵌入预期的XML输出,用literalList对象模拟数据库调用,等等,更不用说特性使得为测试提取公共代码变得非常容易。基本上,您需要的是(或许多其他clojure测试库之一)和标准clojure 例如: (ns example.tes

让一个组织接受另一种JVM语言的方法之一是首先将其用于Java代码的单元测试——“老板,我只想用XXX编写一些单元测试。它永远不会投入生产。”

在Clojure中有这样做的教程吗


我刚刚开始使用Scala来测试JavaREST服务器。在Scala中编写测试使我能够嵌入预期的XML输出,用literal
List
对象模拟数据库调用,等等,更不用说特性使得为测试提取公共代码变得非常容易。

基本上,您需要的是(或许多其他clojure测试库之一)和标准clojure

例如:

(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测试”的一部分自动运行它们。在repl中,您可以执行以下操作:

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}
下面是一个使用并假设标准Maven布局的示例:

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);
    }
}
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)))))
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>
结果

功能中的缺陷很快就会被发现:

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]}}
未通过(测试不连续性)(测试不连续性。clj:13)

预期:(我认为scala标签在这里有误导性。它真的需要吗?在我看来,根据问题的标题,你的答案似乎没有包含任何真正有用的信息。你能解释一下,在标准Java JUnit环境中插入一些clojure测试的最佳方法是什么吗?在目前的状态下,我们使用的是TeamCity,算法是t以下内容:所有带有特定注释的类都从类路径加载并传递到JUnit,JUnit只调用所有@Test方法。任何帮助都将不胜感激。好吧,如果您碰巧使用Maven,那么我想我确实提供了一些关于如何编写测试并将其集成到您的环境中的有用信息。我不知道有什么wa我希望用Clojure编写的测试成为TeamCity/JUnit执行的一部分。应该可以编写一个测试运行程序来查找和调用测试,但这似乎比它的价值更大。devstopfix,我尝试按照您的说明进行操作,但在运行
lein test
时遇到了一个异常,
.clj
文件找不到:
线程“main”中出现异常java.io.FileNotFoundException:在类路径:,
上找不到quicktest/test\u Intercontinuctions\uuuu init.class或quicktest/test\u Intercontinuctions.clj,我编写了一些更完整的错误再现说明。我尝试了上面的代码,发现了两个问题:1.-clojure测试应该保存在一个名为test\u Intercontinuctions的文件中。clj(测试和不连续之间的下划线),因为类名称中有一个特定于Java的虚线问题。2.-project.clj文件在:test path条目中应该有“test/clojure”,而不仅仅是“test”。在解决了这两个问题后,我能够使用lein test运行测试。@denis fuenzalida谢谢你们两位-我已经更正了示例中的拼写错误
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]}}