2014-09-26 8 views
10

Das in mvn meine Projektstruktur ist:Wie unterscheidet sich Maven Unit Test von Integration Test?

enter image description here

Wie Sie sehen können, ich

  1. CardValidtorIT.java (Dies ist Integrationstest)

  2. CardValidatorTest.java in src/test/java zwei Klassen (Dies ist Unit-Test)

wenn ich

mvn package

laufen bemerke ich nur die unit-test (CardValidatorTest.java) ausgeführt wird

Aber wenn ich

laufen

mvn integration-test

Ich sehe beide unit-test und Integration tests ausgeführt werden.

Wie funktioniert mvn nicht die CardValidatorIT.java ausführen, wenn ich mvn package ausführen. Das heißt, warum es nicht CardValidatoryIT.java

Hier lief mein 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> 
    <parent> 
    <artifactId>chapter14</artifactId> 
    <groupId>org.agoncal.book.javaee7</groupId> 
    <version>1.0</version> 
</parent> 
<groupId>org.agoncal.book.javaee7.chapter14</groupId> <artifactId>chapter14-service</artifactId> <version>1.0</version> 
<packaging>war</packaging> 
    <dependencies> 
    <dependency> 
<groupId>org.glassfish.main.extras</groupId> <artifactId>glassfish-embedded-all</artifactId> <version>4.0</version> 
<scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.5.1</version> 
     <configuration> 
      <source>1.7</source> 
      <target>1.7</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.2</version> 
     <configuration> 
      <failOnMissingWebXml>false</failOnMissingWebXml> 
     </configuration> 
     </plugin> 
     <plugin> 
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12.4</version> 
<executions> 
      <execution> 
      <id>integration-test</id> 
      <goals> 
<goal>integration-test</goal> 
       <goal>verify</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

P. S: Ich weiß, dass ich ein integration-test Ziel in mvn haben. aber ich habe nicht das Ziel, an denen gebundene Klasse während des Integrationstest

Dank

Antwort

9

Siehe Maven Surefire. Dieses Plugin ist verantwortlich für mvn test in Maven. Die Standardkonfiguration kommt ins Spiel. Dies bedeutet, dass die Klasse mit dem Wort Test ins Spiel kommen, wenn Sie mvn test und in Ihrem Fall mvn package

http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

laufen Wenn Sie mvn integration-test die Failsafe-Plugin ausgeführt wird.Die standardmäßigen Ein-/Ausschlussregeln unterscheiden sich - standardmäßig wird beispielsweise nach dem Wort IT gesucht.

http://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

Hinweis: Mir ist seltsam, dass die Testklasse CardValidatorTest wird aufgenommen, wenn Sie mvn integration-test laufen. Basierend darauf, wie ich die Standard-Einschluss- und Ausschlussregeln für das Failsafe-Plugin lese, würde ich das nicht erwarten. In der Tat, wenn ich Ihre pom.xml an mein eigenes Beispielprojekt anpassen, sehe ich dieses Verhalten nicht. Stattdessen werden alle Test Klassen mit mvn test und mvn package abgeholt. Alle IT Klassen werden mit mvn integration-test abgeholt. Sind Sie sicher, dass Sie keine Code-Abhängigkeit von den beiden Klassen haben? Anders als die geänderte Einschluss-/Ausschlussregel ist dies das Einzige, was mir einfällt, dass sie beide mit mvn test oder mvn package abgeholt werden könnten.

+0

Ich bin sicher, dass ich keine Code-Level-Abhängigkeit habe. 'mvn test' läuft nur 1 Test (cardValidatorTest),' mvn package' läuft nur 1 Test (CardValidatorTest), aber 'mvn integration-test' führt 2 Tests durch (CardValidatorTest und CardValidatorIT). Aber deine Antwort half und die Links auch! Vielen Dank –

4

Die Failsafe plugin in Maven ausgeführt wird behandelt Integrationstests. Standardmäßig sind diese die include patterns für Integrationstests:

"**/IT*.java" - includes all of its subdirectories and all java filenames that start with "IT". 
"**/*IT.java" - includes all of its subdirectories and all java filenames that end with "IT". 
"**/*ITCase.java" - includes all of its subdirectories and all java filenames that end with "ITCase". 

Failsafe nicht Teil von Maven ist default lifecycle bindings, so Integrationstests wie CardValidatorIT, was natürlich die Standardmuster erfüllt, nicht als Teil des Lebenszyklus laufen. Dies führt zu Mavens eigentümlichen Konventionen, nach denen Fehler beim Build fehlschlagen sollten und welche Tests ständig ausgeführt werden sollten (schnelle Unit-Tests mit breiter Codeabdeckung), gegenüber welchen Tests seltener ausgeführt werden sollte (langsame Integrationstests).

Natürlich können Sie Konventionen nach eigenem Ermessen überschreiben.

+0

und diese müssen in "src/test/java/IT **. Java" sein? Ob das funktioniert? 'src/main/java/IT **. java' Dies kann Namenskollisionen mit meiner Klasse haben, die das Muster' IT ** haben. java' –

+0

Ich habe es noch nie versucht, aber ich denke, Sie könnten das tun, indem Sie 'hinzufügen Konfiguration 'Elemente zu den Plugins für was wird in verschiedenen Teilen des Lebenszyklus enthalten/ausgeschlossen. Das heißt, Sie öffnen sich die Tür zu Kopfschmerzen für sich selbst, dass ich viel mehr Mühe als es wert wäre. – Vidya

+0

Ich bevorzuge src/test/java/zugrunde liegenden surefire-plugin und src/integration-test/java/zugrunde liegenden failsafe-plugin für UTs und ITs. Wie können wir es machen ? – fjjiaboming

1

Die Integrationstest-Build-Phase wird nach der Paket-Erstellungsphase erstellt. So wird "mvn package" die Build-Phase "Integrationstest" nicht erreichen.