SỐ 69
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.
[Đầu trang]
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:
[Đầu trang]
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é.
[Đầu trang]
Trang chủ
Nội lực "Peter Pan"
Cầu nối Intel Việt Nam
Chuyện trong tuần
Cõi người ta
Bình luận thị trường
Cõi Mô-bai
Chuyên đề
Bổ ngửa
Túi càn khôn IT
Hồ lô biến
Cảm về Game
Nhật ký e-CHÍP
Bản quyền Công ty Phần mềm & Truyền thông VASC
 99 Triệu Việt Vương HN; Tel: (04) 9782235 • email: echip@vasc.com.vn
Mọi chi tiết về kinh doanh và quảng cáo xin liên hệ Phòng Quảng cáo. Tel: (04) 9782077 kd@vasc.com.vn