Làm cách nào để chạy thử nghiệm tích hợp Maven của tôi


170

Tôi có một dự án đa mô-đun maven2 và trong mỗi mô-đun con của tôi, tôi có các bài kiểm tra JUnit được đặt tên Test.javaIntegration.javacho các bài kiểm tra đơn vị và kiểm tra tích hợp tương ứng. Khi tôi thực thi:

mvn test

tất cả các bài kiểm tra JUnit *Test.javatrong các mô đun con được thực thi. Khi tôi thực thi

mvn test -Dtest=**/*Integration

không có Integration.javabài kiểm tra nào được thực thi trong các mô đun con.

Đây có vẻ giống như một lệnh chính xác đối với tôi nhưng lệnh có -Dtest = / * Integration ** không hoạt động, nó hiển thị 0 bài kiểm tra đang chạy ở cấp độ cha, không có bất kỳ bài kiểm tra nào


4
Câu trả lời của Kief phải là câu trả lời được chấp nhận, vì đó là tiêu chuẩn hiện tại để xác định các thử nghiệm tích hợp trong Maven.
heenenee

Câu trả lời:


110

Bạn có thể thiết lập Surefire của Maven để chạy thử nghiệm đơn vị và kiểm tra tích hợp riêng. Trong giai đoạn thử nghiệm đơn vị tiêu chuẩn, bạn chạy mọi thứ không phù hợp với thử nghiệm tích hợp. Sau đó, bạn tạo một giai đoạn thử nghiệm thứ hai chỉ chạy các thử nghiệm tích hợp.

Đây là một ví dụ:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <excludes>
          <exclude>**/*IntegrationTest.java</exclude>
        </excludes>
      </configuration>
      <executions>
        <execution>
          <id>integration-test</id>
          <goals>
            <goal>test</goal>
          </goals>
          <phase>integration-test</phase>
          <configuration>
            <excludes>
              <exclude>none</exclude>
            </excludes>
            <includes>
              <include>**/*IntegrationTest.java</include>
            </includes>
          </configuration>
        </execution>
      </executions>
    </plugin>

1
Tôi đã cấu hình cái này như bạn đã nói và chỉ có tệp * Test không phải là tệp * Integration.java sẽ chạy khi thực thi: mvn install Tôi cần chạy * Test.java làm mặc định, nhưng đối với bản dựng nightlty của tôi, tôi cần chạy cả * Test .java và * Integration.java. Tôi phải thực hiện cài đặt mvn sau đó cd vào từng thư mục con và thực thi mvn -Dtest = ** / * Kiểm tra tích hợp
Peter Delaney

66
Bạn nên sử dụng plugin Fail-safe để kiểm tra tích hợp, không phải plugin chắc chắn. Nó sẽ không thất bại trong quá trình xây dựng cho đến khi giai đoạn hậu hòa nhập hoàn tất; cho phép bạn phá bỏ tài nguyên kiểm tra (ví dụ: máy chủ web) trước khi quá trình xây dựng thất bại. Do đó, không an toàn.
John Gordon

Đối với tôi, là một phần của giai đoạn tiền tích hợp, máy chủ cầu cảng bắt đầu. Dòng nhật ký cuối cùng là: [INFO] Đã bắt đầu Máy chủ Jetty. Sau đó, không có gì xảy ra. Nó bị kẹt. maven chắc chắn plugin failafe không thực hiện kiểm tra cũng như máy chủ cầu cảng dừng lại. Bất cứ ý tưởng những gì sai? Tôi đang sử dụng cấu hình tương tự như được chỉ định bởi bạn.
Tarun Kumar

6
Câu trả lời này rất lỗi thời và cần được cập nhật hoặc xóa.
Zac Thompson

Bất kỳ trợ giúp với cái này? stackoverflow.com/questions/48639730/ cường
Rohit Barnwal

250

Các Maven xây dựng vòng đời hiện nay bao gồm các "hội nhập-test" giai đoạn chạy thử nghiệm hội nhập, được chạy riêng biệt từ các bài kiểm tra đơn vị chạy trong giai đoạn "thử nghiệm". Nó chạy sau "gói", vì vậy nếu bạn chạy "mvn verify", "mvn install" hoặc "mvn triển khai", các kiểm tra tích hợp sẽ được chạy trên đường đi.

Theo mặc định, tích hợp thử nghiệm chạy lớp học thử nghiệm tên **/IT*.java, **/*IT.java**/*ITCase.java, nhưng điều này có thể được cấu hình.

