Mục lục
Việc skip test thông thường không được khuyến khích vì việc chạy test có thể giúp chúng ta tìm ra các lỗ hỏng trong các tính năng mới mà chúng ta vừa triển khai hoặc chỉnh sửa. Tuy nhiên vẫn có một số tình huống mà việc skip test sẽ mang lại một số lợi điểm nhất định.
Ví dụ như chúng ta đang chỉnh sửa một tính năng cũ theo yêu cầu của khách hàng, và chúng ta biết chắc rằng unit-test trước đây sẽ failed vì logic đã thay đổi. Trong tình huống này chúng ta chỉ cần build code để chạy thử, bỏ qua việc thực thi các unit test, điều này sẽ giúp chúng ta tiết kiệm được một khoảng thời gian đáng kể.
Trong bài viết này chúng ta sẽ cùng nhau tìm ra những cách skip test trong các maven project.
Maven Lifecycle
Trước khi chúng ta tìm hiểu về cách skip test trong maven, chúng ta cần hiểu rõ về maven lifecycle để biết khi nào test được compile(biên dịch) hoặc run(thực thi). Trong bài viết Maven goal và phase này mình có giải thích rõ hơn về maven lifecycle. Nhưng nếu đang đọc bài viết này mà bạn vẫn chưa nắm được khái những khái niệm này thì cũng đừng lo, chúng ta chỉ cần biết rằng Maven có thể:
- Ignore tests
- Compile tests
- Run tests
Skip Test với Command Line Flag
Skip Test compile
Gỉa sử mình có một test class như sau
import org.junit.Test; public class ExampleTest { @Test public void test() { deftblog; } }
Chúng ta có thể thấy đoạn code ở trên hoàn toàn không thể biên dịch được vì nó đang bị sai syntax. Khi chúng ta thực thi lệnh
mvn package
Có thể chúng ta sẽ gặp lỗi sau:
[INFO] ------------------------------------------------------------- [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] /C:/Users/hai.nguyen/Desktop/skiptest/src/test/java/ExampleTest.java:[7,9] not a statement [INFO] 1 error [INFO] -------------------------------------------------------------
Trong thực tế, bạn có thể gặp trường hợp là đang chỉnh sửa code trong một class, interface hay thậm chí là xóa chúng đi, khi đó các unit-test đang sử dụng những class, interface sẽ không còn khả năng biên dịch. Chúng ta có thể bỏ bỏ qua giai đoạn compile mã nguồn test trong trường hợp này với maven.test.skip flag.
mvn -Dmaven.test.skip package
Skip Test Execution
Ở lựa chọn thứ 2 chúng ta có thể compile mã nguồn test nhưng có thể bỏ qua việc thực thi chúng. Việc này sẽ hiệu quả trong trường hợp các class, interface được sử dụng trong các unit-test không bị chỉnh sửa các signature (kiểu trả về, tham số) hoặc bị xóa.
import org.junit.Test; import static org.junit.Assert.fail; public class ExampleTest { @Test public void thisTestFails() { fail("This is a failed test case"); } }
Bởi vì trong unit-test trên sử dụng mệnh đề fail(), nếu chúng ta thực thi maven package thì quá trình này sẽ xảy ra lỗi
Results : Failed tests: thisTestFails(ExampleTest): This is a failed test case Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
Bây giờ chúng ta vẫn muốn biên dịch mã nguồn bên trong thư mục test nhưng không muốn chạy chúng. Thì chúng ta có thể sử dụng như sau:
mvn -DskipTests package
Maven Configuration
Trong trường hợp chúng ta cần bỏ qua việc biên dịch hoặc chạy các unit-test trong một khoảng thời gian dài , chúng ta có thể làm điều đó bằng cách cấu hình trong pom.xml.
Skip Test Compile
Tương tự như phần trên đã bàn luận, chúng ta có thể tránh việc maven compile test folder với cấu hình sau được đặt trong file pom.xml.
<properties> <maven.test.skip>true</maven.test.skip> </properties>
Lưu ý rằng chúng ta có thể ghi đè giá trị này bằng cách chạy lệnh sau:
mvn -Dmaven.test.skip=false package
Skip Test Execution
Tiếp tục, chúng ta có thể compile test folder nhưng có thể không chạy chúng bằng cách cấu hình maven sử dụng Maven Surefire Plugin:
<properties> <tests.skip>true</tests.skip> </properties> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> <configuration> <skipTests>${tests.skip}</skipTests> </configuration> </plugin>
Chúng ta cũng có thể ghi đè giá trị này với lệnh sau:
mvn -Dtests.skip=false package
Tóm lược
Skip test là một việc không được khuyến khích trong phát triển ứng dụng, tuy nhiên vẫn có một số trường hợp nó giúp chúng ta tăng tốc độ phát triển ứng dụng nếu sử dụng thích hợp.
Nguồn tham khảo