Tạo JUnit Bộ thử nghiệm với ví dụ: @RunWith @SuiteClasses

⚡ Tóm tắt thông minh

JUnit Bộ kiểm thử tập hợp các trường hợp kiểm thử từ nhiều lớp khác nhau để chúng chạy cùng nhau trong một lần duy nhất, được điều khiển bởi các chú thích @RunWith(Suite.class) và @SuiteClasses và được khởi chạy thông qua một lớp chạy kiểm thử thông thường.

  • 🔘 Mục đích: Gom các bài kiểm tra từ nhiều lớp khác nhau vào một đơn vị có thể chạy được thay vì khởi chạy từng lớp kiểm tra riêng lẻ.
  • ☑️ Chú thích: @RunWith(Suite.class) ủy quyền việc thực thi, trong khi @SuiteClasses liệt kê mọi lớp mà bộ kiểm thử phải chạy.
  • Bước sau: Viết các lớp kiểm thử, thêm một lớp chứa cả hai chú thích, sau đó chạy nó từ một JUnitVận động viên chạy chính.
  • 🧪 Ví dụ: Tập tin JunitTest.java nhóm SuiteTest1 và SuiteTest2 lại với nhau, và bảng điều khiển báo cáo ba bài kiểm tra đã vượt qua.
  • 🛠️ JUnit 5: Jupiter thay thế trình chạy bằng @Suite cộng với @SelectClasses hoặc @SelectPackages trên công cụ bộ ứng dụng nền tảng.
  • 📌 Cạm bẫy: Hầu hết các lỗi đều do các bộ kiểm thử trống, thiếu các lệnh nhập khẩu và một lớp bộ kiểm thử tự chứa các phương thức @Test của chính nó gây ra.

Tạo ra một JUnit bộ kiểm thử với các chú thích @RunWith và @SuiteClasses

In JUnitBộ kiểm thử cho phép chúng ta tổng hợp tất cả. trường hợp thử nghiệm Từ nhiều lớp học khác nhau, hãy tập hợp chúng lại và chạy cùng nhau.

Để chạy bộ kiểm thử, bạn cần chú thích một lớp bằng cách sử dụng các chú thích được đề cập bên dưới:

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.class, test2.class…) hoặc @Suite.SuiteClasses({test1.class, test2.class…})

Với các chú thích ở trên, tất cả các lớp kiểm thử trong bộ kiểm thử sẽ bắt đầu thực thi lần lượt từng lớp một. Bản thân lớp bộ kiểm thử vẫn trống: nó chỉ là nơi chứa các chú thích, và trình chạy sẽ đọc các chú thích đó để quyết định lớp nào cần thực thi.

Các bước để tạo bộ thử nghiệm và người chạy thử nghiệm

Bốn bước dưới đây xây dựng bộ kiểm thử nhỏ nhất có thể chạy được: hai lớp kiểm thử thông thường, một lớp đặt tên cho chúng và một lớp chạy (runner) khởi động bộ kiểm thử từ phương thức main.

Bước 1) Tạo một lớp kiểm thử đơn giản (ví dụ: MyFirstClassTest) và thêm một phương thức được chú thích bằng @ @Thử nghiệm.

Lớp đầu tiên chỉ chứa một phương thức kiểm thử trống duy nhất, điều này đủ để chứng minh rằng bộ kiểm thử sẽ nhận diện được nó:

Lớp MyFirstClassTest Eclipse khai báo một myFirstMethod được chú thích bằng @Test

Bước 2) Tạo một lớp kiểm thử khác để thêm vào (ví dụ: MySecondClassTest) và tạo một phương thức được chú thích bằng @Test.

Lớp thứ hai có hình dạng hoàn toàn giống nhau, vì vậy bộ dữ liệu này có hai lớp riêng biệt để tổng hợp:

Lớp MySecondClassTest Eclipse khai báo một mySecondMethod được chú thích bằng @Test

Bước 3) Để tạo testSuite, trước tiên bạn cần chú thích lớp bằng @RunWith(Suite.class) và @SuiteClasses(class1.class, class2.class…).

Hãy lưu ý rằng lớp kiểm thử TestSuiteExample không khai báo bất kỳ phương thức kiểm thử nào của riêng nó — hai chú thích đã chứa tất cả thông tin:

TestSuiteExample được chú thích bằng @RunWith(Suite.class) và @SuiteClasses đặt tên là MyFirstClassTest và MySecondClassTest