Để biết chi tiết về cách kết nối tất cả những điều này, hãy xem plugin Failsafe , trang sử dụng Failsafe (không được liên kết chính xác từ trang trước khi tôi viết bài này), và cũng xem bài đăng trên blog Sonatype này .


1
@WillV Đúng. Nghĩa địa của Codehaus. Và maven-failafe-plugin hiện có trong Apache. Lấy làm tiếc. :)
Jin Kwon

38
Theo mặc định mvn integration-testcũng chạy các kiểm tra đơn vị (sử dụng thông qua chắc chắn) nhưng mvn failsafe:integration-testchỉ chạy các kiểm tra tích hợp không an toàn.
Shadow Man

22
Thật đáng kinh ngạc, tài liệu về plugin, trang sử dụng và Câu hỏi thường gặp của Failsafe không đề cập đến việc nó chạy các lớp kiểm tra có tên * / IT .java, ** / * IT.java và ** / * ITCase.java ...
Henno Vermeulen

1
Nếu nó chạy sau packagepha, điều đó có nghĩa là tôi nên đặt tất cả mã nguồn java CNTT của mình src/main/javathay vì src/test/javaphải không?
Bruce Sun

5
@HennoVermeulen Tôi đã nhầm lẫn về những gì để đặt tên xét nghiệm là tốt. Nó được mô tả trong Inclusions và Exjection of Tests . Thật tuyệt khi các mặc định có thể được ghi đè, nhưng thật tuyệt nếu họ đề cập đến các mặc định trước đó.
Joshua Taylor

63

