2010-04-04 13 views
8

Soy nuevo en Maven y aún más nuevo en Clojure. Como un ejercicio para aprender el idioma, estoy escribiendo un programa de jugador araña solitario. También planeo escribir un programa similar en Scala para comparar las implementaciones (ver mi publicación https://stackoverflow.com/questions/2571267/modern-java-alternatives-closed).pruebas Clojure en Maven

He configurado una estructura de directorios Maven que contiene los directorios habituales src/main/clojure y src/test/clojure. Mi archivo pom.xml incluye el plugin clojure-maven. Cuando ejecuto "prueba mvn", muestra "No hay pruebas para ejecutar", a pesar de que tengo código de prueba en el directorio src/test/clojure. ¿Como estoy oliendo algo? Aquí está mi pom.xml:

<?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>SpiderPlayer</groupId> 
    <artifactId>SpiderPlayer</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <inceptionYear>2010</inceptionYear> 

    <packaging>jar</packaging> 

    <properties> 
     <maven.build.timestamp.format>yyMMdd.HHmm</maven.build.timestamp.format> 
     <main.dir>org/dogdaze/spider_player</main.dir> 
     <main.package>org.dogdaze.spider_player</main.package> 
     <main.class>${main.package}.Main</main.class> 
    </properties> 

    <build> 
     <sourceDirectory>src/main/clojure</sourceDirectory> 
     <testSourceDirectory>src/test/clojure</testSourceDirectory> 
     <plugins> 
      <plugin> 
       <groupId>com.theoryinpractise</groupId> 
       <artifactId>clojure-maven-plugin</artifactId> 
       <version>1.3.1</version> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-antrun-plugin</artifactId> 
       <version>1.3</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>run</goal> 
         </goals> 
         <phase>generate-sources</phase> 
         <configuration> 
          <tasks> 
           <echo file="${project.build.sourceDirectory}/${main.dir}/Version.clj" 
             message="(ns ${main.package})${line.separator}"/> 
           <echo file="${project.build.sourceDirectory}/${main.dir}/Version.clj" append="true" 
             message="(def version &quot;${maven.build.timestamp}&quot;)${line.separator}"/> 
          </tasks> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.1</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>single</goal> 
         </goals> 
         <phase>package</phase> 
         <configuration> 
          <descriptorRefs> 
           <descriptorRef>jar-with-dependencies</descriptorRef> 
          </descriptorRefs> 
          <archive> 
           <manifest> 
            <mainClass>${main.class}</mainClass> 
           </manifest> 
          </archive> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <redirectTestOutputToFile>true</redirectTestOutputToFile> 
        <skipTests>false</skipTests> 
        <skip>false</skip> 
       </configuration> 
       <executions> 
        <execution> 
         <id>surefire-it</id> 
         <phase>integration-test</phase> 
         <goals> 
          <goal>test</goal> 
         </goals> 
         <configuration> 
          <skip>false</skip> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>commons-cli</groupId> 
      <artifactId>commons-cli</artifactId> 
      <version>1.2</version> 
      <scope>compile</scope> 
     </dependency> 
    </dependencies> 

</project> 

Aquí está mi archivo de origen Clojure (src/main/clojure/org/dogdaze/spider_player/Deck.clj):

; Copyright 2010 Dogdaze 

(ns org.dogdaze.spider_player.Deck 
    (:use 
    [clojure.contrib.seq-utils 
    :only (shuffle)])) 

(def suits [:clubs :diamonds :hearts :spades]) 
(def ranks [:ace :two :three :four :five :six :seven :eight :nine :ten :jack :queen :king]) 

(defn suit-seq 
    "Return 4 suits: 
    if number-of-suits == 1: :clubs :clubs :clubs :clubs 
    if number-of-suits == 2: :clubs :diamonds :clubs :diamonds 
    if number-of-suits == 4: :clubs :diamonds :hearts :spades." 
    [number-of-suits] 
    (take 4 (cycle (take number-of-suits suits)))) 

(defstruct card :rank :suit) 

(defn unshuffled-deck 
    "Create an unshuffled deck containing all cards from the number of suits specified." 
    [number-of-suits] 
    (for 
    [rank ranks suit (suit-seq number-of-suits)] 
    (struct card rank suit))) 

(defn deck 
    "Create a shuffled deck containing all cards from the number of suits specified." 
    [number-of-suits] 
    (shuffle (unshuffled-deck number-of-suits))) 

aquí es mi prueba caso (src/test/clojure/org/dogdaze/spider_player/TestDeck.clj):

; Copyright 2010 Dogdaze 

(ns org.dogdaze.spider_player 
    (:use 
    clojure.set 
    clojure.test 
    org.dogdaze.spider_player.Deck)) 

(deftest test-suit-seq 
    (is (= (suit-seq 1) [:clubs :clubs :clubs :clubs])) 
    (is (= (suit-seq 2) [:clubs :diamonds :clubs :diamonds])) 
    (is (= (suit-seq 4) [:clubs :diamonds :hearts :spades]))) 

(def one-suit-deck 
    [{:rank :ace, :suit :clubs} {:rank :ace, :suit :clubs} {:rank :ace, :suit :clubs} {:rank :ace, :suit :clubs} 
    {:rank :two, :suit :clubs} {:rank :two, :suit :clubs} {:rank :two, :suit :clubs} {:rank :two, :suit :clubs} 
    {:rank :three, :suit :clubs} {:rank :three, :suit :clubs} {:rank :three, :suit :clubs} {:rank :three, :suit :clubs} 
    {:rank :four, :suit :clubs} {:rank :four, :suit :clubs} {:rank :four, :suit :clubs} {:rank :four, :suit :clubs} 
    {:rank :five, :suit :clubs} {:rank :five, :suit :clubs} {:rank :five, :suit :clubs} {:rank :five, :suit :clubs} 
    {:rank :six, :suit :clubs} {:rank :six, :suit :clubs} {:rank :six, :suit :clubs} {:rank :six, :suit :clubs} 
    {:rank :seven, :suit :clubs} {:rank :seven, :suit :clubs} {:rank :seven, :suit :clubs} {:rank :seven, :suit :clubs} 
    {:rank :eight, :suit :clubs} {:rank :eight, :suit :clubs} {:rank :eight, :suit :clubs} {:rank :eight, :suit :clubs} 
    {:rank :nine, :suit :clubs} {:rank :nine, :suit :clubs} {:rank :nine, :suit :clubs} {:rank :nine, :suit :clubs} 
    {:rank :ten, :suit :clubs} {:rank :ten, :suit :clubs} {:rank :ten, :suit :clubs} {:rank :ten, :suit :clubs} 
    {:rank :jack, :suit :clubs} {:rank :jack, :suit :clubs} {:rank :jack, :suit :clubs} {:rank :jack, :suit :clubs} 
    {:rank :queen, :suit :clubs} {:rank :queen, :suit :clubs} {:rank :queen, :suit :clubs} {:rank :queen, :suit :clubs} 
    {:rank :king, :suit :clubs} {:rank :king, :suit :clubs} {:rank :king, :suit :clubs} {:rank :king, :suit :clubs}]) 

(def two-suits-deck 
    [{:rank :ace, :suit :clubs} {:rank :ace, :suit :diamonds} {:rank :ace, :suit :clubs} {:rank :ace, :suit :diamonds} 
    {:rank :two, :suit :clubs} {:rank :two, :suit :diamonds} {:rank :two, :suit :clubs} {:rank :two, :suit :diamonds} 
    {:rank :three, :suit :clubs} {:rank :three, :suit :diamonds} {:rank :three, :suit :clubs} {:rank :three, :suit :diamonds} 
    {:rank :four, :suit :clubs} {:rank :four, :suit :diamonds} {:rank :four, :suit :clubs} {:rank :four, :suit :diamonds} 
    {:rank :five, :suit :clubs} {:rank :five, :suit :diamonds} {:rank :five, :suit :clubs} {:rank :five, :suit :diamonds} 
    {:rank :six, :suit :clubs} {:rank :six, :suit :diamonds} {:rank :six, :suit :clubs} {:rank :six, :suit :diamonds} 
    {:rank :seven, :suit :clubs} {:rank :seven, :suit :diamonds} {:rank :seven, :suit :clubs} {:rank :seven, :suit :diamonds} 
    {:rank :eight, :suit :clubs} {:rank :eight, :suit :diamonds} {:rank :eight, :suit :clubs} {:rank :eight, :suit :diamonds} 
    {:rank :nine, :suit :clubs} {:rank :nine, :suit :diamonds} {:rank :nine, :suit :clubs} {:rank :nine, :suit :diamonds} 
    {:rank :ten, :suit :clubs} {:rank :ten, :suit :diamonds} {:rank :ten, :suit :clubs} {:rank :ten, :suit :diamonds} 
    {:rank :jack, :suit :clubs} {:rank :jack, :suit :diamonds} {:rank :jack, :suit :clubs} {:rank :jack, :suit :diamonds} 
    {:rank :queen, :suit :clubs} {:rank :queen, :suit :diamonds} {:rank :queen, :suit :clubs} {:rank :queen, :suit :diamonds} 
    {:rank :king, :suit :clubs} {:rank :king, :suit :diamonds} {:rank :king, :suit :clubs} {:rank :king, :suit :diamonds}]) 

(def four-suits-deck 
    [{:rank :ace, :suit :clubs} {:rank :ace, :suit :diamonds} {:rank :ace, :suit :hearts} {:rank :ace, :suit :spades} 
    {:rank :two, :suit :clubs} {:rank :two, :suit :diamonds} {:rank :two, :suit :hearts} {:rank :two, :suit :spades} 
    {:rank :three, :suit :clubs} {:rank :three, :suit :diamonds} {:rank :three, :suit :hearts} {:rank :three, :suit :spades} 
    {:rank :four, :suit :clubs} {:rank :four, :suit :diamonds} {:rank :four, :suit :hearts} {:rank :four, :suit :spades} 
    {:rank :five, :suit :clubs} {:rank :five, :suit :diamonds} {:rank :five, :suit :hearts} {:rank :five, :suit :spades} 
    {:rank :six, :suit :clubs} {:rank :six, :suit :diamonds} {:rank :six, :suit :hearts} {:rank :six, :suit :spades} 
    {:rank :seven, :suit :clubs} {:rank :seven, :suit :diamonds} {:rank :seven, :suit :hearts} {:rank :seven, :suit :spades} 
    {:rank :eight, :suit :clubs} {:rank :eight, :suit :diamonds} {:rank :eight, :suit :hearts} {:rank :eight, :suit :spades} 
    {:rank :nine, :suit :clubs} {:rank :nine, :suit :diamonds} {:rank :nine, :suit :hearts} {:rank :nine, :suit :spades} 
    {:rank :ten, :suit :clubs} {:rank :ten, :suit :diamonds} {:rank :ten, :suit :hearts} {:rank :ten, :suit :spades} 
    {:rank :jack, :suit :clubs} {:rank :jack, :suit :diamonds} {:rank :jack, :suit :hearts} {:rank :jack, :suit :spades} 
    {:rank :queen, :suit :clubs} {:rank :queen, :suit :diamonds} {:rank :queen, :suit :hearts} {:rank :queen, :suit :spades} 
    {:rank :king, :suit :clubs} {:rank :king, :suit :diamonds} {:rank :king, :suit :hearts} {:rank :king, :suit :spades}]) 

(deftest test-unshuffled-deck 
    (is (= (unshuffled-deck 1) one-suit-deck)) 
    (is (= (unshuffled-deck 2) two-suits-deck)) 
    (is (= (unshuffled-deck 4) four-suits-deck))) 

(deftest test-shuffled-deck 
    (is (= (set (deck 1)) (set one-suit-deck))) 
    (is (= (set (deck 2)) (set two-suits-deck))) 
    (is (= (set (deck 4)) (set four-suits-deck)))) 

(run-tests) 

Cualquier idea de por qué la prueba no está funcionando? Por cierto, siéntase libre de sugerir mejoras al código de Clojure.

Gracias, Ralph

+0

todavía no puede hacer que mis compilaciones funcionen correctamente Volveré a jugar con él este próximo fin de semana. – Ralph

+0

Esta pregunta y su respuesta me ayudó. Gracias. – devdanke

Respuesta

7

El paletón que se está perdiendo de su pom.xml (acaba plagiando a las la clojure-contrib pom.xml) es una ejecución bajo la clojure-maven-plugin:

<plugin> 
    <groupId>com.theoryinpractise</groupId> 
    <artifactId>clojure-maven-plugin</artifactId> 
    <version>1.3.2</version> 
    <!-- Current Config --> 
    <executions> 
     <!-- ... --> 
     <execution> 
      <id>test-clojure</id> 
      <phase>test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

también puede ser necesario añadir algo como esto bajo <build/>:

<testResources> 
    <testResource> 
     <directory>src/test/clojure</directory> 
    </testResource> 
</testResources> 
+1

Puede preferir el objetivo del complemento maven clojure * test-with-junit * que genera archivos de informes JUnit estándar (ver también [with-junit-output] (http://richhickey.github.com/clojure/clojure.test-api.html#clojure.test.junit/with-junit-output) macro), por lo que los resultados pueden ser mostrados por Jenkins/Hudson/.. continuo servidor de integración y similar. –

+1

Hoy leí los documentos de clojure-maven-plugin y vi que si haces el proyecto clojure, la configuración del plugin por defecto es la de los valores sugeridos por @ ig0774. – devdanke

0

Es posible que desee señalar testSourceDirectory en src/test/clojure:

<sourceDirectory>src/main/clojure</sourceDirectory> 
<testSourceDirectory>src/test/clojure</testSourceDirectory> 
+0

Ya lo he intentado. No hizo ninguna diferencia. El pom.xml enumerado arriba es incorrecto. – Ralph

+0

estas directivas deberían estar en la sección de clojure-maven-plugin declaration –

1

Puede consultar this example de pom.xml con clojure-maven-plugin & tests. Por defecto, clojure-maven-plugin debe generar test-runner automáticamente, como se describe en la documentación.

Y es mejor utilizar la última versión de clojure-experto-plugin - 1.3.2, en la que hay varios errores fueron corregidos

Cuestiones relacionadas