Bước 4) Hãy tạo một lớp Test Runner để chạy bộ kiểm thử của chúng ta như được hướng dẫn bên dưới:

Người chạy bộ là một người bình thường. Java lớp có phương thức main truyền lớp suite cho JUnitCore:

Gọi lớp trình chạy thử nghiệm JUnitSử dụng Core.runClasses trên TestSuiteExample và in ra danh sách lỗi.

Code Giải thích:

  • Code Dòng 8: Khai báo phương thức main của lớp Test, phương thức này sẽ chạy chương trình của chúng ta. JUnit thử nghiệm.
  • Code Dòng 9: Thực hiện các trường hợp thử nghiệm bằng cách sử dụng JUnitCore.runClasses nhận tên lớp kiểm thử làm tham số (Trong ví dụ trên, bạn đang sử dụng TestSuiteExample.class được hiển thị ở bước 3).
  • Code Dòng 11: Xử lý kết quả bằng vòng lặp for và in ra kết quả thất bại.
  • Code Dòng 13: In ra kết quả thành công.

Đầu ra: Đây là kết quả cho thấy bài kiểm tra đã thành công mà không có lỗi nào. tracnhư được nêu bên dưới:

Eclipse JUnit Xem báo cáo: Chạy 2/2 với không lỗi và không thất bại cho TestSuiteExample

Thanh màu xanh lá cây xác nhận mục đích của một bộ kiểm thử: một lần chạy, một lần hiển thị kết quả và cả hai lớp đều được báo cáo bên dưới nút bộ kiểm thử chứ không phải trong hai lần chạy riêng biệt.

JUnit Ví dụ về bộ thử nghiệm

Hãy xem xét một ví dụ phức tạp hơn, trong đó các lớp bên trong bộ lớp thực sự... khẳng định Thay vì giữ một phương thức rỗng, hãy sử dụng một cái gì đó khác.

JunitTest.java

JunitTest.java là một lớp đơn giản được chú thích bằng `@JunitTest.java`. @RunWith@Thượng hạng chú thích. Bạn có thể liệt kê bất kỳ số lượng lớp nào trong bộ kiểm thử dưới dạng tham số, như được đưa ra bên dưới:

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.java

SuiteTest1.java Đây là một lớp kiểm thử có các phương thức kiểm thử in ra một thông báo, như được đưa ra bên dưới. Bạn sẽ sử dụng lớp này như một thành viên của bộ kiểm thử trong lớp đã đề cập ở trên. Nó dựa vào một lớp trợ giúp có tên là JUnitThông báo này được định nghĩa ở nơi khác trong cùng gói phần mềm và không được sao chép lại ở đây.

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.java

SuiteTest2.java là một lớp kiểm tra khác, tương tự như SuiteTest1.javaCó một phương thức kiểm thử để in ra thông báo như bên dưới. Bạn sẽ sử dụng lớp này như một thành viên của bộ kiểm thử trong... JunitTest.java.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

Đầu ra

Sau khi thực hiện Kiểm tra Junit.java, chứa một bộ phần mềm bao gồm SuiteTest1.javaSuiteTest2.javaBạn sẽ nhận được kết quả như bên dưới. Bảng điều khiển sẽ in ra các thông báo do cả hai lớp tạo ra:

Eclipse Bảng điều khiển hiển thị các thông báo được in ra từ cả hai lớp trong bộ kiểm thử sau khi JUnitTest hoàn tất.

JUnit view ghi lại cùng một lần chạy dưới dạng ba phương thức kiểm thử thành công được nhóm lại trong lớp suite:

Eclipse JUnit Xem báo cáo: Chạy thành công 3/3 cho JunitTest với SuiteTest1 và SuiteTest2 được mở rộng.

Lưu ý: Các nhãn trên bảng điều khiển trong ví dụ này bị đảo ngược — chuỗi được in ra bởi SuiteTest1 có nội dung là “Suite Test 2” và chuỗi được in ra bởi SuiteTest2 có nội dung là “Suite Test 1”. Các đoạn mã gốc được sao chép nguyên vẹn, vì vậy các nhãn vẫn giữ nguyên như tác giả đã viết; hãy đọc tên lớp trong… JUnit Hãy xem hình ảnh thay vì nhãn in khi bạn so khớp đầu ra với nguồn.

Cách tạo bộ kiểm thử trong JUnit 5