Tôi đã thực hiện CHÍNH XÁC những gì bạn muốn làm và nó hoạt động rất tốt. Kiểm tra đơn vị "* Kiểm tra" luôn chạy và "* IntegrationTests" chỉ chạy khi bạn thực hiện cài đặt mvn xác minh hoặc mvn. Đây là đoạn trích từ POM của tôi. serg10 gần như đã có nó .... nhưng không hoàn toàn.

  <plugin>
    <!-- Separates the unit tests from the integration tests. -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
       <!-- Skip the default running of this plug-in (or everything is run twice...see below) -->
       <skip>true</skip>
       <!-- Show 100% of the lines from the stack trace (doesn't work) -->
       <trimStackTrace>false</trimStackTrace>
    </configuration>
    <executions>
       <execution>
          <id>unit-tests</id>
          <phase>test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
                <!-- Never skip running the tests when the test phase is invoked -->
                <skip>false</skip>
             <includes>
                   <!-- Include unit tests within integration-test phase. -->
                <include>**/*Tests.java</include>
             </includes>
             <excludes>
               <!-- Exclude integration tests within (unit) test phase. -->
                <exclude>**/*IntegrationTests.java</exclude>
            </excludes>
          </configuration>
       </execution>
       <execution>
          <id>integration-tests</id>
          <phase>integration-test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
            <!-- Never skip running the tests when the integration-test phase is invoked -->
             <skip>false</skip>
             <includes>
               <!-- Include integration tests within integration-test phase. -->
               <include>**/*IntegrationTests.java</include>
             </includes>
          </configuration>
       </execution>
    </executions>
  </plugin>

Chúc may mắn!


Chính xác là những gì tôi đã cố gắng thực hiện, nhưng các bài kiểm tra tích hợp của tôi vẫn tiếp tục chạy trong giai đoạn thử nghiệm mvn, vì tôi đã không SKIP THE DEFAULT. Tôi nghĩ rằng cấu hình thực hiện kiểm tra sẽ ghi đè lên nó. Như bạn đã giải thích, nó chỉ thêm một thực thi mới (do đó mọi thứ sẽ chạy hai lần). Vì vậy, đối với tôi bỏ qua đã bị mất mảnh. +1 Vì cấu hình này trả lời câu hỏi tới 100%
Nils Schmidt

2
Sau đó, vui lòng kiểm tra hộp cho câu trả lời này là câu trả lời!
HDave

Đối với tôi, là một phần của giai đoạn tiền tích hợp, máy chủ cầu cảng bắt đầu. Dòng nhật ký cuối cùng là: [INFO] Đã bắt đầu Máy chủ Jetty. Sau đó, không có gì xảy ra. Nó bị kẹt. maven chắc chắn plugin failafe không thực hiện kiểm tra cũng như máy chủ cầu cảng dừng lại. Bất cứ ý tưởng những gì sai? Tôi đang sử dụng cấu hình tương tự như được chỉ định bởi bạn.
Tarun Kumar

@Tarun - đặt câu hỏi mới cho vấn đề của bạn
HDave

2
Đây phải là câu trả lời được chấp nhận. Mục tiêu của maven liên quan là: clean compile integration-test -Dmaven.test.failure.ignore=false
Neill Lima

31

Bạn có thể phân chia chúng rất dễ dàng bằng cách sử dụng các danh mục JUnit và Maven.
Điều này được thể hiện rất, rất ngắn gọn dưới đây bằng cách tách các bài kiểm tra đơn vị và tích hợp.

Xác định giao diện đánh dấu

Bước đầu tiên trong việc nhóm thử nghiệm bằng các danh mục là tạo giao diện đánh dấu.
Giao diện này sẽ được sử dụng để đánh dấu tất cả các bài kiểm tra mà bạn muốn được chạy dưới dạng kiểm tra tích hợp.

public interface IntegrationTest {}

Đánh dấu các lớp kiểm tra của bạn

Thêm chú thích danh mục vào đầu lớp kiểm tra của bạn. Nó có tên của giao diện mới của bạn.

import org.junit.experimental.categories.Category;

@Category(IntegrationTest.class)
public class ExampleIntegrationTest{

    @Test
    public void longRunningServiceTest() throws Exception {
    }

}

Cấu hình kiểm tra đơn vị Maven

Cái hay của giải pháp này là không có gì thực sự thay đổi đối với mặt thử nghiệm đơn vị của mọi thứ.
Chúng tôi chỉ cần thêm một số cấu hình vào plugin maven Surefire để làm cho nó bỏ qua mọi thử nghiệm tích hợp.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.11</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <excludedGroups>
            com.test.annotation.type.IntegrationTest
        </excludedGroups>
    </configuration>
</plugin>

Khi bạn làm một mvn clean test, chỉ có các bài kiểm tra đơn vị không được đánh dấu của bạn sẽ chạy.

Cấu hình kiểm tra tích hợp Maven

Một lần nữa cấu hình cho việc này rất đơn giản.
Chúng tôi sử dụng plugin failafe tiêu chuẩn và định cấu hình nó để chỉ chạy các bài kiểm tra tích hợp.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <groups>
            com.test.annotation.type.IntegrationTest
        </groups>
    </configuration>
</plugin>

Cấu hình sử dụng mục tiêu thực hiện tiêu chuẩn để chạy plugin failafe trong giai đoạn thử nghiệm tích hợp của bản dựng.

Bây giờ bạn có thể làm một mvn clean install.
Lần này cũng như các bài kiểm tra đơn vị đang chạy, các bài kiểm tra tích hợp được chạy trong giai đoạn kiểm thử tích hợp.


Tôi nghĩ rằng JUnit không có nhiều bí mật với tôi. Điểm tốt!
gertas

4
Điều này chỉ hoạt động nếu giao diện đánh dấu đã tồn tại ở đâu đó có sẵn cho Maven. Nó không hoạt động nếu giao diện đánh dấu của bạn tồn tại trong một mô-đun khác có cùng cấu trúc đa mô-đun.
Kỹ

@EngineerBetter_DJ ý của bạn là gì? Bạn không thể làm điều đó nếu bạn có một cấu hình maven dựa trên nhiều dự án?
matthieusb

16

Bạn nên thử sử dụng plugin maven failafe . Bạn có thể bảo nó bao gồm một bộ thử nghiệm nhất định.


1
+1 Đây là những gì tôi sử dụng. Hoạt động tốt và cho phép bạn thực hiện thiết lập trước / sau, chẳng hạn như bắt đầu và tắt một thùng chứa servlet cục bộ.
mdma

maven-failsafe-pluginđã đến Plugin Graveyard
Jin Kwon

9
Trang nghĩa địa chỉ nói rằng failsafeplugin đã được chuyển đến maven-failsafe-plugin. Có vẻ như maven-failsafe-pluginvẫn còn hoạt động (tài liệu được đẩy lần cuối vào tháng 3 năm 2014).
James Kingsbery

13

Theo mặc định, Maven chỉ chạy các bài kiểm tra có Test ở đâu đó trong tên lớp.

Đổi tên thành IntegrationTest và nó có thể sẽ hoạt động.

Ngoài ra, bạn có thể thay đổi cấu hình Maven để bao gồm tệp đó nhưng có thể dễ dàng hơn và tốt hơn chỉ bằng cách đặt tên cho các thử nghiệm của bạn SomethingTest.

Từ Bao gồm và Loại trừ các Bài kiểm tra :

Theo mặc định, Plugin Surefire sẽ tự động bao gồm tất cả các lớp kiểm tra với các mẫu ký tự đại diện sau:

  • \*\*/Test\*.java - bao gồm tất cả thư mục con của nó và tất cả tên tệp java bắt đầu bằng "Kiểm tra".
  • \*\*/\*Test.java - bao gồm tất cả thư mục con của nó và tất cả tên tệp java kết thúc bằng "Kiểm tra".
  • \*\*/\*TestCase.java - bao gồm tất cả thư mục con của nó và tất cả tên tệp java kết thúc bằng "TestCase".

Nếu các lớp kiểm tra không đi theo quy ước đặt tên, thì hãy định cấu hình Surefire Plugin và chỉ định các kiểm tra bạn muốn đưa vào.


Xin chào và cảm ơn tôi có hai loại bài kiểm tra POJO Junit bình thường có tên là SomethingTest.java bị đuổi việc. Tôi cũng có các bài kiểm tra tích hợp có tên SomethingIntegration.java mà không bị sa thải. SomethingTest.java được kích hoạt thông qua thử nghiệm mvn hoặc cài đặt mvn. Các xét nghiệm thứ hai không bị sa thải. kiểm tra mvn -Dtest = ** / * Tích hợp
Peter Delaney

.. và bởi "Maven chỉ chạy các bài kiểm tra có Test ở đâu đó trong tên lớp", ý bạn là "plugin chắc chắn Maven chỉ chạy các bài kiểm tra có Test ở đâu đó trong tên lớp".
Joshua Davis

1
Nó không "ở đâu đó trong tên lớp", "tên lớp kết thúc bằng Test", ví dụ MyTest hoạt động nhưng MyTests thì không
Julian

10

Một cách khác để chạy thử nghiệm tích hợp với Maven là sử dụng tính năng cấu hình:

...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*Test.java</include>
                </includes>
                <excludes>
                    <exclude>**/*IntegrationTest.java</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

<profiles>
    <profile>
        <id>integration-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <includes>
                            <include>**/*IntegrationTest.java</include>
                        </includes>
                        <excludes>
                            <exclude>**/*StagingIntegrationTest.java</exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
...

Chạy 'mvn clean install' sẽ chạy bản dựng mặc định. Như đã chỉ định ở trên, các thử nghiệm tích hợp sẽ bị bỏ qua. Chạy 'mvn cài đặt sạch-kiểm tra tích hợp -P' sẽ bao gồm các kiểm tra tích hợp (tôi cũng bỏ qua các kiểm tra tích hợp theo giai đoạn của mình). Hơn nữa, tôi có một máy chủ CI chạy các kiểm tra tích hợp của tôi mỗi đêm và do đó tôi phát lệnh 'mvn test -P integration-tests' .


1
Tại sao bạn không sử dụng giai đoạn kiểm tra tích hợp? Hồ sơ sau đó có thể được sử dụng cho những việc như kiểm tra tích hợp đối với các máy chủ ứng dụng khác nhau, v.v. như Arquillian. Tôi không phải là chuyên gia về Maven, nhưng tôi nghĩ các chuyên gia có thể nói rằng đây không phải là "Maven-y".
Joshua Davis

1
@Joshua Tôi đoán tôi làm theo cách này vì các bài kiểm tra tích hợp của tôi mất ít nhất 5 phút để chạy và tôi phát hành 'mvn Clean install' nhiều lần mỗi ngày vì tôi cần cập nhật các tạo phẩm của mình trong repo maven cục bộ. Theo những gì mọi người đang nói ở trên, việc chạy 'cài đặt' sẽ khiến giai đoạn thử nghiệm tích hợp chạy khiến tôi mất thời gian của nhà phát triển quý giá.
Jorge

Hmm ... không chắc chắn về 'cài đặt' đang chạy thử nghiệm tích hợp. Trong mọi trường hợp tôi vẫn sử dụng pha thay vì hồ sơ. Hồ sơ được sử dụng tốt hơn cho những thứ như hỗ trợ các máy chủ ứng dụng khác nhau, v.v.
Joshua Davis

1
Tôi sẽ tiếp tục và chơi xung quanh với điều đó sau đó. Cảm ơn vì lời khuyên!
Jorge

@jorge Tôi đoán mục tiêu chính xác để sử dụng ở đây sẽ được xác minh, phải không?
Kilokahn

1

Bạn có thể làm theo tài liệu maven để chạy thử nghiệm đơn vị với bản dựng và chạy thử nghiệm tích hợp riêng.

<project>
    <properties>
        <skipTests>true</skipTests>
    </properties>
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <skipITs>${skipTests}</skipITs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    [...]
</project>

Điều này sẽ cho phép bạn chạy với tất cả các kiểm tra tích hợp bị tắt theo mặc định. Để chạy chúng, bạn sử dụng lệnh này:

mvn install -DskipTests=false

0

Bạn nên sử dụng plugin maven Surefire để chạy thử nghiệm đơn vị và plugin maven failafe để chạy thử nghiệm tích hợp.

Vui lòng làm theo bên dưới nếu bạn muốn chuyển đổi việc thực hiện các thử nghiệm này bằng cờ.

Cấu hình Maven

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>${skipUnitTests}</skipTests>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <skipTests>${skipIntegrationTests}</skipTests>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <properties>
            <skipTests>false</skipTests>
            <skipUnitTests>${skipTests}</skipUnitTests>
            <skipIntegrationTests>${skipTests}</skipIntegrationTests>
        </properties>

Vì vậy, các bài kiểm tra sẽ được bỏ qua hoặc chuyển đổi theo các quy tắc cờ dưới đây:

Các xét nghiệm có thể được bỏ qua bởi các cờ dưới đây:

  • -DskipTests bỏ qua cả bài kiểm tra đơn vị và tích hợp
  • -DskipUnitTests bỏ qua kiểm tra đơn vị nhưng thực hiện kiểm tra tích hợp
  • -DskipIntegrationTests bỏ qua kiểm tra tích hợp nhưng thực hiện kiểm tra đơn vị

Chạy thử

Chạy bên dưới để chỉ thực hiện Bài kiểm tra đơn vị

mvn clean test

Bạn có thể thực hiện lệnh bên dưới để chạy thử nghiệm (cả đơn vị và tích hợp)

mvn clean verify

Để chỉ chạy Kiểm tra tích hợp, hãy làm theo

mvn failsafe:integration-test

Hoặc bỏ qua bài kiểm tra đơn vị

mvn clean install -DskipUnitTests

Ngoài ra, để bỏ qua các bài kiểm tra tích hợp trong thời gian mvn install, hãy làm theo

mvn clean install -DskipIntegrationTests

Bạn có thể bỏ qua tất cả các bài kiểm tra bằng cách sử dụng

mvn clean install -DskipTests
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.