2010-11-24 15 views
16

Una de las formas de lograr que una organización acepte un lenguaje JVM alternativo es usarlo primero para probar el código Java de la unidad: "Jefe, voy a escribir algunas pruebas unitarias en XXX. Nunca saldrá a producción ".Usar Clojure para probar la unidad Java

¿Hay algún tutorial para hacer esto en Clojure?

Acabo de comenzar a usar Scala para hacer esto para probar un servidor REST de Java. Escribir las pruebas en Scala me permite incrustar la salida XML esperada, simular las llamadas a la base de datos con objetos literales List, etc., sin mencionar que los rasgos hacen que sea muy fácil abstraer el código común para las pruebas.

+5

Creo que la etiqueta scala es engañosa aquí. ¿Es realmente necesario? –

Respuesta

10

Básicamente lo que necesita es clojure.test (o una de las muchas otras librerías de prueba de clojure) y Clojure estándar Java interop.

Ejemplo:

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

Y luego se ejecutaría en una variedad de maneras. Las herramientas de compilación como Maven usando el plugin maven clojure las ejecutan automáticamente como parte de la "prueba mvn". En una repl, se puede hacer algo como:

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

Me parece que su respuesta no contiene ninguna información realmente útil de acuerdo con el encabezado de la pregunta. ¿Podría explicarnos cuál es la mejor manera de insertar algunas pruebas de clojure en el entorno estándar JUnit de Java? En el estado actual, estamos utilizando TeamCity y el algoritmo es el siguiente: todas las clases anotadas con anotaciones específicas se cargan desde classpath y se transfieren a JUnit, que solo invoca a todos los métodos @Test. Cualquier ayuda sería apreciada. – hsestupin

+1

Bueno, si está usando Maven, creo que le proporcioné información útil sobre cómo escribir e integrar pruebas en su entorno. No sé de ninguna manera para que las pruebas escritas en Clojure formen parte de una ejecución de TeamCity/JUnit. Debería ser posible escribir un corredor de prueba que encontraría e invocaría las pruebas, pero eso parece ser más esfuerzo de lo que vale. –

4

Aquí hay un ejemplo usando Leiningen, test.check y asumiendo una disposición estándar Maven:

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

La función de Java para probar:

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

El caso de prueba 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))))) 

El proyecto:

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

El 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> 

Ejecutar con:

mvn compile 
lein deps 
lein test 

Resultados

La falla en la función se encontró rápidamente:

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

Intenté seguir sus instrucciones, devstopfix, y obtuve una excepción al ejecutar 'lein test' que el'.No se puede encontrar el archivo clj': 'Exception in thread" main "java.io.FileNotFoundException: No se pudo localizar quicktest/test_discontinuities__init.class o quicktest/test_discontinuities.clj en classpath:,' Escribí algunas instrucciones más completas para reproducir el error. https://gist.github.com/gregory-nisbet/dc4e67380caad8bf21a3314c84c8d06b –

+0

He intentado el siguiente código y he encontrado dos problemas: 1.- la prueba de clojure debe guardarse en un archivo llamado test_discontinuities.clj (guión bajo entre prueba y discontinuidades)), debido a un problema específico de Java con guiones en los nombres de las clases. 2.- El archivo project.clj debe tener "test/clojure" en la entrada: test-paths, no solo "test". Después de arreglar estas 2 cosas, pude ejecutar las pruebas con la prueba Lein. –

+0

@ denis-fuenzalida gracias a ambos - He corregido el error tipográfico en el ejemplo – devstopfix

Cuestiones relacionadas