【问题标题】:Using Clojure to unit test Java使用 Clojure 对 Java 进行单元测试
【发布时间】:2010-11-24 17:12:08
【问题描述】:

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

在 Clojure 中是否有任何教程可以做到这一点?

我刚刚开始使用 Scala 来测试 Java REST 服务器。用 Scala 编写测试允许我嵌入预期的 XML 输出,使用文字 List 对象模拟数据库调用等,更不用说特征可以很容易地抽象出测试的通用代码。

【问题讨论】:

  • 我认为 scala 标签在这里具有误导性。真的需要吗?

标签: unit-testing clojure


【解决方案1】:

基本上您需要的是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 测试”的一部分自动运行它们。在 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}

【讨论】:

  • 在我看来,根据问题的标题,您的答案不包含任何真正有用的信息。您能否解释将一些 clojure 测试插入标准 Java JUnit 环境的最佳方法是什么?在当前状态下,我们使用的是 TeamCity,算法如下:所有带有特定注释的类都从类路径加载并传输到 JUnit,它只调用所有 @Test 方法。任何帮助将不胜感激。
  • 好吧,如果您碰巧在使用 Maven,那么我认为确实提供了一些关于如何编写测试并将测试集成到您的环境中的有用信息。我不知道有什么方法可以让用 Clojure 编写的测试成为 TeamCity / JUnit 执行的一部分。应该可以编写一个可以找到并调用测试的测试运行程序,但这似乎比它的价值付出更多的努力。
【解决方案2】:

这是一个使用 Leiningentest.check 并假设标准 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)))))

项目:

(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]}}

【讨论】:

  • 我尝试按照您的说明进行操作,devstopfix,但在运行lein test 时出现异常,无法找到.clj 文件:Exception in thread "main" java.io.FileNotFoundException: Could not locate quicktest/test_discontinuities__init.class or quicktest/test_discontinuities.clj on classpath: , 我写了一些更完整的说明来重现错误。 gist.github.com/gregory-nisbet/dc4e67380caad8bf21a3314c84c8d06b
  • 我试了一下上面的代码,发现了两个问题: 1.- clojure 测试应该保存在一个名为 test_discontinuities.clj 的文件中(测试和不连续性之间的下划线),因为 Java 特定问题在类名中带有破折号。 2.- project.clj 文件的 :test-paths 条目中应该有“test/clojure”,而不仅仅是“test”。在修复了这两件事后,我能够使用 lein test 运行测试。
  • @denis-fuenzalida 谢谢你们 - 我已经更正了示例中的错字
猜你喜欢
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2010-09-10
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多