2014-09-26 32 views
10

Đây là cấu trúc dự án của tôi trong mvn:Làm thế nào để kiểm tra đơn vị Maven khác nhau từ tích hợp Kiểm tra?

enter image description here

Như bạn có thể nhận thấy, tôi có hai lớp trong src/test/java

  1. CardValidtorIT.java (Đây là thử nghiệm tích hợp)

  2. CardValidatorTest.java (Đây là bài kiểm tra đơn vị)

khi tôi chạy

mvn package

tôi nhận thấy chỉ có unit-test (CardValidatorTest.java) đang chạy

Nhưng khi tôi chạy

mvn integration-test

tôi nhìn thấy cả hai unit-testIntegration tests đang chạy.

Làm thế nào để mvn không biết thực hiện CardValidatorIT.java khi tôi chạy mvn package. Đó là, tại sao nó không chạy CardValidatoryIT.java

Đây là tôi 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> 

Tái bút: Tôi biết rằng tôi có một mục tiêu integration-test trong mvn. nhưng tôi đã không gắn liền với mục tiêu mà lớp nên được chạy trong thử nghiệm hội nhập

Cảm ơn

Trả lời

9

Xem Maven Surefire.

Plugin này chịu trách nhiệm mvn test trong Maven. Cấu hình mặc định sẽ được phát. Điều này có nghĩa các lớp với từ Test sẽ đi vào chơi khi bạn chạy mvn test và trong trường hợp của bạn mvn package

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

Khi bạn chạy mvn integration-test plugin chạy failsafe được sử dụng.Đó là các quy tắc bao gồm/loại trừ mặc định khác nhau - theo mặc định, quy tắc tìm kiếm từ IT chẳng hạn.

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

Lưu ý: Đây là kỳ lạ với tôi rằng các lớp thử nghiệm CardValidatorTest được nhặt khi bạn chạy mvn integration-test. Dựa trên cách tôi đọc quy tắc bao gồm và loại trừ mặc định cho plugin không an toàn, tôi sẽ không mong đợi điều này. Trong thực tế, khi tôi điều chỉnh pom.xml của bạn thành dự án mẫu của riêng tôi, tôi không thấy hành vi đó. Thay vào đó, tất cả các lớp học Test được chọn với mvn testmvn package. Tất cả các lớp học IT được chọn với mvn integration-test. Bạn có chắc chắn bạn không có một số phụ thuộc cấp mã trên hai lớp không? Khác với quy tắc bao gồm/loại trừ thay đổi, đó là điều duy nhất tôi có thể nghĩ đến có thể khiến cả hai được chọn với mvn test hoặc mvn package.

+0

Tôi chắc chắn rằng tôi không có phụ thuộc cấp mã. 'mvn test' chỉ chạy 1 test (cardValidatorTest),' mvn package' chỉ chạy 1 test (CardValidatorTest) nhưng 'mvn integration-test' chạy 2 test (CardValidatorTest và CardValidatorIT). Nhưng câu trả lời của bạn cũng giúp ích và liên kết! Cảm ơn –

4

Các Failsafe plugin trong Maven xử lý thử nghiệm hội nhập. Theo mặc định, đây là những include patterns cho thử nghiệm hội nhập:

"**/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 không phải là một phần của Maven default lifecycle bindings, vì vậy thử nghiệm hội nhập như CardValidatorIT, trong đó tất nhiên đáp ứng các mẫu mặc định, không chạy như là một phần của vòng đời. Điều này dẫn đến các quy ước của Maven về những thất bại sẽ thất bại trong quá trình xây dựng và các thử nghiệm sẽ chạy mọi lúc (các bài kiểm tra đơn vị nhanh với phạm vi mã rộng) so với các bài kiểm tra sẽ chạy ít hơn (các bài kiểm tra tích hợp chậm).

Tất nhiên, bạn có thể ghi đè lên các quy ước khi bạn thấy phù hợp.

+0

và những thứ này phải nằm trong 'src/test/java/IT **. Java'? sẽ làm việc này? 'src/main/java/IT **. java.' Điều này có thể có xung đột tên với lớp của tôi có mẫu' IT **. java' –

+0

Tôi chưa bao giờ thử, nhưng tôi nghĩ bạn có thể làm điều đó bằng cách thêm ' cấu hình' yếu tố cho các plugin cho những gì được bao gồm/loại trừ ở các phần khác nhau của vòng đời. Điều đó nói rằng, bạn đang mở cửa cho một nhức đầu cho chính mình rằng tôi sẽ xem xét nhiều rắc rối hơn nó có giá trị. – Vidya

+0

Tôi thích src/test/java/plugin plugin chắc chắn và src/integration-test/java/failafe-plugin cơ bản cho UT và CNTT. Chúng tôi có thể làm như thế nào ? – fjjiaboming

1

Giai đoạn xây dựng thử nghiệm tích hợp xuất hiện sau giai đoạn xây dựng gói. Vì vậy, "gói mvn" sẽ không đạt đến giai đoạn xây dựng "tích hợp thử nghiệm".

Các vấn đề liên quan