Unit Test Siêu Cơ Bản Với Java

Khi viết ra một đoạn code, ngoài việc nó chịu chạy ra thì chúng ta cần phải đảm bảo nó chạy đúng với ý đồ của mình (đề bài, yêu cầu,…). Mọi người thường dùng cách in từng kết quả ra màn hình và kiểm tra bằng mắt, điều này rất tốn công sức cũng như thời gian. Unit Test ra đời để giúp ta phần nào đơn giản hóa câu chuyện này.

Unit Test là gì?

Trong kiểm thử phần mềm có 4 mức độ kiểm thử: Unit test ( kiểm thử mức đơn vị), Intergration test ( kiểm thử tích hợp), System test (kiểm thử hệ thống), Acceptance test (kiểm thử chấp nhận).

Unit test là mức độ kiểm thử nhỏ nhất trong quy trình kiểm thử phần mềm. Unit test kiểm thử các đơn vị nhỏ nhất trong mã nguồn như method, class, module…Do đó Unit test nhằm kiểm tra mã nguồn của các chương trình, các chức năng riêng rẽ hoạt động đúng hay không.

Unit testing được thực hiện bởi lập trình viên.

Hướng dẫn Unit Test với Java

Hôm nay mình sẽ hướng dẫn các bạn sử dụng Junit để làm test case cho Java. Trước tiên chúng ta cần chuẩn bị vài thứ:

  • IntelliJ
  • Maven
  • Junit 5
  • JDK 8 or later

1. Tạo project

Sau khi tạo xong project, các bạn thấy file pom.xml.

File pom.xml là nơi khai báo tất cả những gì liên quan đến dự án được cấu hình qua maven, như khai báo các dependency, version của dự án, tên dự án, repossitory … 

Chúng ta thêm các thư viện Junit thông qua pom.xml thay vì add file jar như lúc sử dụng ant.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>DemoUnitTest</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.6.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.6.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.6.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

2. Viết vài dòng code để có chuyện mà test nè

Tạo một class MathUtil ở ..\src\main\java  

MathUtil

public class MathUtil {
    public int sum(int a, int b){
        return a+b;
    }
}

3. Tạo testcase version đơn giản

Chúng ta viết vài test case nhẹ nhàng thông qua Annotation @Test và hàm assertEquals().

Tạo một class MathUtilTest tại ..\src\test\java 

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class MathUtilTest {
    MathUtil util = new MathUtil();

    @Test
    void test1(){
        assertEquals(util.sum(1,1),2);
    }
    @Test
    void test2(){
        assertEquals(util.sum(1,1),3);
    }
    @Test
    void test3(){
        assertEquals(util.sum(1,2),3);
    }
}

IntelliJ hỗ trợ các bạn chạy từng test case hoặc cả class test thông qua các nút hiện kế bên số dòng luôn nhé 😀 xịn xò chưa, các bạn cũng có thể assert nhiều lần trong một hàm test().

Khi chạy test, nó sẽ kiểm tra tất cả các Expected và Actual, nó chỉ cho bạn pass khi tất cả đều thành công, chỉ cần có 1 test sai xem như test fail. (Giống như toán tử and vậy đó).

Khi có sai sót xảy ra, nó sẽ hiện thông báo lên màn hình là test nào sai và sai cái gì.

Ví dụ nè, trong test2() mình để actual là (1+1) nhưng expected là 3 vì thế nó sẽ sai, toàn bộ bài test coi như 0 điểm :v

4. Unit Test với file csv

Thay vì viết từng testcase mệt mỏi thế này, chúng ta có thể sử dụng file csv để làm test case, đưa vào chỉ cần chạy file và trả kết quả thôi.

Tạo một file data.csv tại .\src\main\resources

a,	b,	result
1,	1,	2
1,	2,	3
1,	3,	4
1,	4,	5
1,	5,	6
2,	1,	3
2,	2,	4
2,	3,	5
2,	4,	6
2,	5,	7

tạo thêm 1 class MathUtilCsvTest.java

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import static org.junit.jupiter.api.Assertions.*;


public class MathUtilCsvTest {
    @ParameterizedTest
    @CsvFileSource(resources = "/Data.csv", numLinesToSkip = 1)
    void test(int a, int b, int result){
        MathUtil math = new MathUtil();
        assertEquals(math.sum(a,b),result);
    }
}

Các bạn nhớ sắp xếp các tham số trong hàm test() theo thứ tự các tham số trong file CSV nhé. Vì dòng đầu tiên mình dùng làm nơi để tên tham số cho đỡ nhầm lẫn rồi nên mình sẽ skip nó đi bằng numLinesToSkip = 1.

Tạm kết

Mình đã hướng dẫn các bạn sử dụng Junit để viết Unit Test cho Java. Đây chỉ là một ví dụ cơ bản và rất nhỏ về ứng dụng của Junit. Ngoài ra các bạn có thể tìm hiểu thêm một số quy tắc khi viết Test Case hoặc các hàm khác ngoài assertEqual() để có thể thực hiện công việc hiệu quả hơn nhé.