Ngăn các bài kiểm tra đơn vị nhưng cho phép kiểm tra tích hợp trong Maven


157

Tôi có bản dựng Maven trong đó tôi sử dụng plugin SureFire để chạy một số bài kiểm tra đơn vị và plugin FailSafe để chạy một số bài kiểm tra tích hợp. Tôi muốn một cách để chạy các thử nghiệm của plugin FailSafe.

Nó không phải là một giải pháp tốt cho tôi để thêm các cấu hình khác nhau hoặc bất cứ thứ gì trong pom, bởi vì đó là một bản dựng đa mô hình và tôi không muốn phải chỉnh sửa pom của mỗi mô-đun.

skip.testsmaven.test.skipskipTestsđó dừng lại tất cả các bài kiểm tra, và skipITs, mà chỉ chạy failsafe Plugin dừng.

Vì vậy, có một cờ dòng lệnh cho Maven như thế nào skipITs, nhưng thay vào đó là chức năng của "onlyITs"?


Bạn đã thử maven.test.skiphay skipTestschưa?
Thomas

1
@khmarbaise trên lý thuyết, vâng. Nhưng trong hầu hết các dự án tôi đã làm việc, "bài kiểm tra đơn vị" trong đó thực sự kiểm thử tích hợp với db trong bộ nhớ (nếu bạn may mắn)
Sean Patrick Floyd

9
@khmarbaise Rất nhiều bài kiểm tra đơn vị. Họ mất vài phút để chạy và chúng tôi không cần họ chạy trong tình huống này. Cụ thể, chúng tôi chạy thử nghiệm đơn vị trước khi xây dựng tạo phẩm (tất nhiên), nhưng chúng tôi muốn chạy CNTT trong nhiều môi trường. Không có điểm nào chạy lại các bài kiểm tra đơn vị tại thời điểm này.
Matthew Gilliard

2
Xin chào @khmarbaise, trong phần thiết lập của tôi skipTestsbỏ qua các bài kiểm tra chắc chắn, không phải bài kiểm tra không an toàn! Có lẽ đó là một tính năng mới?
danidemi

2
FYI: SkipTests hiện không được hỗ trợ trong Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )
Guillaume Husta

Câu trả lời:


170

Tôi tìm thấy cách đơn giản nhất để bỏ qua các thử nghiệm chắc chắn là cấu hình Surefire ( nhưng không phải là failafe ) như sau:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

Điều này cho phép bạn chạy mvn verify -Dskip.surefire.testsvà chỉ chắc chắn, không phải là không an toàn, các bài kiểm tra sẽ bị bỏ qua; nó cũng sẽ chạy tất cả các giai đoạn cần thiết khác bao gồm tiền tích hợp và hậu tích hợp, và cũng sẽ chạy verifymục tiêu cần thiết để thực sự thất bại trong việc xây dựng maven của bạn nếu thử nghiệm tích hợp của bạn thất bại.

Lưu ý rằng điều này xác định lại thuộc tính được sử dụng để chỉ định rằng các thử nghiệm nên được bỏ qua, vì vậy nếu bạn cung cấp chính tắc -DskipTests=true, chắc chắn sẽ bỏ qua nó nhưng failafe sẽ tôn trọng nó, điều này có thể bất ngờ, đặc biệt là nếu bạn đã có các bản dựng / người dùng hiện có chỉ định cờ đó. Một cách giải quyết đơn giản dường như được mặc định skip.surefire.testslà giá trị skipTeststrong <properties>phần pom của bạn:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

Nếu bạn cần, bạn có thể cung cấp một tham số skip.failsafe.testsan toàn được gọi là failafe, tuy nhiên tôi không thấy cần thiết - vì các thử nghiệm đơn vị thường chạy trong giai đoạn trước và nếu tôi muốn chạy thử nghiệm đơn vị nhưng không chạy thử nghiệm tích hợp, tôi sẽ chạy các testgiai đoạn thay vì verifygiai đoạn. Kinh nghiệm của bạn có thể thay đổi!

Các skip.(surefire|failsafe).teststhuộc tính này có lẽ nên được tích hợp vào chính mã chắc chắn / failafe, nhưng tôi không chắc nó sẽ vi phạm đến mức nào "chúng chính xác là cùng một plugin ngoại trừ các khác biệt nhỏ nhất".


4
Sử dụng giải pháp này Tôi đã có thể thiết lập khung của mình để -DskipUnitTests bỏ qua plugin chắc chắn, -DskipIntegrationTests bỏ qua plugin failafe và DskipTests bỏ qua cả hai. Chính xác những gì cần thiết!
Alex Jansen

2
IDE của tôi đang phàn nàn về "không thể giải quyết biểu tượng 'SkipTests'", giải pháp là thêm một dòng <skipTests>false</skipTests>vẫn hoạt động với bất kỳ sự kết hợp nào của -DskipTests hoặc -Dskip.surefire.tests khi dòng lệnh lập luận dường như ghi đè lên các thuộc tính stackoverflow.com/questions/13708738 / Bạn có thể muốn thêm giải pháp đó vào giải pháp của mình
tẩy giun toàn cầu

<skipTests>${skip.surefire.tests}</skipTests>không hoạt động với maven-surefire-pluginphiên bản 3.0.0-M3. Tất cả các bài kiểm tra chắc chắn vẫn đang chạy. Bất cứ ai khác tìm thấy điều này? Giải pháp dưới đây của Sean Patrick Floyd đang hoạt động.
John Meyer

