|
HỒ LÔ BIẾN |
LÀM QUEN VỚI JUNIT
[Hoàng Ngọc Giao] |
|
Bạn biết không, JUnit là công cụ giúp
ta thử nghiệm, gỡ rối chương trình Java. Với JUnit,
bạn dễ dàng theo dõi diễn biến của chương trình,
nhanh chóng dàn dựng hàng loạt phép thử (test case)
để kiểm tra xem mọi việc có xảy ra đúng như dự định
hay không. Thuở ban đầu, JUnit được xây dựng bởi
Kent Beck và Erich Gamma. Sau đó, giới lập trình
viên Java "xúm vào", biến JUnit thành một đề án
nguồn mở. Ngày nay, JUnit trở thành một thứ "công cụ
chuẩn" mà mọi lập trình viên Java đều nên biết cách
dùng. Bạn có thể thoải mái lấy JUnit về dùng tại địa
chỉ mạng: |
http://prdownloads.sourceforge.net/junit
hoặc
http://www.junit.org/index.htm |
|
Trong tập tin nén .zip thu được, ngoài tài
liệu hướng dẫn, bạn thấy có tập tin chương trình
Java ở dạng đóng gói mang tên junit.jar. Bạn hãy đặt
junit.jar vào thư mục jre/lib/ext bên trong thư mục
chứa công cụ lập trình JDK. Chẳng hạn, trên Windows,
đấy có thể là thư mục
C:\jdk1.4\jre\lib\ext. |
|
Nếu có lúc rảnh, bạn nên ngó vào mã nguồn của
JUnit (tập tin src.jar). Bạn sẽ thấy các mẫu dáng
thiết kế (design pattern) được dùng rất "đậm đặc"
trong đó. |
|
Viết một phép thử |
Với JUnit, bạn tạo ra một phép thử đơn giản qua ba bước:
1. Viết một lớp con (subclass) của lớp junit.framework.TestCase.
Lớp như vậy biểu diễn một phép thử. Để cho gọn, ta gọi nó là lớp thử.
2. Viết hàm dựng (constructor) của lớp ấy với một đối mục duy nhất thuộc
kiểu String và đặt tên là name. Trong hàm dựng đó, bạn phải gọi hàm dựng của lớp
cha bằng câu lệnh:
super(name);
3. Viết các hàm thử nghiệm có tên bắt đầu bằng từ test. Các hàm như vậy
phải không có đối mục (argument) và có kiểu trả về là void. Ta sẽ gọi
chúng là các hàm thử.
Chẳng hạn lớp SimpleTest ở đoạn mã 1 biểu diễn một phép thử, kiểm
tra xem có phải... 2 nhân với 2 bằng 4. |
|
Đoạn mã 1 |
// SimpleTest.java
import junit.framework.*;
public class SimpleTest extends TestCase {
public SimpleTest(String name) {
super(name);
}
public void testSomething() {
assertTrue(4 == (2 * 2));
}
} |
|
Hàm assertTrue(boolean) là một hàm của lớp TestCase, giúp bạn kiểm
tra một biểu thức điều kiện, xem nó là true hay false. Nếu biểu thức ấy có trị
false (không như mong đợi), hàm assertTrue sẽ "la làng" ngay! Nếu muốn thực hiện
những phép thử khác nữa, bạn chỉ cần viết thêm vào lớp SimpleTest những hàm khác
tương tự như testSomething(), miễn là tên hàm được bắt đầu bởi từ test. |
|
|
|
Chạy một phép thử |
|
Để chạy một phép thử, bạn cần dùng lớp junit.textui.TestRunner hoặc lớp junit.swingui.TestRunner.
Chẳng hạn, ta dùng junit.textui.TestRunner bằng cách viết thêm một chút vào lớp
SimpleTest như sau: |
public static void
main(String[] args) {
junit.textui.TestRunner.
run(SimpleTest.class);
} |
|
Như bạn thấy, ta trao lớp biểu diễn phép thử
SimpleTest cho hàm run(Class) của TestRunner. Chạy
chương trình trên, bạn thấy kết quả hiện ra trong
cửa sổ dòng lệnh như sau: |
.
Time: 0
OK (1 test) |
|
Dấu chấm (.) cho biết đang tiến hành một phép thử.
Vì trong lớp SimpleTest chỉ có một hàm thử
testSomething() nên bạn thấy chỉ có một dấu chấm.
Thời gian thực hiện các phép thử và kết quả cuối
cùng được thông báo rõ ràng. Nếu không thích cách
thể hiện thô sơ trên dòng lệnh, bạn hãy sửa lại một
chút trong lớp SimpleTest: |
public static void
main(String[] args) {
junit.swingui.TestRunner.
run(SimpleTest.class);
} |
|
Nghĩa là dùng junit.swingui.TestRunner thay cho
junit.textui.TestRunner. Chạy lại SimpleTest, bạn sẽ
thấy kết quả được trình bày "đàng hoàng" hơn trong
một cửa sổ duyên dáng mang tên JUnit như hình 1. |
|
 |
Bạn hãy để ý ô duyệt Reload classes every run mặc nhiên ở trạng
thái "bật". Điều này nghĩa là mỗi lần bạn bấm nút Run, lớp thử (ở đây là
SimpleTest) cùng các lớp khác có liên quan lại được nạp vào ký ức và các hàm thử
trong lớp thử được thi hành. Như vậy, bạn không cần đóng cửa sổ JUnit khi muốn
sửa đổi nội dung các lớp, biên dịch lại và thử nghiệm lần nữa.
Chẳng hạn, để yên cửa sổ JUnit, bạn... giả vờ sai lầm, sửa đổi hàm
testSomething() trong lớp SimpleTest như sau: |
|
|
public void testSomething() {
assertTrue(5 == (2 * 2));
} |
|

Hình 2 |
Sau khi biên dịch lại lớp SimpleTest, bạn bấm nút Run trên cửa sổ JUnit.
Hàm testSomething() trong lớp SimpleTest lại được thi hành và lần này JUnit "đỏ
mặt tía tai", không còn "bình tĩnh" như trước (hình 2).
Bạn chú ý, JUnit gọi kết quả âm tính của hàm assertTrue(boolean) là
failure. Điều này ngụ ý có sự nhầm lẫn nào đó dẫn đến kết quả không như mong
đợi nhưng dù sao đấy cũng là một kết quả khả dĩ và chương trình vẫn chạy bình
thường. Nếu chương trình của ta bị "đứt bóng" bởi hỏng hóc bất ngờ vào lúc chạy
như ArrayIndexOutOfBoundsException hoặc NullPointerException chẳng
hạn, JUnit gọi đấy là error.
Bạn đã thấy JUnit có ích ra sao rồi đó. Bạn dùng thử xem sao nhé. |
|
|