JUnit Phiên bản 5 loại bỏ hoàn toàn các runner, do đó @RunWith(Suite.class) không tồn tại trong các gói org.junit.jupiter. Các suite đã được chuyển sang... JUnit Nền tảng, nơi phân phối chúng trong một thành phần riêng biệt có tên gọi là junit-platform-suite-engineThêm phần phụ thuộc đó, sau đó chú thích một lớp bằng `@Suite` và một trong các chú thích bộ chọn.

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

Các chú thích bộ chọn thay thế danh sách @SuiteClasses duy nhất bằng một nhóm nhỏ các tùy chọn:

Chú thích Những gì nó chọn
@SelectClasses Các lớp kiểm thử riêng lẻ được đặt tên từng cái một, thay thế trực tiếp cho @SuiteClasses.
@SelectPackages Tất cả các lớp kiểm thử trong gói được đặt tên và trong tất cả các gói con của nó.
@IncludeClassNamePatterns Bộ lọc biểu thức chính quy được áp dụng lên trên vùng chọn.
@SuiteDisplayName Tên dễ đọc hơn sẽ được hiển thị trong báo cáo thay vì tên lớp.

Hai điểm khác biệt nữa cũng rất quan trọng trong thực tế. A JUnit Lớp suite có thể khai báo các phương thức @BeforeSuite và @AfterSuite, chạy một lần cho toàn bộ suite, và JUnit Ví dụ 4 ở trên vẫn được thực thi trên JUnit Nền tảng này sử dụng công cụ đồ họa cổ điển, vì vậy mã gốc trên trang này không cần phải viết lại để vẫn hoạt động.

Ưu điểm và hạn chế của JUnit Bộ thử nghiệm

Một dãy phòng là một nhómping cơ chế, không phải là khung kiểm tra Nó mang bản chất riêng, và điều đó định hình cả những gì nó làm tốt và những gì nó không còn hữu ích nữa.

Ưu điểm

  • Một lần khởi chạy sẽ kết hợp các lớp học có liên quan với nhau, ví dụ như một bộ tạo khói hoặc một... hồi quy Quá trình thiết lập được bắt đầu bằng một lệnh duy nhất.
  • Chế độ xem kết quả nhóm tất cả các lớp dưới một nút bộ kiểm thử duy nhất, giúp dễ dàng phát hiện lỗi chung hơn.
  • Danh sách thành viên được lưu trữ dưới dạng mã nguồn, vì vậy nó được xem xét và quản lý phiên bản giống như bất kỳ tệp nguồn nào khác.
  • Cùng một bộ ứng dụng có thể được khởi chạy từ IDE, từ một trình chạy như... JUnitTừ lõi, hoặc từ một công cụ xây dựng.

Hạn chế

  • @SuiteClasses là một danh sách được mã hóa cứng, vì vậy một lớp kiểm thử mới sẽ bị bỏ qua một cách âm thầm cho đến khi ai đó chỉnh sửa bộ kiểm thử.
  • Bộ tài liệu này không đảm bảo thứ tự sắp xếp nào khác ngoài thứ tự các lớp được liệt kê.
  • Không có gì được dùng chung giữa các hạng phòng thành viên, vì vậy một dãy phòng không thể thay thế cho một phòng thay đồ hoặc một hạng phòng cơ bản.
  • Các công cụ xây dựng hiện nay đã tự động phát hiện các lớp kiểm thử dựa trên quy ước đặt tên, điều này giúp cho việc sử dụng bộ kiểm thử trở nên dư thừa trong nhiều dự án.

Những lỗi thường gặp khi tạo JUnit Bộ thử nghiệm

Hầu hết các sự cố trong bộ phần mềm đều tạo ra một thông báo ngắn gọn, không hữu ích. Bảng dưới đây đối chiếu các thông báo bạn có thể gặp với nguyên nhân và cách khắc phục.

