Bài giảng Công nghệ phần mềm nâng cao - Phạm Ngọc Hùng - Kiểm thử hộp trắng
4.1 Tổng quát về kiểm thử hộp trắng
4.2 Kiểm thử luồng điều khiển
4.3 Kiểm thử dòng dữ liệu
Tóm tắt nội dung Bài giảng Công nghệ phần mềm nâng cao - Phạm Ngọc Hùng - Kiểm thử hộp trắng, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
k<=1000; k++) doSomethingWith(i,j,k); có 1 đường thi hành dài 1000*1000*1000 = 1 tỉ lệnh gọi doSomethingWith(i,j,k) khác nhau. Thí dụ đoạn code gồm 32 lệnh if else sau : if (c1) s11 else s12; if (c2) s21 else s22; if (c3) s31 else s32; ... if (c32) s321 else s322; có 2^32 = 4 tỉ đường thi hành khác nhau. Kiểm thử luồng điều khiển Chương 4 : Kiểm thử hộp trắng – White Box Mà cho dù có kiểm thử hết được toàn bộ các đường thi hành thì vẫn không thể phát hiện những đường thi hành cần có nhưng không (chưa) được hiện thực : if (a>0) doIsGreater(); if (a==0) dolsEqual(); // thiếu việc xử lý trường hợp a < 0 - if (a<0) dolsLess(); Một đường thi hành đã kiểm tra là đúng nhưng vẫn có thể bị lỗi khi dùng thiệt (trong 1 vài trường hợp đặc biệt) : int blech (int a, int b) { return a/b; } khi kiểm tra, ta chọn b 0 thì chạy đúng, nhưng khi dùng thật trong trường hợp b = 0 thì hàm blech bị lỗi. Phủ kiểm thử Chương 4 : Kiểm thử hộp trắng – White Box Do đó, ta nên kiểm thử số test case tối thiểu mà kết quả độ tin cậy tối đa. Nhưng làm sao xác định được số test case tối thiểu nào có thể đem lại kết quả có độ tin cậy tối đa ? Phủ kiểm thử (Coverage) : là tỉ lệ các thành phần thực sự được kiểm thử so với tổng thể sau khi đã kiểm thử các test case được chọn. Phủ càng lớn thì độ tin cậy càng cao. Thành phần liên quan có thể là lệnh, điểm quyết định, điều kiện con, đường thi hành hay là sự kết hợp của chúng. Phủ cấp 0 & 1 Chương 4 : Kiểm thử hộp trắng – White Box Phủ cấp 0 : kiểm thử những gì có thể kiểm thử được, phần còn lại để người dùng phát hiện và báo lại sau. Đây là mức độ kiểm thử không thực sự có trách nhiệm. Phủ cấp 1 : kiểm thử sao cho mỗi lệnh được thực thi ít nhất 1 lần. 1 float foo(int a, int b, int c, int d) { 2 float e; 3 if (a==0) 4 return 0; 5 int x = 0; 6 if ((a==b) || ((c==d) && bug(a))) 7 x = 1; 8 e = 1/x; 9 return e; 10 } Với hàm foo bệnh cạnh, ta chỉ cần 2 test case sau đây là đạt 100% phủ cấp 1 : 1. foo(0,0,0,0), trả về 0 2. foo(1,1,1,1), trả về 1 nhưng không phát hiện lỗi chia 0 ở hàng lệnh 8 Phủ cấp 2 Chương 4 : Kiểm thử hộp trắng – White Box Phủ cấp 2 : kiểm thử sao cho mỗi điểm quyết định đều được thực hiện ít nhất 1 lần cho trường hợp TRUE lẫn FALSE. Ta gọi mức kiểm thử này là phủ các nhánh (Branch coverage). Phủ các nhánh đảm bảo phủ các lệnh. Line Predicate True False 3 (a == 0) Test Case 1 foo(0, 0, 0, 0) return 0 Test Case 2 foo(1, 1, 1, 1) return 1 6 ((a==b) OR ((c == d) AND bug(a) )) Test Case 2 foo(1, 1, 1, 1) return 1 Test Case 3 foo(1, 2, 1, 2) return 1 Với 2 test case xác định trong slide trước, ta chỉ đạt được 3/4 x 75% phủ các nhánh. Nếu thêm test case 3 : 3. foo(1,2,1,2), thì mới đạt 100% phủ các nhánh. Phủ cấp 3 Chương 4 : Kiểm thử hộp trắng – White Box Phủ cấp 3 : kiểm thử sao cho mỗi điều kiện luận lý con (subcondition) của từng điểm quyết định đều được thực hiện ít nhất 1 lần cho trường hợp TRUE lẫn FALSE. Ta gọi mức kiểm thử này là phủ các điều kiện con (subcondition coverage). Phủ các điều kiện con chưa chắc đảm bảo phủ các nhánh. Predicate True False a ==0 Test Case 1 foo(0, 0, 0, 0) return 0 Test Case 2 foo(1, 1, 1, 1) return 1 (a==b) Test Case 2 foo(1, 1, 1, 1) return value 0 Test Case 3 foo(1, 2, 1, 2) division by zero! (c==d) Test Case 3 foo(1, 2, 1, 2) division by zero! bug(a) Phủ cấp 4 Chương 4 : Kiểm thử hộp trắng – White Box Phủ cấp 4 : kiểm thử sao cho mỗi điều kiện luận lý con (subcondition) của từng điểm quyết định đều được thực hiện ít nhất 1 lần cho trường hợp TRUE lẫn FALSE & điểm quyết định cũng được kiểm thử cho cả 2 nhánh. Ta gọi mức kiểm thử này là phủ các nhánh & điều kiện con (branch & subcondition coverage). Kiểm thử các đường thi hành cơ bản Chương 4 : Kiểm thử hộp trắng – White Box Dựa trên ý tưởng của Tom McCabe, gồm các bước công việc sau : Từ thủ tục cần kiểm thử, xây dựng đồ thị dòng điều khiển tương ứng. Tính độ phức tạp Cyclomatic của đồ thị (=C). Xác định C đường thi hành tuyến tính cơ bản cần kiểm thử. Tạo từng test case cho từng đường thi hành tuyến tính cơ bản. Thực hiện kiểm thử trên tứng test case. So sánh kết quả có được với kết quả được kỳ vọng. Lập báo cáo kết quả để phản hồi cho những người có liên quan. Đồ thị dòng điều khiển Chương 4 : Kiểm thử hộp trắng – White Box Các thành phần cơ bản : điểm xuất phát khối xử lý điểm quyết định điểm nối điểm kết thúc Miêu tả các cấu trúc điều khiển phổ dụng : tuần tự If switch while c do... do ... while c Đồ thị dòng điều khiển Chương 4 : Kiểm thử hộp trắng – White Box Thí dụ : 1 float foo(int a, int b, int c, int d) { 2 float e; 3 if (a==0) 4 return 0; 5 int x = 0; 6 if ((a==b) || ((c==d) && bug(a))) 7 x = 1; 8 e = 1/x; 9 return e; 10 } s1 c1 s2 c2 s3 s4 s5 Độ phức tạp Cyclomatic C Chương 4 : Kiểm thử hộp trắng – White Box Độ phức tạp Cyclomatic C = V(G) của đồ thị dòng điều khiển được tính bởi 1 trong các công thức sau : V(G) = E - N + 2, trong đó E là số cung, N là số nút của đồ thị. V(G) = P + 1, nếu đồ thị chỉ chứa các nút quyết định luận lý (chỉ có 2 cung xuất True/False) và P số nút quyết định. Độ phức tạp Cyclomatic C chính là số đường thi hành tuyến tính độc lập cơ bản của thủ tục cần kiểm thử. Nếu chúng ta chọn lựa được đúng C đường thi hành tuyến tính độc lập cơ bản của thủ tục cần kiểm thử và kiểm thử tất cả các đường thi hành này thì sẽ đạt được mức kiểm thử 6 như đã trình bày trong các slide trước. Qui trình xác định các đường tuyến tính độc lập Chương 4 : Kiểm thử hộp trắng – White Box Tom McCabe đề nghị qui trình xác định C đường tuyến tính độc lập gồm các bước : 1. Xác định đường cơ bản, đường này nên là đường thi hành phố biến nhất. 2. Để chọn đường thứ 2, thay đổi cung xuất của nút quyết định đầu tiên và cố gắng giữ lại maximum phần còn lại. 3. Để chọn đường thứ 3, dùng đường cơ bản nhưng thay đổi cung xuất của nút quyết định thứ 2 và cố gắng giữ lại maximum phần còn lại. 4. Tiếp tục thay đổi cung xuất cho từng nút quyết định trên đường cơ bản để xác định đường thứ 4, 5,... cho đến khi không còn nút quyết định nào trong đường cơ bản nữa. 5. Lặp dùng tuần tự các đường tìm được làm đường cơ bản để xác định các đường mới xung quanh nó y như các bước 2, 3, 4 cho đến khi không tìm được đường tuyến tính độc lập nào nữa (khi đủ số C). Thí dụ Chương 4 : Kiểm thử hộp trắng – White Box double average(double value[], double min, double max, int& tcnt, int& vcnt) { double sum = 0; int i = 1; tcnt = vcnt = 0; while (value[i] -999 && tcnt <100) { tcnt++; if (min<=value[i] && value[i] <= max) sum += value[i]; vcnt ++; } i++; } if (vcnt > 0) return sum/vcnt; return -999; } 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 Độ phức tạp Cyclomatic C Chương 4 : Kiểm thử hộp trắng – White Box Đồ thị bên có 5 nút quyết định nhị phân nên có độ phức tạp C = 5+1 = 6. 6 đường thi hành tuyến tính độc lập là : 1. 121011 2. 1231011 3. 121012 4. 1234589 5. 12345689 6. 123456789 1 2 3 4 5 6 7 8 9 10 11 12 Thiết kế các test case Chương 4 : Kiểm thử hộp trắng – White Box Test case cho đường 1 : value(k) -999, với 1< k < i value(i) = -999 với 2 ≤ i ≤ 100 Kết quả kỳ vọng : (1) average=Giá trị trung bình của k giá trị hợp lệ. (2) tcnt = k. (3) vcnt = k Chú ý : không thể kiểm thử đường 1 này riêng biệt mà phải khiểm thử chung với đường 4 hay 5 hay 6. Test case cho đường 2 : value(k) -999, với k 100 Kết quả kỳ vọng : (1) average=Giá trị trung bình của 100 giá trị hợp lệ. (2) tcnt = 100. (3) vcnt = 100 Test case cho đường 3 : value(1) = -999 Kết quả kỳ vọng : (1) average = -999. (2) tcnt = 0 (3) vcnt = 0 Thiết kế các test case Chương 4 : Kiểm thử hộp trắng – White Box Test case cho đường 4 : value(i) -999 i <= 100 và value(k) < min với k < i Kết quả kỳ vọng : (1) average=Giá trị trung bình của n giá trị hợp lệ. (2) tcnt = 100. (3) vcnt = n (số lượng giá trị hợp lệ) Test case cho đường 5 : value(i) -999 với i <= 100 và value(k) > max với k <= i Kết quả kỳ vọng : (1) average=Giá trị trung bình của n giá trị hợp lệ. (2) tcnt = 100. (3) vcnt = n (số lượng giá trị hợp lệ) Test case cho đường 6 : value(i) -999 và min <= value(i) <= max với i <= 100 Kết quả kỳ vọng : (1) average=Giá trị trung bình của 100 giá trị hợp lệ. (2) tcnt = 100. (3) vcnt = 100 Kiểm thử vòng lặp Chương 4 : Kiểm thử hộp trắng – White Box Tập trung riêng vào các lệnh lặp. Có 4 loại : lệnh lặp đơn giản : thân của nó chỉ chứa các lệnh khác. lệnh lặp lồng nhau : thân của nó chứa lệnh lặp khác... lệnh lặp liền kề : 2 hay nhiều lệnh lặp kế tiếp nhau lệnh lặp giao nhau : 2 hay nhiều lệnh lặp giao nhau. Kiểm thử vòng lặp đơn giản Chương 4 : Kiểm thử hộp trắng – White Box Nên chọn các test case sau đây để kiểm thử lệnh lặp n lần : chạy 0 lần. chạy 1 lần. chạy 2 lần. chạy k lần, k là giá trị nào đó thỏa 2 < k < n-1. chạy n-1 lần chạy n lần chạy n+1 lần. while c do... do ... while c Kiểm thử vòng lặp lồng nhau Chương 4 : Kiểm thử hộp trắng – White Box Kiểm thử tuần tự từng vòng lặp từ trong ra ngoài theo đề nghị sau đây : 1. kiểm thử vòng lặp trong cùng : cho các vòng ngoài chạy với giá trị min, kiểm thử vòng lặp trong cùng bằng 7 test case đã giới thiệu. 2. kiểm thử vòng lặp còn lại : cho các vòng ngoài nó chạy với giá trị min, các vòng bê trong nó chạy với giá trị điển hình, kiểm thử nó bằng 7 test case đã giới thiệu. Kiểm thử các vòng lặp liền kề Chương 4 : Kiểm thử hộp trắng – White Box Kiểm thử tuần tự từng vòng lặp từ trên xuống, mỗi vòng thực hiện kiểm thử bằng 7 test case đã giới thiệu. Riêng các vòng lặp giao nhau thường do việc viết code chưa tốt tạo ra nên cấu trúc lại đoạn code sao cho không chứa dạng giao nhau này.
File đính kèm:
- Bài giảng Công nghệ phần mềm nâng cao - Phạm Ngọc Hùng - Kiểm thử hộp trắng.pdf