[Thực hành] Tìm giá trị tuyệt đối

Automated Testing & TDD

Mục tiêu

Luyện tập viết Unit Test và lập trình TDD.

Mô tả

Trong phần này, chúng ta sẽ tạo một ứng dụng cho phép tính giá trị tuyệt đối của một số.

Hướng dẫn

Bước 1: Liệt kê các test case.

Các test case sẽ được sử dụng:

Đầu vàoKết quả
00
11
-11

Bước 2: Tạo dự án mới

Đặt tên dự án mới là absolute-number-calculator

Bước 3:Thực hiện bước thiết kế lớp và phương thức cơ bản

Tạo lớp AbsoluteNumberCalculator.

Lớp AbsoluteNumberCalulator có phương thức findAbsolute().

Sử dụng câu lệnh throw new UnsupportedOperationException(); để đánh dấu rằng phương thức này chưa hoàn thiện.

public class AbsoluteNumberCalculator {
public static int findAbsolute(int number){
throw new UnsupportedOperationException();
}
}

Trong bước này, chúng ta chỉ mới thiết kế cho lớp và phương thức. Phần mã nguồn xử lý nghiệp vụ vẫn chưa được triển khai.

Bước 4: Tạo thư mục test

Tạo thư mục test. Nhấn chuột phải vào tên dự án, chọn New > Directory và nhập tên thư mục là test.

Đánh dấu thư mục test là nơi chứa mã của các test case. Nhấn chuột phải vào thư mục test và chọn Mark Directory as > Test Resources Root.

Bước 5: Tạo lớp test

Mở lớp AbsoluteNumberCalculator và đặt trỏ chuột lên trên tên lớp.

Nhấn phím tắt ⌥⏎ để hiển thị danh sách menu.  Chọn Create Test.

Lựa chọn Testing library là JUnit5.

Nếu có thông báo “JUnit5 library not found in the module” thì nhấn nút Fix để cài đặt thư viện này.

Tick chọn phương thức findAbsolute(nunmber:int):int để sinh ra test case cho phương thức này.

Kết quả là lớp AbsoluteNumberCalculatorTest sẽ được sinh ra trong thư mục test.

import org.junit.jupiter.api.Test;

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

class AbsoluteNumberCalculatorTest {

@Test
void findAbsolute() {
}
}

Bước 6: Viết test (Bước 1 trong vòng đời của TDD)

Trong lớp AbsoluteNumberCalculatorTest Đổi tên phương thức findAbsolute() thành testFindAbsolute0() và viết test case đầu tiên.

@Test
void testFindAbsolute0() {
int number = 0;
int expected = 0;

int result = AbsoluteNumberCalculator.findAbsolute(number);
assertEquals(expected, result);
}

Trong đó:

  • number là biến chứa giá trị đầu vào.
  • expected là biến chứa giá trị mong muốn. Trong trường hợp này giá trị tuyệt đối của 0 là 0.
  • result là biến chứa giá trị thực tế do phương thức findAbsolute() tính toán và trả về
  • phương thức assertEquals() được sử dụng để so sánh giá trị mong muốn và giá trị thực tế

Thực thi test và quan sát kết quả:

Bước 7: Viết mã để pass test case (Bước 2 trong TDD)

Thay thế câu lệnh throw new UnsupportedOperationException(); trong lớp AbsoluteNumberCalculator bằng câu lệnh return 0;.

Thực thi test và quan sát kết quả: Test case trước đó đã pass.

Bước 8: Refactor mã nguồn (Bước thứ 3 trong TDD)

Trong trường hợp này mã nguồn của chúng ta khá đơn giản nên có thể là không có các tái cấu trúc cần thiết.

Bước 9: Lặp lại các bước của TDD (từ Bước 6 đến Bước 8) đối với các test case khác.

Mã nguồn của lớp AbsoluteNumberCalculatorTest có thể như sau:

import org.junit.jupiter.api.Test;

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

class AbsoluteNumberCalculatorTest {

@Test
void testFindAbsolute0() {
int number = 0;
int expected = 0;

int result = AbsoluteNumberCalculator.findAbsolute(number);
assertEquals(expected, result);
}

@Test
void testFindAbsolute1() {
int number = 1;
int expected = 1;

int result = AbsoluteNumberCalculator.findAbsolute(number);
assertEquals(expected, result);
}

@Test
void testFindAbsoluteNegative1() {
int number = -1;
int expected = 1;

int result = AbsoluteNumberCalculator.findAbsolute(number);
assertEquals(expected, result);
}
}

Mã nguồn của lớp AbsoluteNumberCalculator có thể như sau:

public class AbsoluteNumberCalculator {
public static int findAbsolute(int number){
if(number < 0)
return -number;
return number;
}
}

Mã nguồn tham khảo: https://github.com/codegym-vn/java-absolute-number-calculator


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Leave a Reply

Your email address will not be published. Required fields are marked *