Thông báo hoặc triệu chứng Nguyên nhân Sửa chữa
initializationError: Không có phương thức nào có thể chạy được Lớp này được chạy như một lớp kiểm thử thông thường, nhưng nó chỉ chứa các chú thích. Thêm @RunWith(Suite.class) để trình chạy bộ kiểm thử tiếp quản thay vì trình chạy mặc định.
Không tìm thấy ký hiệu: lớp Suite Quá trình nhập Suite bị thiếu. Nhập org.junit.runners.Suite cùng với org.junit.runner.RunWith.
Chương trình vẫn diễn ra, nhưng một tiết học bị bỏ qua. Lớp học đó chưa bao giờ được thêm vào danh sách @SuiteClasses. Thêm lớp một cách rõ ràng, hoặc chuyển sang sử dụng `@SelectPackages`. JUnit 5.
Tên lớp không được trình biên dịch chấp nhận @Runwith hoặc @suiteClasses đã được gõ sai kiểu chữ hoa chữ thường. Java Các chú thích phân biệt chữ hoa chữ thường: hãy viết chính xác @RunWith và @SuiteClasses.
Các bài kiểm tra trong chính lớp suite sẽ không bao giờ được thực thi. Một phương thức @Test đã được thêm vào trình giữ bộ kiểm thử. Hãy giữ nguyên đối tượng chứa (holder) và chuyển phương thức kiểm thử vào một lớp thành viên.

Viết bản nhạc một lần và giữ nguyên.ping Việc đảm bảo tính chính xác mới là công việc thực sự. Nếu danh sách lệch khỏi các lớp trên đĩa, bộ kiểm tra sẽ báo màu xanh lá cây trong khi một phần của... kiểm tra đơn vị Lệnh này không bao giờ được thực thi, đây là một trong những lỗi âm thầm nhất. kiểm thử phần mềm.

Câu Hỏi Thường Gặp

Bộ lệnh thực thi các lớp theo thứ tự chúng được liệt kê, nhưng JUnit Không đảm bảo về thứ tự các phương thức bên trong mỗi lớp. Các bài kiểm tra phụ thuộc vào việc bài kiểm tra trước đó đã chạy sẽ dễ bị lỗi và nên được viết lại để hoạt động độc lập.

Đúng vậy. Đối với trình chạy kiểm thử, một lớp suite là một lớp thông thường, vì vậy việc đặt tên nó bên trong một danh sách `@SuiteClasses` khác sẽ lồng các suite vào nhau. Việc lồng ghép này hữu ích cho một bộ kiểm thử hồi quy cấp cao được xây dựng từ các suite mô-đun nhỏ hơn.

Các trợ lý AI đọc các lớp kiểm thử trên ổ đĩa, so sánh chúng với danh sách @SuiteClasses và đánh dấu các lớp chưa từng được thêm vào. Chúng cũng nhóm các lỗi lặp lại lại với nhau. tracPhân loại theo nguyên nhân gốc, giúp rút ngắn thời gian xử lý sự cố sau khi hệ thống báo cáo nhiều lỗi cùng lúc.

Phi công phụ Nó ghi cặp chú thích một cách nhanh chóng, nhưng thường xuyên lẫn lộn các ký tự. JUnit 4 và JUnit Có 5 lệnh import trong cùng một tệp. Hãy kiểm tra xem org.junit.runners.Suite và org.junit.platform.suite.api.Suite không bao giờ xuất hiện cùng nhau, vì chỉ có một trong số chúng khớp với runner của bạn.

Thêm junit-platform-suite-engine vào phạm vi kiểm thử. Các chú thích @Suite và @SelectClasses nằm trong junit-platform-suite-api, và artifact engine này sẽ tự động thêm vào, vì vậy thông thường chỉ cần một dependency là đủ.

Thông thường là không. Surefire và... Gradle Nhiệm vụ kiểm thử đã tự động tìm ra các lớp kiểm thử bằng cách đặt tên theo mẫu và chạy tất cả chúng. Việc viết một bộ kiểm thử chỉ đáng giá khi bạn muốn một tập hợp con được đặt tên, chẳng hạn như một bộ kiểm thử sơ bộ, nhỏ hơn so với toàn bộ quá trình chạy.

Trình chạy báo cáo lỗi khởi tạo cho thành viên đó, cho biết không tìm thấy phương thức nào có thể chạy được và toàn bộ bộ kiểm thử được đánh dấu là thất bại. Hãy xóa mục đó hoặc thêm phương thức @Test vào lớp.

Không nằm trong cùng một danh sách lựa chọn. Giữ nguyên JUnit 4 hạng mục trên động cơ cổ điển và chọn chúng từ... JUnit 5 bộ phần mềm theo gói, vì vậy cả hai công cụ đều hoạt động dưới cùng một hệ thống. JUnit Khởi chạy nền tảng mà không trộn lẫn các nhóm chú thích.

Tóm tắt bài viết này với: