Một đường đi thể hiện một luồng thực thi từ khi bắt đầu đến khi kết thúc một hàm. Một phương thức với N quyết định sẽ có 2^N đường đi, và nếu phương thức có chứa vòng lặp thì có thể có vô số đường đi. Nhưng may thay, ta có thể sử dụng phương pháp được gọi là Cyclomatic Complexity [3] để làm giảm số đưòng đi mà chúng ta cần kiểm tra. Cysclomatic complexity của một phương thức là tổng số quyết định duy nhất trong phương thức. Cysclomatic complexity giúp ta định nghĩa số tuyến tính các đường độc lập, được gọi là các thiết lập cơ sở qua một phương thức. Các thiết lập cơ sở là các thiết lập các đường đi một cách ít nhất có thể. Giống như bao phủ nhánh, kiểm tra các đường thiết lập đảm bảo kiểm tra từng quyết định nhưng không giống như bao phủ nhánh, bao phủ đường đi đảm bảo kiểm tra tất cả các quyết định tác động động lập với nhau. Nói một cách khác, mỗi đường đi mới “flips” chính xác nhánh đã thực thi trước đó, các nhánh còn lại khác không thay đổi. Đây là nhân tố chủ yếu làm cho bao phủ đường đi mạnh mẽ hơn bao phủ nhánh, đồng thời nó còn cho phép ta nhìn nhận được những thay đổi khi một nhánh tác động lên hoạt động của một phương thức. Ta vẫn sẽ sử dụng ví dụ trong bao phủ câu lệnh và bao phủ nhánh để minh hoạ.
public class Path {
public int returnInput(int x, boolean condition1, boolean condition2, boolean condition3)
{
if(condition1) x++;
if(condition2) x--; if(condition3)
x =x; return x; } }
Để đạt được bao phủ 100% đường đi, chúng ta cần định nghĩa các đường cơ sở. Cysclomatic complexity của phương thức này là bốn, do vậy ta cần định nghĩa bốn tuyến đường độc lập nhau. Để thực hiện công việc này ta sẽ chọn bất kỳ đường đầu tiên làm đường cơ sở và sau đó sẽ lật các quyết định một lần cho tới khi ta có các đường thiết lập cơ sở.
Path 1: Chọn các giá trị “true” cho các quyết định, biểu diễn là TTT. Đây là đường đầu tiên trong thiết lập cơ sở của ta.
Path 2 : Ta sẽ tìm đường cơ sở tiếp theo, lật quyết định đầu tiên trong đường cơ sở, đem lại giá trị FTT, giá trị ta mong muốn quyết định tác động.
Path 3 : Lật quyết định thứ 2 trong đường cơ sở, đem lại cho ta giá trị TFT
Path 4 : Cuối cùng, lật quyết định thứ 3 trong đường cơ sở, ta được đường thứ 4 với giá trị TTF.
Vậy đã có 4 đường là : TTT, FTT,TFT và TTF. Tiếp theo đây ta sẽ xây dựng các ca kiểm thử và xem điều gì xảy ra. Hai đường đi TTT và FFF đã được kiểm tra trong bao phủ nhánh.Tiến hành kiểm tra đường đi FTT và TFT:
Test case 3: Kiểm tra FTT. Thực thi đoạn code sau : public class Path {
public int returnInput(int x, boolean condition1, boolean condition2, boolean condition3) { if(condition1) x++; if(condition2) x--; if(condition3)
x=x; return x; }
public static void main(String []args)
{ System.out.println("Test case : false-true-true");
System.out.println("Cac cau lenh trong cac dieu kien 1 se khong duoc thuc thi"); int x=0;
boolean condition1=false; boolean condition2=true; boolean condition3=true;
Path constructorInstance=new Path();
int methodReturn= constructorInstance.returnInput(x, condition1, condition2,condition3);
System.out.println("Ket qua mong doi : output value = input value"); System.out.println("output value :"+methodReturn); } }
Kết quả :
Hình 7: Kết quả thực hiện test case 3
Hình 8 : Kết quả đo bao phủ khi thực hiện test case 3
Test case 4 : Kiểm tra TFT.Thực thi đoạn code sau : public class Path {
public int returnInput(int x, boolean condition1, boolean condition2, boolean condition3) { if(condition1) x++; if(condition2) x--; if(condition3) x=x; return x; }
public static void main(String []args) {
System.out.println("Test case : true-false-true");
System.out.println("Cac cau lenh trong cac dieu kien 2 se khong duoc thuc thi"); int x=0;
boolean condition1=false; boolean condition2=true; boolean condition3=true;
Path constructorInstance=new Path();
int methodReturn= constructorInstance.returnInput(x,
condition1,condition2,condition3);
System.out.println("Ket qua mong doi : output value = input value"); System.out.println("output value :"+methodReturn);}
}
Hình 9 : Kết quả thực hiện test case 4
Đo bao phủ code ta được kết quả :
Hình 10 : Kết quả đo bao phủ khi thực hiện test case 4
Với kết quả của test case 3 và 4 ta nhận được lỗi chương trình, các lỗi này không nhận ra trong bao phủ câu lệnh và bao phủ nhánh. Kết quả mong đợi của chương trình là giá trị đầu vào và giá trị đầu ra phải bằng nhau. Ở đây giá trị đầu vào là 0 nhưng ta đã nhận được giá trị đầu ra là +1 và -1, vậy là lỗi đã được tìm ra. Tổng số đường cơ sở sẽ tăng theo số quyết định nhưng lúc này đã không tăng theo hàm mũ mà vẫn đảm bảo được yêu cầu bao phủ đầy đủ các nhánh. Ta nhận thấy rằng bao phủ đường đi bao gồm cả bao phủ câu lệnh và bao phủ nhánh trong phương thức. Nó tác động gộp lên cả bao phủ nhánh và bao phủ câu lệnh. Ta luôn nhớ rằng, mục đích kiểm tra của các đường cơ sở là để kiểm tra tất cả các nhánh tác động độc lập với nhau. Kiểm tra 4 đường cơ sở nhằm đạt được mục đích này. Ta có thể xây dựng các đường đi hoàn toàn khác nữa, nếu ta bắt đầu với đường cơ sở FFF sau đó tiến hành “flips” như đã làm ở trên ta sẽ thiết lập được 4 đường cơ sở hoàn toàn khác là : FFF, TFF, FTF,FFT. Kết quả của bộ 4 đường mới này với bộ 4 đường ở trên là như nhau, đều thoả mãn tiêu chuẩn tác động độc lập lên các quyết định. Qua đây dễ dàng nhận thấy với Cyclomatic complexity (số đường độc lập tuyến tính đi qua mã nguồn) giúp ta giảm một nửa số test case cần tiến hành.
CHƯƠNG 5. PHÂN TÍCH GIÁ TRỊ ĐIỂM BIÊN