120

Một cách giải quyết khác là gọi:

mvn clean test-compile failsafe:integration-test

Phải thừa nhận rằng điều này là xấu, nhưng nó có thể giải quyết vấn đề của bạn.


Hoặc (một bản hack khác):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

Tài liệu tham khảo:


1
Đề nghị thứ hai làm việc cho tôi. thử nghiệm tiền tích hợp đã được gọi thành công
Lawrence Tierney

7
Đây có phải là một ý tưởng tốt? Kết quả này có khiến bản dựng của bạn thành công ngay cả khi các bài kiểm tra tích hợp của bạn không thành công? Đó là toàn bộ bản chất của failsafe, nếu bạn không còn chạy được mục tiêu 'kiểm chứng' . Trích dẫn: "Plugin Failsafe sẽ không thất bại trong quá trình xây dựng trong giai đoạn thử nghiệm tích hợp". Bạn cần chạy mục tiêu xác minh để thực sự cho bạn biết liệu các thử nghiệm tích hợp có thành công hay không!
thịt xông khói

2
@bacar là đúng, nhưng chỉ sử dụng verifythay vì integration-testtrong giải pháp thứ 2.
Matthew Gilliard

1
Bạn thực sự nên xem câu trả lời @bacar cho một giải pháp tốt hơn nhiều.
FBB

12
Nếu bạn thêm failsafe:verifyvào cuối đợt hack đầu tiên ( mvn clean test-compile failsafe:integration-test failsafe:verify), nó sẽ thất bại trong quá trình xây dựng nếu một trong các thử nghiệm tích hợp không thành công.
Shadow Man

73

Tôi đang sử dụng mã từ Blog của Antonio Goncalves , hoạt động hoàn hảo.

Bạn có thể sử dụng các thuộc tính sau:

-DskipUTs=true để bỏ qua các bài kiểm tra chắc chắn.

-DskipITs=true để bỏ qua các bài kiểm tra failafe.

-DskipTests=true để bỏ qua tất cả các bài kiểm tra.

Các pom.xmlthực hiện như sau:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>

2
cảm ơn, cách tiếp cận tuyệt vời nó cũng rất hữu ích để ghi đè lên thực hiện mặc định của chắc chắn hơn (mặc định kiểm tra) xem: stackoverflow.com/questions/11935181/...
pls

1
đây là lý do tại sao đôi khi bạn phải cuộn xuống và tìm kiếm một giải pháp làm việc tốt với tất cả các thông tin cần thiết. Cảm ơn bạn đã chia sẻ
Atul Chaudhary

Thực sự là một giải pháp tốt đẹp. Tuy nhiên, cấu hình failafe là dự phòng như skipITsmặc định.
timomeinen

SkipITs là một tùy chọn tùy chỉnh trong cấu hình này. Bạn ngay trong triển khai mặc định, nhưng đó không phải là câu hỏi của OP.
Martijn Burger

Kudos, bạn là một đạo sư maven! Điều này nên có trong superpom maven.
Adam

22

Hi vọng điêu nay co ich!

Cố gắng chỉ chạy thử nghiệm với FailSafe (plugin để kiểm tra tích hợp - nó sẽ cho phép bạn chỉ chạy thử nghiệm tích hợp với cách đặt tên này, theo mặc định: * / IT .java, ** / IT.java, * /*ITCase.java ;, nhưng bạn có thể dễ dàng thay đổi điều đó từ tệp pom)

mvn failsafe:integration-test

Và khi bạn chỉ muốn sử dụng SureFire (plugin để kiểm tra đơn vị)

mvn surefire:test

hoặc một bài kiểm tra tại một thời điểm với:

mvn -Dtest=MyUnitlTest

9

Tôi làm như vậy để mọi giai đoạn thường được thực hiện:

 mvn -Dtest=foo -DfailIfNoTests=false verify

1
Đây là giải pháp dễ nhất (và trung thực nhất là tuyệt vời nhất)!
Tiêu đề

không yêu cầu thêm bất cứ thứ gì vào pom như OP yêu cầu và chạy tất cả các pha như đã chỉ ra. câu trả lời chính xác.
jnichols959

1

Để mở rộng nhận xét từ @danidemi và @GuillaumeHusta:

FYI: SkipTests hiện không được hỗ trợ trong Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )

Vì vậy, để bỏ qua các bài kiểm tra đơn vị, nhưng không phải kiểm tra tích hợp, bạn có thể thực hiện việc này nếu bạn đang sử dụng phiên bản mới nhất của plugin Failsafe:

mvn verify -DskipTests

(vui lòng cung cấp cho các ý kiến ​​được đề cập một upvote nếu điều này giúp bạn)


-3

Hãy thử chạy tích hợp hoặc kiểm tra đơn vị của bạn trong một hồ sơ riêng biệt. Sau đó, bạn chỉ có thể kích hoạt / vô hiệu hóa hồ sơ.


Có thể thêm pom cha trong đó bạn xác định hồ sơ chỉ chạy CNTT? tất cả các mô-đun phụ của dự án có thể kế thừa dạng pom đó, vì vậy bạn sẽ không cần thay đổi mọi pom hoặc chạy các mô-đun bằng các công tắc đặc biệt (vì bạn có thể kích hoạt hồ sơ khi không có tài sản).
yoosiba
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.