JUnit Hướng dẫn chú thích với ví dụ: @Test và @After là gì

⚡ Tóm tắt thông minh

JUnit Chú thích là một dạng siêu dữ liệu cú pháp được thêm vào. Java mã nguồn để trình chạy thử nghiệm biết cần thực thi những phương thức nào, khi nào chạy chúng và mỗi phương thức có thể mất bao lâu.

  • 🔘 @Bài kiểm tra: Đánh dấu một phương thức vô hiệu công khai mà JUnit Thực thi như một trường hợp kiểm thử duy nhất.
  • ☑️ Vòng đời: @Before và @After bao bọc mọi bài kiểm tra, trong khi @BeforeClass và @AfterClass bao bọc toàn bộ lớp.
  • Điều khiển: @Ignore bỏ qua một bài kiểm tra, @Test(timeout) giới hạn thời gian chạy, @Test(expected) khẳng định một ngoại lệ được ném ra.
  • 🧪 Khẳng định: org.junit.Assert cung cấp các phương thức assertEquals, assertTrue, assertNull, assertSame và fail().
  • 🛠️ Di sản: TestCase, TestResult và TestSuite thuộc về gói junit.framework cũ hơn.
  • 📊 JUnit 5: Jupiter đổi tên các thuộc tính này thành @BeforeEach, @AfterEach, @BeforeAll, @AfterAll và @Disabled.

JUnit Hướng dẫn về chú thích bao gồm @Test, @Before và @After

Là gì JUnit Chú thích?

JUnit chú thích là một dạng siêu dữ liệu cú pháp đặc biệt có thể được thêm vào Java mã nguồn để có khả năng đọc và cấu trúc mã tốt hơn. Các biến, tham số, gói, phương thức và lớp có thể được chú thích. Các chú thích đã được giới thiệu trong JUnit 4, điều này làm cho Java Mã nguồn dễ đọc và đơn giản hơn. Đây là sự khác biệt lớn giữa... JUnit 3 và JUnit 4: JUnit 4 là dựa trên chú thích.

Với kiến ​​thức cơ bản về các chú thích này, người ta có thể dễ dàng học và triển khai một hệ thống. JUnit Bài kiểm tra. Dưới đây là quan trọng và được sử dụng thường xuyên JUnit danh sách chú thích, với JUnit 5 (Sao Mộc) tương đương bên cạnh mỗi mục:

S.No. Chú thích Mô tả Chi tiết JUnit 5 tương đương
1. @Thử nghiệm Chú thích này thay thế cho junit.framework.TestCase và cho biết rằng phương thức công khai void được gắn kèm có thể được thực thi như một trường hợp kiểm thử. @Test (org.junit.jupiter.api)
2. @Trước Chú thích này được sử dụng nếu bạn muốn thực thi một số câu lệnh như điều kiện tiên quyết trước mỗi trường hợp kiểm thử. @TrướcMỗi
3. @BeforeClass Chú thích này được sử dụng nếu bạn muốn thực thi một số câu lệnh trước tất cả các trường hợp kiểm thử, ví dụ như một kết nối kiểm thử cần được mở trước tất cả các trường hợp kiểm thử. @TrướcTất cả
4. @Sau đó Chú thích này có thể được sử dụng nếu bạn muốn thực thi một số câu lệnh sau mỗi câu lệnh. Trường hợp thử nghiệmVí dụ như đặt lại các biến hoặc xóa các tập tin tạm thời. @SauMỗi
5. @Sau giờ học Chú thích này có thể được sử dụng nếu bạn muốn thực thi một số câu lệnh sau khi tất cả các trường hợp kiểm thử đã được hoàn thành, ví dụ như giải phóng tài nguyên sau khi thực thi tất cả các trường hợp kiểm thử. @SauTất cả
6. @Phớt lờ Chú thích này có thể được sử dụng nếu bạn muốn bỏ qua một số câu lệnh trong quá trình thực thi kiểm thử, ví dụ như vô hiệu hóa một số trường hợp kiểm thử trong quá trình thực thi. @Tàn tật
7. @Test(thời gian chờ=500) Chú thích này có thể được sử dụng nếu bạn muốn đặt thời gian chờ trong quá trình thực thi kiểm thử, ví dụ như khi bạn đang làm việc theo thỏa thuận mức độ dịch vụ (SLA) và các bài kiểm thử cần được hoàn thành trong một khoảng thời gian nhất định. @Timeout hoặc assertTimeout
8. @Test(expected=IllegalArgumentException.class) Chú thích này có thể được sử dụng nếu bạn muốn xử lý một số ngoại lệ trong quá trình thực thi kiểm thử. Ví dụ, nếu bạn muốn kiểm tra xem một phương thức cụ thể có ném ra một ngoại lệ được chỉ định hay không. assertThrows

