Kết quả kiểm tra độ phủ của hàm foo thực thi bộ test ở bảng 5.2

Một phần của tài liệu (LUẬN văn THẠC sĩ) kiểm tra độ phủ trong kiểm thử đơn vị (Trang 55 - 59)

Kết quả thu được từ hình 5.11 nhận thấy bộ test đã phủ 100% câu lệnh, thỏa mãn đảm bảo tiêu chuẩn phủ câu lệnh. Công cụ đã kiểm tra được độ phủ của bộ test thỏa tiêu chuẩn bao phủ câu lệnh.

Bên cạnh đó công cụ cũng chỉ ra trên đồ thị tồn tại một nhánh màu đỏ từ 4->6 tương ứng với trường hợp false của câu lệnh rẽ nhánh if((a != b) && (c != d)), nhánh này chưa được phủ hết khi thực thi hàm với bộ test thứ nhất, chứng tỏ trong hàm có thể tiềm ẩn yếu tố gây lỗi nếu chạy qua nhánh này. Công cụ đã phát hiện được nhánh chưa phủ trong hàm và cảnh báo.

Xây dựng các ca kiểm thử theo tiêu chuẩn bao phủ nhánh của hàm foo như trong bảng 5.2

Bảng 5.2: Bộ test theo tiêu chuẩn phủ nhánh của hàm foo

ID Test Path Input EO

Tc1 1(T), 2 0,1,2,3 0

Tc2 1(F),3,4(T),5,6 1,2,2,3 1

Tc3 1(F),3,4(F),6 1,1,2,3 Lỗi chia cho 0

Kết quả thu được sau khi thực thi chương trình trong hình 5.12 cho thấy khi kiểm tra độ phủ của chương trình với bộ test trong bảng 5.2 chương trình gặp lỗi chia cho 0, đây là lỗi nghiêm trọng khi viết chương trình. Nhận thấy khi

chương trình thực thi với test case đầu vào là foo(1,1,2,3) sẽ đi vào nhánh false của câu lệnh rẽ nhánh if((a != b) && (c != d)) chính là nhánh chưa được phủ khi dùng bộ test ở bảng 5.1. Chương trình sau đó dừng ngay và cảnh báo trong file vết MyTest.log lỗi chia cho 0. Nhờ công cụ lập trình viên đã tìm thấy một lỗi còn sót trong quá trình viết code.

Hình 5.12: Kết quả thông báo lỗi khi thực thi hàm foo với bộ test tại bảng 5.2

Đo độ phủ với bộ test thỏa mãn tiêu chuẩn bao phủ nhánh

Để minh họa cho trường hợp này chúng tôi lấy ví dụ hàm getAverage thực hiện công việc: Tính giá trị trung bình các phần tử trong mảng số nguyên thỏa mãn điều kiện các phần tử của mảng nằm trong khoảng [Min,Max] và số lượng các phần tử của mảng nhỏ hơn hoặc bằng 30. Phần tử cuối cùng của mảng có giá trị -999.

Mã nguồn hàm getAverage được viết như sau:

public static double getAverage(int value[], int MIN, int MAX) {

1: int i = 0;

2: int ti = 0;

3: int tv = 0;

4: int sum = 0;

5: double av = 0;

6: while (ti < 30 && value[i] != -999) {

8: tv++; sum = sum + value[i]; } 9: ti++; 10: i++; } 11: if (tv > 0) 12: av = (double) sum / tv; else 13: av = (double) -999; 14: return (av); }

Xây dựng bộ test thỏa mãn tiêu chuẩn bao phủ nhánh trong bảng 5.3

Bảng 5.3: Bộ test theo tiêu chuẩn bao phủ nhánh của hàm getAverage

ID Test Path Output EO

TC1 1,2,3,4,5,6(T),7(T),8,9,10,6(F),11(T),12,14 [5,-999],5,20 5

TC2 1,2,3,4,5,6(T),7(F),9,10,6(F),11(F),13,14 [20,-999], 10,15 -999

TC3 1,2,3,4,5,6(F),11(F),13,14 [-999] ,5 , 20 -999

