Trong hình 4.1 mô tả quy trình tổng quan xây dựng công cụ kiểm tra độ phủ, quy trình này có thể chia thành các bước như sau: bước 1 ghi lại vết ngăn xếp chương trình khi thực thi với bộ test case, bước 2 phân tích dữ liệu vết ngăn xếp và mã nguồn đầu vào, bước 3 so sánh dữ liệu phân tích ở bước 2 để so sánh mức độ phủ của bộ test case.
Bước 1: Ghi lại vết ngăn xếp chương trình khi thực thi với bộ test case
Để kiểm tra độ phủ của bộ test, chúng ta viết Test driver để điều phối quá trình kiểm thử. Test driver có hai đầu vào đó là phương thức cần kiểm tra và các ca kiểm thử (test suite) cho phương thức đó. Java Pathfinder hỗ trợ việc ghi lại vết khi thực thi chương trình nếu cấu hình trong file *. jpf. File *.jpf nhận đầu vào là Test driver và các cấu hình thuộc tính thích hợp cho việc ghi vết. Thực thi file *.jpf kết quả vết được lưu ở file đầu ra nằm trong thư mục report.
Quá trình hiển thị vết được thực hiện hiện trong phương thức publishTrace()
trong lớp ConsolePublisher.java.
protected void publishTrace() {
Path path = reporter.getPath();
int i = 0;
if (path.size() == 0) {
return; // nothing to publish
}
publishTopicStart("trace " + reporter.getLastErrorId());
for (Transition t : path) {
out.println(START_PRINT_SOURCE + i++ + " thread: "
+ t.getThreadIndex());
if (showCG) {
out.println(t.getChoiceGenerator());
}
if (showSteps) {
String lastLine = null;
MethodInfo lastMi = null;
31
Biến thành viên “reporter” là một thể hiện của lớp Reporter. Tất cả các thông tin vết về chương trình trong quá trình chạy sẽ được lưu vào lớp Reporter. Lớp ConsolePublisher sử dụng kết quả của lớp Reporter để ghi vết ngăn xếp vào file hoặc console.
Thiết lập giá trị cho file cấu hình:
- JPF chỉ ghi lại vết ngăn xếp khi có ngoại lệ, vì vậy trong Test Driver luôn cần xảy ra một ngoại lệ.
- Định nghĩa các thuộc tính có chức năng ghi vết chương trình. Có thể định nghĩa các thuộc tính này ở hai nơi:
+ File “jpf.properties” sẽ định nghĩa chung các thuộc tính cho tất cả các chương trình JPF.
+ File *.jpf sẽ ghi đè lên các thuộc tính cần thay đổi giá trị mặc định được định nghĩa trong file jpf.properties nếu bị trùng lặp.
Các thuộc tính về việc ghi lại vết ngăn xếp vào file sẽ được thiết lập trong lớp ConsolePublisher.java
public ConsolePublisher(Config conf, Reporter reporter) {
super(conf, reporter);
port = conf.getString("report.console.port");
showCG = conf.getBoolean("report.console.show_cg", true);
showSteps = conf.getBoolean("report.console.show_steps", true);
showLocation = conf.getBoolean("report.console.show_location",true)
showSource = conf.getBoolean("report.console.show_source",true);
showMethod = conf.getBoolean("report.console.show_method", false);
showCode = conf.getBoolean("report.console.show_code", false);
isDebug = conf.getBoolean("debug", false);
fileName = conf.getString("report.console.file");
if (fileName == null){
fileName = conf.getString("target") + ".log";
}
if (System.getenv("JPF_HOME") == null ||
System.getenv("JPF_HOME") == ""){fileName =
System.getProperty("java.io.tmpdir") + File.separator + fileName;
} else {
fileName = System.getenv("JPF_HOME") + File.separator +
"report" + File.separator + fileName;
} }
Một số thuộc tính quan trọng được thiết lập giá trị “true” : + report.console.file : ghi lại vết ngăn xếp vào file.
32
+ report.console.show_steps: ghi lại các bước trong quá trình thực thi chương trình.
+ report.console.show_location: ghi lại tên lớp, vị trí tại dòng thứ mấy. +report.console.show_source: ghi lại mã nguồn java.
Nếu không khai báo “report.console.file”, vết ngăn xếp sẽ được hiển thị ra màn hình console. Sau khi cấu hình file *.jpf kết quả thu được là vết ngăn xếp khi thực thi của một chương trình java. Kết quả vết ngăn xếp được lưu ra file như trong hình 4.2