JUnit Ví dụ về chú thích

Hãy tạo một lớp bao gồm quan trọng JUnit chú thích bằng các câu lệnh in đơn giản và thực thi nó bằng lớp chạy thử:

Bước 1) Hãy xem xét những điều dưới đây. Java Lớp này có nhiều phương thức được gắn với các chú thích đã liệt kê ở trên:

JunitAnnotationsExample.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

Bước 2) Hãy tạo một lớp chạy thử nghiệm để thực thi bài kiểm tra trên:

TestRunner.java

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

Kết quả mong đợi

  • Tất cả các trường hợp kiểm thử sẽ được thực thi lần lượt từng cái một, và tất cả các câu lệnh in ra đều có thể được xem trên bảng điều khiển.
  • Như đã thảo luận trong bảng trên, @Before và @BeforeClass trong JUnit [ Các phương thức m2() và m1() ] sẽ được thực thi trước mỗi trường hợp kiểm thử và trước tất cả các trường hợp kiểm thử tương ứng.
  • Tương tự như vậy, @After và @AfterClass trong JUnit (Các phương thức m4() và m3()) sẽ được thực thi sau mỗi trường hợp kiểm thử và sau tất cả các trường hợp kiểm thử tương ứng. @Ignore (phương thức m6()) sẽ được coi là bỏ qua bài kiểm thử.

Hãy cùng phân tích các trường hợp kiểm thử được sử dụng ở trên. Java lớp một cách chi tiết:

  1. Hãy xem xét phương thức m5() như được đưa ra bên dưới:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

Trong phương pháp trên, khi bạn thêm một chuỗi vào biến “list”:

  • Danh sách trống() sẽ trả về sai.
  • khẳng địnhFalse(list.isEmpty()) phải trả về true.
  • Kết quả là ca kiểm thử sẽ vượt qua.

Vì bạn chỉ thêm một chuỗi vào danh sách, nên kích thước của danh sách là một.

  • danh sách.size() Phải trả về giá trị số nguyên “1”.
  • So khẳng địnhEquals(1, list.size()) phải trả về true.
  • Kết quả là ca kiểm thử sẽ vượt qua.
  1. Hãy xem xét phương thức m7() như được đưa ra bên dưới:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Như đã thảo luận ở trên, @Test(thời gian chờ = 10) Tham số này được sử dụng để thiết lập thời gian chờ trong trường hợp kiểm thử. Giá trị được tính bằng mili giây, vì vậy hàm m7() phải hoàn thành trong vòng 10 ms.

  1. Hãy xem xét phương thức m8() như được đưa ra bên dưới:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Như đã thảo luận ở trên, @Test(dự kiến) Phương thức m8() sẽ kiểm tra ngoại lệ được chỉ định trong quá trình thực thi, do đó nó sẽ ném ra ngoại lệ “No Such Method Exception”. Kết quả là, bài kiểm tra sẽ được thực thi với một ngoại lệ.

Lưu ý về độ chính xác: Hàm m8() chỉ in ra một dòng, vì vậy ngoại lệ đã khai báo thực tế không bao giờ được ném ra. JUnit 4 báo cáo bài kiểm tra thất bại. Hãy điều chỉnh kiểu dữ liệu mong đợi sao cho phù hợp với kiểu dữ liệu mà phương thức thực sự trả về. JUnit 5 viết điều này với assertThrows.

Vì tất cả các trường hợp kiểm thử đều được thông qua, điều này dẫn đến việc thực hiện kiểm thử thành công.

Kết quả thực tế

Vì ví dụ trên có ba trường hợp kiểm thử, nên tất cả các trường hợp kiểm thử sẽ được thực thi lần lượt. Xem ảnh chụp màn hình giao diện dòng lệnh bên dưới:

Eclipse Hiển thị đầu ra trên bảng điều khiển cho thấy các câu lệnh in @BeforeClass, @Before, @After và @AfterClass.
Kết quả đầu ra trên bảng điều khiển được tạo bởi JunitAnnotationsExample

Xem các câu lệnh in bên dưới có thể nhìn thấy trên bảng điều khiển:

Sử dụng @BeforeClass , được thực thi trước tất cả các trường hợp thử nghiệm

Sử dụng chú thích @Before, được thực thi trước mỗi trường hợp kiểm thử

Sử dụng @After, được thực thi sau mỗi trường hợp kiểm thử

Sử dụng chú thích @Before, được thực thi trước mỗi trường hợp kiểm thử

Sử dụng @Test(timeout), nó có thể được sử dụng để thực thi thời gian chờ trong JUnit4 trường hợp thử nghiệm

Sử dụng @After, được thực thi sau mỗi trường hợp kiểm thử

Sử dụng chú thích @Before, được thực thi trước mỗi trường hợp kiểm thử

Sử dụng @Test(expected) , nó sẽ kiểm tra ngoại lệ được chỉ định trong quá trình thực thi

Sử dụng @After, được thực thi sau mỗi trường hợp kiểm thử

Sử dụng @AfterClass, được thực thi sau tất cả các trường hợp thử nghiệm

JUnit Khẳng định lớp

Các chú thích quyết định khi nào một phương thức được thực thi; các phương thức khẳng định quyết định liệu nó có thành công hay không.

Lớp này cung cấp một loạt các phương thức khẳng định hữu ích trong việc viết trường hợp kiểm thử. Nếu tất cả các câu lệnh khẳng định đều được thông qua, kết quả kiểm thử sẽ thành công. Nếu bất kỳ câu lệnh khẳng định nào thất bại, kết quả kiểm thử sẽ thất bại. Lớp chuyên dụng này cung cấp một loạt các phương thức khẳng định hữu ích trong việc viết trường hợp kiểm thử. Nếu tất cả các câu lệnh khẳng định đều được thông qua, kết quả kiểm thử sẽ thành công. Nếu bất kỳ câu lệnh khẳng định nào thất bại, kết quả kiểm thử sẽ thất bại. JUnit khẳng định Bài hướng dẫn này sẽ trình bày chi tiết từng phương pháp.

Như bạn đã thấy ở phần trước, bảng dưới đây mô tả các phương thức Assert quan trọng và phần giải thích của chúng:

S.No. Phương pháp Mô tả Chi tiết
1. void khẳng địnhEquals(boolean dự kiến, boolean thực tế) Nó kiểm tra xem hai giá trị có bằng nhau hay không, tương tự như phương thức `equals` của lớp `Object`.
2. void khẳng địnhFalse(điều kiện boolean) Chức năng là kiểm tra xem một điều kiện có sai hay không.
3. void khẳng địnhNotNull(Đối tượng đối tượng) Chức năng “assertNotNull” là để kiểm tra xem một đối tượng có phải là null hay không.
4. void khẳng địnhNull(Đối tượng đối tượng) Chức năng “assertNull” là kiểm tra xem một đối tượng có rỗng hay không.
5. void khẳng địnhTrue(điều kiện boolean) Chức năng “assertTrue” là để kiểm tra xem điều kiện có đúng hay không.
6. vô hiệu thất bại() Nếu bạn muốn ném ra lỗi khẳng định, hàm fail() luôn trả về kết quả thất bại.
7. void khẳng địnhSame([Thông báo chuỗi] Chức năng “assertSame” là để kiểm tra xem hai đối tượng có tham chiếu đến cùng một đối tượng hay không.
8. void khẳng địnhNotSame([Thông báo chuỗi] Chức năng “assertNotSame” là để kiểm tra xem hai đối tượng không tham chiếu đến cùng một đối tượng.

JUnit Lớp trường hợp thử nghiệm

Để chạy nhiều bài kiểm tra, lớp TestCase có sẵn trong... junit.framework gói. Chú thích @Test cho biết JUnit Điều đó có nghĩa là phương thức công khai vô hiệu này (một trường hợp thử nghiệm ở đây) mà nó được gắn vào có thể được chạy như một trường hợp thử nghiệm.

Ghi chú phiên bản: Trường hợp thử nghiệm, Kết quả kiểm traTestSuite thuộc về di sản junit.framework gói từ JUnit 3. Chúng vẫn được đóng gói bên trong artifact junit 4.x, nhưng các bài kiểm tra dựa trên chú thích không kế thừa TestCase.

Bảng dưới đây trình bày một số phương pháp quan trọng hiện có. junit.framework.TestCase lớp học:

S.No. Phương pháp Mô tả Chi tiết
1. int countTestCase() Phương pháp này được sử dụng để đếm số lượng trường hợp kiểm thử được thực thi bởi hệ thống. run(TestResult tr) phương pháp.
2. TestResult createResult() Phương pháp này được sử dụng để tạo ra một Kết quả kiểm tra vật.
3. Chuỗi getName() Phương thức này trả về một chuỗi không có gì khác ngoài một Trường hợp thử nghiệm tên.
4. Chạy TestResult() Phương pháp này được sử dụng để thực hiện một bài kiểm tra, bài kiểm tra này sẽ trả về một giá trị. Kết quả kiểm tra vật.
5. void run(kết quả TestResult) Phương pháp này được sử dụng để thực hiện một bài kiểm tra có Kết quả kiểm tra đối tượng không trả về bất cứ thứ gì.
6. void setName(Tên chuỗi) Phương pháp này được sử dụng để đặt tên cho một TestCase.
7. void setUp() Phương pháp này được sử dụng để viết mã liên kết tài nguyên, ví dụ như tạo kết nối cơ sở dữ liệu.
8. void TearsDown() Phương pháp này được sử dụng để viết mã giải phóng tài nguyên, ví dụ như giải phóng kết nối cơ sở dữ liệu sau khi thực hiện một thao tác giao dịch.

JUnit Lớp kết quả kiểm tra

Khi bạn thực hiện một bài kiểm tra, nó sẽ trả về kết quả (dưới dạng một giá trị nào đó). Kết quả kiểm tra (đối tượng). Đối tượng TestResult này có thể được sử dụng để phân tích đối tượng kết quả. Kết quả kiểm thử này có thể là thất bại hoặc thành công.

Xem bảng bên dưới để biết các phương thức quan trọng được sử dụng trong lớp junit.framework.TestResult:

S.No. Phương pháp Mô tả Chi tiết
1. void addError(Kiểm tra thử nghiệm, Có thể ném được) Phương pháp này được sử dụng nếu bạn cần thêm lỗi vào bài kiểm tra.
2. void addFailure(Kiểm tra thử, AssertionFailedError t) Phương pháp này được sử dụng nếu bạn cần thêm một lỗi vào danh sách các lỗi.
3. void endTest(Kiểm tra thử nghiệm) Phương pháp này được sử dụng để thông báo rằng một bài kiểm tra đã được thực hiện (hoàn thành).
4. lỗi intCount() Phương pháp này được sử dụng để lấy các lỗi được phát hiện trong quá trình thực thi kiểm thử.
5. liệt kê lỗi() Phương pháp này chỉ đơn giản trả về một tập hợp (ở đây là một kiểu liệt kê) các lỗi.
6. int failedCount() Phương pháp này được sử dụng để đếm số lỗi được phát hiện trong quá trình thực thi kiểm thử.
7. chạy void (kiểm tra TestCase) Phương pháp này được sử dụng để thực hiện một trường hợp thử nghiệm.
8. int runCount() Phương pháp này chỉ đơn giản là đếm số lượng bài kiểm tra đã được thực thi.
9. void startTest(Kiểm tra thử nghiệm) Phương pháp này được sử dụng để thông báo rằng một bài kiểm tra đã được bắt đầu.
10. vô hiệu dừng() Phương pháp này được sử dụng để dừng quá trình chạy thử nghiệm.

JUnit Lớp bộ thử nghiệm

Nếu bạn muốn thực hiện nhiều bài kiểm tra theo một thứ tự cụ thể, bạn có thể làm điều đó bằng cách kết hợp tất cả các bài kiểm tra vào một nơi. Nơi này được gọi là bộ kiểm thử, và... JUnit bộ thử nghiệm Bài hướng dẫn này sẽ trình bày chi tiết một ví dụ đầy đủ.

Xem bảng bên dưới để biết các phương pháp quan trọng được sử dụng trong... junit.framework.TestSuite lớp học:

S.No. Phương pháp Mô tả Chi tiết
1. void addTest(Kiểm tra thử) Phương pháp này được sử dụng nếu bạn muốn thêm một bài kiểm tra vào bộ phần mềm.
2. void addTestSuite(Lớp lớp kiểm tra) Phương thức này được sử dụng nếu bạn muốn chỉ định lớp trong khi thêm bài kiểm tra vào bộ.
3. int countTestCase() Phương pháp này được sử dụng nếu bạn muốn đếm số lượng trường hợp thử nghiệm.
4. Chuỗi getName() Phương pháp này được sử dụng để lấy tên của bộ thử nghiệm.
5. void run(kết quả TestResult) Phương pháp này được sử dụng để thực hiện một bài kiểm tra và thu thập kết quả kiểm tra. Kết quả kiểm tra vật.
6. void setName(Tên chuỗi) Phương pháp này được sử dụng để đặt tên cho TestSuite.
7. Kiểm tra testAt(int chỉ số) Phương pháp này được sử dụng nếu bạn muốn trả về kết quả kiểm thử tại một chỉ mục nhất định.
8. int testCount() Phương pháp này được sử dụng nếu bạn muốn trả về số lượng bài kiểm tra trong bộ kiểm tra.
9. Cảnh báo kiểm tra tĩnh (Thông báo chuỗi) Phương pháp này trả về một bài kiểm tra sẽ thất bại và ghi lại một thông báo cảnh báo.

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

Đúng vậy. Một phương thức thường mang theo chú thích @Test cùng với @Ignore, hoặc @Test với cả thời gian chờ và ngoại lệ dự kiến. Bạn không thể xếp chồng hai chú thích vòng đời, chẳng hạn như @Before và @After, trên cùng một phương thức.

@Ignore chỉ vô hiệu hóa một phương thức JUnit Nó đã được nhận diện là một bài kiểm tra. Nếu không có chú thích `@Test` bên cạnh, trình chạy sẽ không bao giờ thu thập phương thức đó, vì vậy nó không được chạy cũng không được liệt kê là bị bỏ qua.

JUnit Phương thức này được thực thi trên một luồng riêng biệt và sẽ báo lỗi TestTimedOutException khi hết thời gian quy định. Luồng bị gián đoạn chứ không bị chấm dứt, vì vậy một lệnh gọi chặn có thể tiếp tục chạy.

Chỉ có thể thông qua công cụ cổ điển. Việc thêm junit-vintage-engine cho phép... JUnit Nền tảng chạy các bài kiểm tra org.junit hiện có mà không cần thay đổi, nhưng các bài kiểm tra Jupiter phải nhập org.junit.jupiter.api. Việc kết hợp cả hai bộ nhập khẩu trong cùng một lớp sẽ gây lỗi.

Chỉ dành cho mục đích bảo trì. Các bộ kiểm thử cũ kế thừa từ các đối tượng TestCase và Build TestSuite vẫn còn phổ biến trong các codebase cũ, vì vậy việc nhận biết API sẽ hữu ích. Các bài kiểm thử mới nên dựa trên chú thích.

JUnit Tạo một thể hiện mới của lớp kiểm thử cho mỗi phương thức kiểm thử, do đó không có thể hiện nào tồn tại khi quá trình thiết lập cấp lớp cần chạy. Một phương thức tĩnh không cần thể hiện nào, và JUnit Từ chối một khai báo không tĩnh.

Các trợ lý AI đọc phương thức đang được kiểm thử và đề xuất xem phần thiết lập có nên nằm trong `@Before` hay `@BeforeClass`, và liệu đường dẫn lỗi có cần `@Test(expected)` hay `assertThrows` hay không. Hãy coi mỗi đề xuất như một bản nháp.

Trợ lý GitHub Thường sắp xếp việc thiết lập và gỡ bỏ một cách chính xác, nhưng đôi khi lại lẫn lộn các bước. JUnit Nhập khẩu 4 và Jupiter vào cùng một tệp. Kiểm tra khối nhập khẩu trước khi chạy bộ kiểm thử.

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