Với mỗi ca kiểm thử, bộ dữ liệu đầu vào (inputs) gồm ba thành phần: mảng

int value[], giá trị nhỏ nhất int MIN, và giá trị lớn nhất int MAX. Xây dựng Test drive điều khiển thực thi bộ test case:

public class MyTest {

public static void main(String[] args) {

int value[] = {5,-999};

MyMath.getAverage(value, 5, 20);

int value1[]= {20,-999};

MyMath.getAverage(value1, 10, 15);

int value2[] = {-999};

MyMath.getAverage(value2, 5, 20);

throw new MyException("");

}

Kết quả thu được tại hình 5.13 với bộ test case sinh ra tại bảng 5.3 đã bao phủ hết các nhánh thỏa mãn tiêu chuẩn bao phủ nhánh (branch coverage) trong đồ thị luồng điều khiển của hàm getAverage(), tất cả các nhánh trong đồ thị đều màu xanh. Bộ test tại bảng 5.3 đã thỏa mãn tiêu chuẩn bao phủ nhánh. Công cụ đã kiểm tra được độ phủ của bộ test thỏa tiêu chuẩn bao phủ nhánh.

Hình 5.13: Kết quả kiểm tra độ phủ của hàm getAverage thực thi với bộ test case tại bảng 5.3

Kiểm thử vòng lặp

Vòng lặp là cấu trúc rất hay được sử dụng khi viết chương trình vì tính chất mô tả thực tế của nó. Mặc dù vậy kiểm thử vòng lặp không hề đơn giản, lỗi rất hay xảy ra ở các vòng lặp. Có nhiều loại vòng lăp như vòng lặp đơn, vòng lặp lồng nhau và vòng lặp liền kề. Mỗi loại có cách sinh các ca kiểm thử là khác nhau. Nhưng tựu chung lại kiểm thử vòng lặp đều phải xây dựng các ca kiểm thử với số lần lặp đa dạng nhằm phát hiện lỗi tiềm ẩn có thể có tại vòng lặp bất kỳ. Minh họa cho việc kiểm thử vòng lặp đơn chúng ta quay lại ví dụ của hàm

getAverage. Bộ test trong bảng 5.3 đã thỏa mãn tiêu chuẩn bao phủ nhánh đối với hàm getAverage.Thực thi bộ test case trong bảng 5.3 vòng lặp while chỉ được thực hiện tối đa một lần lặp nên rất khó để phát hiện các lỗi tiềm ẩn có thể có bên trong vòng lặp này. Các lỗi này có thể xảy ra khi vòng lặp này được thực hiện nhiều lần lặp. Đây là hạn chế của phương pháp kiểm thử luồng điều khiển khi áp dụng cho các hàm hay phương thức có chứa vòng lặp. Để giải quyết vấn đề này, chúng tôi sinh thêm 7 ca kiểm thử ứng với bảy trường hợp lặp như sau: số lần lặp bằng 0, lặp 1, lặp 2, lặp M lần trong đó M < N, lặp N-1 lần, lặp N lần, lặp N+1 lần. Tuy nhiên với hàm trên sẽ chạy tối đa 30 lần vì vậy không sinh ca kiểm thử có N+1 lần lặp, bộ test case kiểm thử cho vòng lặp while được cho trong bảng 5.4

Bảng 5.4: Bộ test kiểm thử vòng lặp while trong hàm getAverage ID Số lần lặp Output EO ID Số lần lặp Output EO TC1 30 [1..30,-999], 1, 30 7 TC2 29 [1..29,-999],5,9 7 TC3 4 [5,6,3,4,-999], 5,9 5.5 TC4 2 [5,9,-999],5, 9 7 TC5 1 [9,-999],5,9 9 TC6 0 [-999,5,9],5,9 -999

Chạy kiểm thử qua ứng dụng kết quả hiển thị trong hình 5.14

Một phần của tài liệu (LUẬN văn THẠC sĩ) kiểm tra độ phủ trong kiểm thử đơn vị (Trang 55 - 59)

Tải bản đầy đủ (PDF)

(68 trang)