2014-09-26 16 views
10

To jest mój struktury projektu w mvn:W jaki sposób Maven inna jednostka Test z testu integracji?

enter image description here

Jak można zauważyć, mam dwie klasy w src/test/java

  1. CardValidtorIT.java (jest to próba integracji)

  2. CardValidatorTest.java (To jest test jednostkowy)

kiedy biegnę

mvn package

Zauważam tylko unit-test (CardValidatorTest.java) prowadzony jest

Ale kiedy biegnę

mvn integration-test

widzę zarówno unit-test i Integration tests są prowadzone.

W jaki sposób wiadomo, że nie wykonuję CardValidatorIT.java po uruchomieniu mvn package. To jest, dlaczego nie uruchomić CardValidatoryIT.java

Oto moja 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: Ja wiem, że mam integration-test gola w mvn. ale nie związany cel, do którego powinien być prowadzony podczas testu klasy integracyjnej

Dzięki

Odpowiedz

9

Zobacz Maven Surefire.

Ta wtyczka jest odpowiedzialna za mvn test w Maven. Wchodzi domyślna konfiguracja. Oznacza to, że klasa ze słowem Test będzie wchodzić w grę podczas uruchamiania mvn test iw Twoim przypadku mvn package

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

Po uruchomieniu mvn integration-test plugin failsafe jest używany.Domyślne reguły włączania/wyłączania różnią się - domyślnie szuka na przykład słowa IT.

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

Uwaga: To jest dziwne dla mnie, że klasa Test CardValidatorTest się podniósł po uruchomieniu mvn integration-test. Na podstawie tego, jak przeczytałem domyślne zasady włączania i wyłączania wtyczki failsafe, nie oczekiwałbym tego. W rzeczywistości, kiedy dostosowuję twój pom.xml do mojego własnego projektu próbki, nie widzę tego zachowania. Zamiast tego wszystkie klasy Test są pobierane za pomocą mvn test i mvn package. Wszystkie klasy IT są pobierane za pomocą mvn integration-test. Czy na pewno nie masz zależności na poziomie kodu od dwóch klas? Poza zmienioną zasadą włączania/wyłączania, to jedyna rzecz, która może mi się przydać, może spowodować, że oba zostaną odebrane za pomocą mvn test lub mvn package.

+0

Jestem pewien, że nie mam zależności na poziomie kodu. 'test mvn' przeprowadza tylko 1 test (cardValidatorTest),' pakiet mvn' uruchamia tylko 1 test (CardValidatorTest), ale 'test integracyjny mvn' wykonuje 2 testy (CardValidatorTest i CardValidatorIT). Ale twoja odpowiedź pomogła i linki też! Dzięki –

4

Failsafe plugin w Maven uchwyty testy integracyjne. Domyślnie są to include patterns do testów integracyjnych:

"**/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 nie jest częścią Maven na default lifecycle bindings, więc testy integracyjne, takie jak CardValidatorIT, który oczywiście spełnia wzory Domyślnie nie są uruchamiane jako część cyklu. Doprowadza to do poglądów Mavena, dla których niepowodzenia powinny zakończyć się niepowodzeniem i które testy powinny być wykonywane przez cały czas (szybkie testy jednostkowe z szerokim zakresem kodu), a które testy powinny być wykonywane rzadziej (powolne testy integracyjne).

Oczywiście można nadpisywać konwencje zgodnie z oczekiwaniami.

+0

i te muszą znajdować się w 'src/test/java/IT **. Java'? Czy to zadziała? 'src/main/java/IT **. java." Może to powodować kolizje nazw z moją klasą, które mają wzorzec 'IT **. java' –

+0

Nigdy nie próbowałem, ale myślę, że możesz to zrobić, dodając' elementy konfiguracyjne do wtyczek dla tego, co zostanie włączone/wyłączone w różnych częściach cyklu życia. Powiedziałeś, że otwierasz sobie drzwi do bólu głowy, że uznałbym więcej kłopotów niż to jest warte. – Vidya

+0

Wolę src/test/java/underlying surefire-plugin i src/integration-test/java/underlying failsafe-plugin dla UT i IT. Jak możemy zrobic ? – fjjiaboming

1

Faza budowania testu integracji przychodzi po fazie kompilacji pakietu. Tak więc "pakiet mvn" nie dojdzie do fazy budowania "testu integracji".

Powiązane problemy