Assert trong java la gi

Trong bài trước, chúng ta đã cùng tìm hiểu về một số Annotation cơ bản của JUnit. Trong bài này, chúng ta sẽ cùng tìm hiểu một số API của JUnit như Assert, Test Runner (JUnitCore), Test Suite, Assume.

JUnit Assert Class

JUnit cung cấp các phương thức static để kiểm tra các điều kiện nhất định thông qua lớp Assert. Các phương thức này thường bắt đầu với assertXxx(). Nó cho phép chúng ta xác định thông báo lỗi (error message), kết quả mong đợi (expected) và kết quả thực tế (actual). Các phương thức Assert so sánh giá trị thực tế được trả về bởi một phương thức test với giá trị mong đợi, nó ném một AssertionException nếu so sánh thất bại.

Chúng ta có thể sử dụng Assert để kiểm tra kết quả mong đợi cho các primitive type, Object, array primitive, array Object.

  • assertEquals(): So sánh 2 giá trị để kiểm tra bằng nhau. Test sẽ được chấp nhận nếu các giá trị bằng nhau.
  • assertTrue(): Đánh giá một biểu thức luận lý. Test sẽ được chấp nhận nếu biểu thức đúng.
  • assertFalse(): Đánh giá biểu thức luận lý. Test sẽ được chấp nhận nếu biểu thức sai.
  • assertNull(): So sánh tham chiếu của một đối tượng với giá trị null. Test sẽ được chấp nhận nếu tham chiếu là null.
  • assertNotNull(): So sánh tham chiếu của một đối tượng với null. Test sẽ được chấp nhận nếu tham chiếu đối tượng khác null.
  • assertSame(): So sánh địa chỉ vùng nhớ của 2 tham chiếu đối tượng bằng cách sử dụng toán tử ==. Test sẽ được chấp nhận nếu cả 2 đều tham chiếu đến cùng một đối tượng.
  • assertNotSame(): So sánh địa chỉ vùng nhớ của 2 tham chiếu đối tượng bằng cách sử dụng toán tử ==. Test sẽ được chấp nhận nếu cả 2 đều tham chiếu đến các đối tượng khác nhau.
  • assertArrayEquals(): So sánh 2 mảng để kiểm tra bằng nhau. Test sẽ được chấp nhận nếu các giá trị của 2 mảng là bằng nhau.
  • assertThat() : So sánh một giá trị thực tế có thõa mãn với 1 org.hamcrest.Matcher được xác định hay không. Với matchers có thể kiểm tra kết quả của một string, number, collections…
  • fail(): Phương thức này làm cho test hiện hành thất bại, phương thức này thường được sử dụng khi xử lý các ngoại lệ.

Mặc dù chúng ta có thể chỉ cần sử dụng phương thức assertTrue() cho gần như hầu hết các test case, tuy nhiên thì việc sử dụng một trong các phương thức assertXXX() cụ thể sẽ làm cho các test của chúng ta dễ hiểu hơn và cung cấp các thông điệp thất bại rõ ràng hơn.

Ví dụ:

package com.gpcoder.junit; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.both; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.everyItem; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.sameInstance; import static org.hamcrest.CoreMatchers.startsWith; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Arrays; import org.hamcrest.core.CombinableMatcher; import org.junit.Test; public class AssertTest { @Test public void testAssertEquals() { assertEquals("failure - strings are not equal", "text", "text"); } @Test public void testAssertArrayEquals() { int[] arr1 = { 1, 2, 3 }; int[] arr2 = { 1, 2, 3 }; assertArrayEquals("failure - two arrays not same", arr1, arr2); } @Test public void testAssertTrue() { assertTrue("failure - should be true", true); } @Test public void testAssertFalse() { assertFalse("failure - should be false", false); } @Test public void testAssertNull() { assertNull("should be null", null); } @Test public void testAssertNotNull() { assertNotNull("should not be null", new Object()); } @Test public void testAssertSame() { Integer aNumber = Integer.valueOf(768); assertSame("should be same", aNumber, aNumber); } @Test public void testAssertNotSame() { assertNotSame("should not be same Object", new Object(), new Object()); } @Test public void testFail() throws Exception { Assert.fail("Make fails a test"); } }

Ví dụ assertThat() và sử dụng Matcher của thư viện org.hamcrest chúng ta sẽ cùng tìm hiểu ở một bài viết khác.

JUnit Assume Class

Annotation @Ingore cho phép chúng ta sử dụng để đánh dấu phương thức này để được bỏ qua (ignore/ disable), không cần thực thi test. Một cách khác để làm việc này là sử dụng Assume.assumeXxx() để định nghĩa điều kiện Test.

  • Assume.assumeFalse() : đánh dấu test là không hợp lệ, nếu điều kiện của nó đánh giá là đúng.
  • Assume.assumeTrue() : đánh giá test là không hợp lệ nếu điều kiện của nó đánh giá là sai.
  • Assume.assumeNotNull(), Assume.assumeThat(), ….

Khi chúng ta sử dụng các phương thức Assume, nếu một test case bị fail, JUnit runner sẽ xem như là một phương thức được @Ignore.

Ví dụ:

package com.gpcoder.junit; import static org.junit.Assume.assumeNotNull; import static org.junit.Assume.assumeTrue; import org.junit.Test; public class AssumeTest { @Test public void assumeTrueTest() { assumeTrue(true); System.out.println("execute test"); } @Test public void assumeNotNullTest() { Object object = null; assumeNotNull(object); System.out.println("execute test"); } }

Output của chương trình trên:

Assert trong java la gi

Như bạn thấy, phương thức assumeNotNullTest() mặc dù là fail, nhưng với việc sử dụng assumeNotNull() nên phương thức test này được đánh dấu như là @Ignore.

Bình thường, các IDE như NetBeans, Eclipse đều có sẵn trình chạy (runner) cho JUnit để hiển thị kết quả các test case, ví dụ:

Assert trong java la gi

Chúng ta có thể gọi một API được hỗ trợ từ JUnit để thực thi các class test một cách thủ công thông qua JUnitCore.

Để chạy từ chương trình Java ta sử dụng:

org.junit.runner.JUnitCore.runClasses(TestClass1.class, ...);

Để chạy từ console ta sử dụng:

java org.junit.runner.JUnitCore TestClass1 [...other test classes...]

Ví dụ:

package com.gpcoder.junit; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunnerExample { public static void main(String[] args) { Result result = JUnitCore.runClasses(AssertTest.class); System.out.println("Test result: " + result.wasSuccessful()); System.out.println("Total of runtime in milliseconds: " + result.getRunTime()); System.out.println("Number of tests run: " + result.getRunCount()); System.out.println("Number of tests ignore: " + result.getIgnoreCount()); System.out.println("Number of tests failure: " + result.getFailureCount()); for (Failure failure : result.getFailures()) { System.out.println("Failed -> " + failure.toString()); } } }

Output của chương trình:

Test result: false Total of runtime in milliseconds: 9 Number of tests run: 9 Number of tests ignore: 0 Number of tests failure: 1 Failed -> testFail(com.gpcoder.junit.AssertTest): Make fails a test

Tài liệu tham khảo:

  • https://github.com/junit-team/junit4/wiki/Assertions
  • https://github.com/junit-team/junit4/wiki/Assumptions-with-assume
  • https://github.com/junit-team/junit4/wiki/Test-runners

Chuyên mục: Unit Test Được gắn thẻ: JUnit

Bình luận

bình luận