Java: Sử dụng Assertion
Assertion
Tất cả các assertion đều nằm trong lớp Assert.
public class Assert extends java.lang.Object
Lớp này cung cấp một tập hợp các phương thức assertion, hữu ích cho việc viết các test. Chỉ những assertion không thành công mới được ghi lại. Một số phương thức quan trọng của lớp Assert như sau:
Sr.No. | Phương thức & Mô tả |
---|---|
1 |
void assertEquals(boolean expected, boolean actual) Kiểm tra xem hai đối tượng hoặc hai giá trị nguyên thủy có bằng nhau không. |
2 |
void assertTrue(boolean condition) Kiểm tra xem điều kiện có đúng không. |
3 |
void assertFalse(boolean condition) Kiểm tra xem điều kiện có sai không. |
4 |
void assertNotNull(Object object) Kiểm tra xem một đối tượng có phải là not null không. |
5 |
void assertNull(Object object) Kiểm tra xem một đối tượng có phải là null không. |
6 |
void assertSame(object1, object2) Kiểm tra xem hai tham chiếu đối tượng có trỏ đến cùng một đối tượng hay không. |
7 |
void assertNotSame(object1, object2) Kiểm tra hai tham chiếu đối tượng có không trỏ đến cùng một đối tượng hay không. |
8 |
void assertArrayEquals(expectedArray, resultArray) Phương thức này sẽ kiểm tra xem hai mảng có bằng nhau hay không. |
Bây giờ ta hãy sử dụng một số phương thức được đề cập ở trên trong một ví dụ. Tạo file java có tên TestAssertions.java trong C:\>JUNIT_WORKSPACE.
import org.junit.Test; import static org.junit.Assert.*; public class TestAssertions { @Test public void testAssertions() { //test data String str1 = new String ("abc"); String str2 = new String ("abc"); String str3 = null; String str4 = "abc"; String str5 = "abc"; int val1 = 5; int val2 = 6; String[] expectedArray = {"one", "two", "three"}; String[] resultArray = {"one", "two", "three"}; //Check that two objects are equal assertEquals(str1, str2); //Check that a condition is true assertTrue (val1 < val2); //Check that a condition is false assertFalse(val1 > val2); //Check that an object isn't null assertNotNull(str1); //Check that an object is null assertNull(str3); //Check if two object references point to the same object assertSame(str4,str5); //Check if two object references not point to the same object assertNotSame(str1,str3); //Check whether two arrays are equal to each other. assertArrayEquals(expectedArray, resultArray); } }
Tiếp theo, tạo file java có tên TestRunner.java trong C:\>JUNIT_WORKSPACE để thực thi (các) test case.
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner2 { public static void main(String[] args) { Result result = JUnitCore.runClasses(TestAssertions.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Biên dịch các lớp Test case và Test Runner bằng javac:
C:\JUNIT_WORKSPACE>javac TestAssertions.java TestRunner.java
Bây giờ hãy chạy Test Runner, nó sẽ chạy test case được xác định trong lớp Test Case đã cung cấp.
C:\JUNIT_WORKSPACE>java TestRunner
Xác minh kết quả đầu ra.
true
Chú thích (Annotation)
Chú thích giống như thẻ meta mà bạn có thể thêm vào mã của mình và áp dụng chúng cho các phương thức hoặc trong lớp. Các chú thích này trong JUnit cung cấp thông tin sau về các phương thức kiểm thử:
- phương thức nào sẽ chạy trước và sau phương thức test.
- phương thức nào chạy trước và sau tất cả các phương thức.
- phương thức hoặc lớp nào sẽ bị bỏ qua trong quá trình thực thi.
Bảng sau cung cấp danh sách các chú thích và ý nghĩa của chúng trong JUnit:
Sr.No. | Chú thích & Mô tả |
---|---|
1 |
@Test Chú thích này cho JUnit biết rằng phương thức public void mà nó được đính kèm có thể được chạy như một test case. |
2 |
@Before Một số test cần các đối tượng tương tự được tạo trước khi chúng có thể chạy. Chú thích một phương thức public void với @Before khiến phương thức đó được chạy trước mỗi phương thức Test. |
3 |
@After Nếu bạn phân bổ tài nguyên bên ngoài trong phương thức Before, bạn cần giải phóng chúng sau khi chạy test. Chú thích phương thức public void với @After làm cho phương thức đó được chạy sau phương thức Test. |
4 |
@BeforeClass Việc chú thích một phương thức public static void với @BeforeClass khiến nó được chạy một lần trước bất kỳ phương thức test nào trong lớp. |
5 |
@AfterClass Điều này sẽ thực hiện phương thức sau khi kết thúc tất cả các test. Điều này có thể được sử dụng để thực hiện các hoạt động dọn dẹp (clean-up). |
6 |
@Ignore Được sử dụng để bỏ qua test và test đó sẽ không được thực hiện. |
Tạo file lớp java có tên JunitAnnotation.java trong C:\>JUNIT_WORKSPACE để kiểm tra chú thích.
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 JunitAnnotation { //execute before class @BeforeClass public static void beforeClass() { System.out.println("in before class"); } //execute after class @AfterClass public static void afterClass() { System.out.println("in after class"); } //execute before test @Before public void before() { System.out.println("in before"); } //execute after test @After public void after() { System.out.println("in after"); } //test case @Test public void test() { System.out.println("in test"); } //test case ignore and will not execute @Ignore public void ignoreTest() { System.out.println("in ignore test"); } }
Tiếp theo, tạo một file java có tên TestRunner.java trong C:\>JUNIT_WORKSPACE để thực thi các chú thích.
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(JunitAnnotation.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Biên dịch các lớp Test case và Test Runner bằng javac:
C:\JUNIT_WORKSPACE>javac JunitAnnotation.java TestRunner.java
Bây giờ hãy chạy Test Runner, nó sẽ chạy test case được xác định trong lớp Test Case đã cung cấp.
C:\JUNIT_WORKSPACE>java TestRunner
Xác minh kết quả đầu ra.
in before class in before in test in after in after class true