Использование Clojure для модульного тестирования Java - PullRequest
16 голосов
/ 24 ноября 2010

Один из способов заставить организацию принять альтернативный язык JVM - это сначала использовать его для модульного тестирования кода Java - «Босс, я просто собираюсь написать несколько модульных тестов в XXX. Он никогда не выйдетв производство. "

Есть ли какие-либо учебные пособия для этого в Clojure?

Я только начал использовать Scala, чтобы сделать это для тестирования сервера Java REST.Написание тестов в Scala позволяет мне встраивать ожидаемый вывод XML, макетировать вызовы базы данных с помощью буквальных List объектов и т. Д., Не говоря уже о том, что черты облегчают абстрагирование общего кода для тестов.

Ответы [ 2 ]

10 голосов
/ 24 ноября 2010

В основном вам нужно clojure.test (или один из множества других тестовых библиотек clojure) и стандартный Clojure Java-взаимодействие .

Пример:

(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».В ответ вы можете сделать что-то вроде:

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}
4 голосов
/ 09 мая 2015

Вот пример использования Leiningen , test.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"])

Пом:

<?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]}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...