Ở lần thử nghiệm số 3 này, chúng ta sẽ làm sáng tỏ những trường hợp liên quan đến miền giá trị cuối năm với ngày hiện tại là ngày 31 tháng 12. Lần này, việc đặc tả cho các ngày, các tháng, xét các điều kiện năm nhuận và năm không nhuận đơn giản hơn phép thử đầu tiên vì vậy năm 1900 sẽ không được xét thành một trường hợp đặc biệt. Tức là chúng ta sẽ bỏ đi 1 lớp tương đương cho biến năm trong trường hợp năm là 1900. Khi đó, việc phân chia miền dữ liệu đầu vào của các biến như sau.
M1 = {tháng: tháng có 30 ngày}
M2 = {tháng: tháng có 31 ngày trừ tháng 12} (mới) M3 = {tháng : tháng là 12}
M4 = {tháng: tháng là 2}
D2 = {ngày: ngày = 28} (mới) D3 = {ngày: ngày = 29} D4 = {ngày: ngày = 30} D5 = {ngày: ngày = 31}
Y1 = {năm: năm là năm nhuận}
Y3 = {năm: năm không phải năm nhuận}
Tích đề các của các lớp tương đương này chứa 40 phần tử (4x5x2=40). Kết quả của sự kết hợp các luật với các điểm vào “không quan tâm” được đưa ra trong bảng 3.23, ở đây có 22 luật được so sánh với 36 luật của phép thử thứ 2. Với một bảng quyết định có 22 luật đã đưa ra một bức tranh của hàm “NextDate” rõ ràng hơn bảng quyết định với 36 luật ở lần thử nghiệm số 2 đã chứng minh được rằng “ số lượng các trường hợp kiểm thử không hoàn toàn tỷ lệ thuận với khả năng bao quát và tìm ra lỗi của chương trình”. Năm luật đầu tiên trong bảng dành cho các tháng có 30 ngày, các luật từ 6 10 dành cho các tháng có 31 ngày không phải tháng 12. Từ luật 1115 là các luật dành cho tháng 12. Cuối cùng, 7 luật từ luật 16 22 tập trung vào tháng 2 và năm nhuận.
Bảng 3.23 Bảng quyết định cho hàm “NextDate” [6] Các điều kiện 1 2 3 4 5 6 7 8 9 10 11 c1: Tháng trong M1 M1 M1 M1 M1 M2 M2 M2 M2 M2 M3 c2: Ngày trong D1 D2 D3 D4 D5 D1 D2 D3 D4 D5 D1 c3: Năm trong - - - - Hành động
a1: Không xảy ra X
a2: Tăng ngày X X X X X X X X
a3: Đặt lại ngày X X
a4: Tăng tháng X X
a5: Đặt lại tháng a6: Tăng năm
Các điều kiện 12 13 14 15 16 17 18 19 20 21 22 c1: Tháng trong M3 M3 M3 M3 M4 M4 M4 M4 M4 M4 M4 c2: Ngày trong D2 D3 D4 D5 D1 D2 D2 D3 D3 D4 D5 c3: Năm trong - - - Y1 Y2 Y1 Y2 - -
Hành động
a1: Không xảy ra X X X
a2: Tăng ngày X X X X X
a3: Đặt lại ngày X X X
a4: Tăng tháng X X
a5: Đặt lại tháng X
a6: Tăng năm X
Bảng quyết định 3.23 là cơ bản cho mã nguồn hàm “NextDate” đã được đề cập trong mục 3.3. Đây là ví dụ chứng minh việc kiểm thử tốt có thể cải thiện lập trình, giúp cho kiểm thử viên tìm được lỗi mà người lập trình bỏ sót trong quá trình xử lý. Sự phân tích bảng quyết định còn được thể hiện đầy đủ trong quá trình thiết kế chi tiết của hàm “NextDate”.
Chúng ta có thể sử dụng đại số của bảng quyết định cho 22 trường hợp kiểm thử một cách đơn giản hơn nữa. Nếu tập hành động của 2 luật giống hệt nhau thì phải có ít nhất một điều kiện cho phép 2 luật được kết hợp với một điểm vào “không quan tâm”. Đây là một
phép tương đương khi áp dụng nguyên tắc phân lớp tương đương trong bảng quyết định. Theo một ý nghĩa nào đó, chúng ta đang xác định các lớp tương đương của các luật. Ví dụ luật 1, 2 và 3 bao gồm các lớp ngày D1, D2 và D3 cho các tháng có 30 ngày. Các lớp tương đương có thể được kết hợp một cách tương tự cho các lớp ngày D1, D2, D3 và D4 trong các luật với tháng có 31 ngày và D4, D5 cho tháng 2. Kết quả chúng ta sẽ thu được bảng quyết định thu gọn trong bảng 3.24.
Bảng 3.24 Bảng quyết định được thu gọn cho hàm “NextDate” [6]
Các điều kiện 13 4 5 69 10
c1: Tháng trong M1 M1 M1 M2 M2
c2: Ngày trong D1,D2,D3 D4 D5 D1,D2,D3,D4 D5
c3: Năm trong - - -
Hành động
a1: Không xảy ra X
a2: Tăng ngày X X
a3: Đặt lại ngày X X
a4: Tăng tháng X X
a5:Đặt lại tháng
a6: Tăng năm
Các điều kiện 1114 15 16 17 18 19 20 2122
c1: Tháng trong M3 M3 M4 M4 M4 M4 M4 M4
c2: Ngày trong D1,D2,D3,D4 D5 D1 D2 D2 D3 D3 D4,D5
c3: Năm trong - - - Y1 Y2 Y1 Y2 -
Hành động
a1: Không xảy ra X X
a2: Tăng ngày X X X
a3: Đặt lại ngày X X X
a4: Tăng tháng X X
a5:Đặt lại tháng X
a6: Tăng năm X
Với bảng quyết định trên ta có danh sách các trường hợp kiểm thử sinh ra tương ứng như mô tả trong bảng 3.25 dưới đây.
Bảng 3.25 Các trường hợp kiểm thử cho bài toán “NextDate” [6]
TC_ID Tháng Ngày Năm Kết quả mong đợi
1 April 15 1993 April 16, 1993 2 April 28 1993 April 29, 1993 3 April 29 1993 April 30, 1993 4 April 30 1993 May 1, 1993 5 April 31 1993 Invalid input
6 Jan 15 2001 Jan 16,2001 7 Jan 28 2001 Jan 29,2001 8 Jan 29 2001 Jan 30,2001 9 Jan 30 2001 Jan 31,2001 10 Jan 31 2001 February 1, 2001 11 Dec 15 1993 December 16, 1993 12 Dec 28 1993 December 29, 1993 13 Dec 29 1993 December 30, 1993 14 Dec 30 1993 December 31, 1993 15 Dec 31 1993 January 1, 1994 16 Feb 15 1993 February 16, 1993 17 Feb 28 1992 February 29, 1992 18 Feb 28 1993 March 1, 1993 19 Feb 29 1992 March 1, 1992
20 Feb 29 1993 Invalid input
21 Feb 30 1993 Invalid input
22 Feb 31 1993 Invalid input
3.3.4. Nhận xét
Từ việc phân tích một ví dụ cụ thể bài toán “NextDate”, chúng ta có thể rút ra nhận xét về kỹ thuật sinh ca kiểm thử sử dụng bảng quyết định nên áp dụng cho các ứng dụng có những đặc trưng sau:
Kiểm thử dựa trên bảng quyết định nên áp dụng cho các bài toán chứa các biến đầu vào có mối quan hệ logic phụ thuộc lẫn nhau.
Phương pháp này phù hợp cho các bài toán có sử dụng logic if – then –else.
Kiểm thử dựa trên bảng quyết định xử lý hiệu quả các bài toán có chứa quan hệ nguyên nhân và kết quả giữa đầu vào và đầu ra.
Để có thể đưa ra được một bảng quyết định tốt, chúng ta cần xây dựng từng bước và cải tiến nó dần dần cho đến khi đạt được như mong muốn của người kiểm thử. Làm được điều này ta bắt đầu từ 2n
luật tương ứng với n điều kiện đầu vào. Sau đó sử dụng các bảng quyết định có điểm vào mở rộng, các bảng đơn giản có áp dụng phương pháp đại số để giảm dần số luật. Đồng thời phân chia các bảng lớn thành các bảng nhỏ hơn và loại bỏ các mẫu bị lặp. Cuối cùng, chúng ta sẽ có được một bảng quyết định tối ưu nhất cho bài toán cần kiểm thử. Từ đó sẽ sinh ra các trường hợp kiểm thử cần quan tâm.
3.4. So sánh các phƣơng pháp
Thông qua việc khảo sát các phương pháp sinh bộ kiểm thử ở trên, ta có thể thấy được hiệu quả của từng phương pháp được thể hiện trong hình 3.14 và hình 3.15. Tính hiệu quả thể hiện ở khả năng phát hiện lỗi và tính hiệu quả của việc thực thi các ca kiểm thử. Hình số 3.14 biểu diễn mối tương quan giữa số lượng các ca kiểm thử và hiệu quả của từng phương pháp. Theo mô tả trong hình này thì tính hiệu quả của phương pháp kiểm thử dựa trên bảng quyết định là lớn nhất. Nó thể hiện ở việc phương pháp này có số lượng các ca kiểm thử là nhỏ nhất nhưng khả năng phát hiện lỗi lại lớn nhất. Ngược lại, phương pháp phân tích giá trị biên có tính hiệu quả thấp nhất vì phương pháp này sinh ra số lượng ca kiểm thử là lớn nhất nhưng khả năng phát hiện lỗi lại kém nhất. Hình 3.15 minh họa cho mối tương quan giữa công sức để xây dựng các ca kiểm thử và tính hiệu quả của từng phương pháp. Như vậy ta có thể thấy phương pháp phân tích giá trị biên tốn ít công sức nhất trong việc xây dựng ca kiểm thử nhưng hiệu quả mang lại của phương pháp này lại thấp nhất. Đồng thời phương pháp kiểm thử dựa trên bảng quyết định khó nhất, tốn nhiều thời gian và chi phí cho việc xác định các trường hợp kiểm thử nhưng lại mang lại hiệu quả kiểm thử và khả năng phát hiện lỗi là cao nhất. Khi xét cả hai tiêu chí so sánh tính hiệu quả tương ứng với số ca kiểm thử cần xây dựng hay tính hiệu quả tương ứng với công sức bỏ ra để xác định các ca kiểm thử thì phương pháp kiểm thử dựa trên phân hoạch tương đương đều có hiệu quả trung bình. Đây cũng là một phương pháp được áp dụng phổ biến trong quy trình kiểm thử phần mềm hiện nay.
Hình 3.14. So sánh tính hiệu quả của các phương pháp kiểm thử.
Thực tế cho thấy, mỗi phương pháp sinh bộ kiểm thử đều có ưu và nhược điểm riêng. Vì vậy việc dùng một phương pháp là không đủ để kiểm tra tất cả các trường hợp cần thiết. Tùy theo từng bài toán cụ thể và dựa vào thuộc tính của các biến đầu vào chúng ta lựa chọn được phương pháp sinh ca kiểm thử trong kiểm thử hộp đen như mô tả trong bảng 3.26
Bảng 3.26 Lựa chọn các phương pháp kiểm thử.
C1. Các biến (P: vật lý; L: Logic) P P P P P L L L L L C2. Các biến độc lập? Y Y Y Y N Y Y Y Y N C3. Giả định có lỗi đơn? Y Y N N - Y Y N N - C4. Điều khiển ngoại lệ? Y N Y N - Y N Y N -
A1. Kiểm thử giá trị biên (BVT) X
A2. BVT mạnh (robustness) X
A3. BVT trường hợp xấu nhất (worstcase) X
A4. BVT kết hợp robustness và worstcase X
A5. Lớp tương đương truyền thống X X X X
A6. Lớp tương đương yếu X X X X A7. Lớp tương đương mạnh X X X X X X
A8. Bảng quyết định X X
Dựa vào tổng kết trong bảng 3.26 ta thấy
Nếu các biến đầu vào là đại lượng vật lý độc lập, áp dụng phương pháp kiểm thử giá trị biên và phân lớp tương đương.
Nếu các biến đầu vào là đại lượng vật lý nhưng không độc lập, áp dụng phương pháp phân lớp tương đương mạnh và bảng quyết định.
Nếu các biến đầu vào có quan hệ phụ thuộc nhau thì áp dụng phương pháp kiểm thử dựa trên bảng quyết định
Nếu chương trình có xử lý ngoại lệ thì áp dụng phương pháp kiểm thử giá trị biên mở rộng (robustness) và phân lớp tương đương.
Nếu biến đầu vào là các đại lượng logic độc lập, có thể kết hợp các kỹ thuật của phương pháp phân lớp tương đương để sinh ca kiểm thử.
Chƣơng 4. Ứng dụng
4.1. Đặc tả bài toán
Để minh họa cho các phương pháp sinh ca kiểm thử đã khảo sát ở chương 3, trong chương này, chúng ta sẽ tiến hành thử nghiệm trên bài toán cụ thể để thấy được các trường hợp kiểm thử sinh ra theo từng phương pháp. Đồng thời thông qua ví dụ đó sẽ đánh giá được khả năng phát hiện lỗi, chi phí cho việc sinh và thực thi các ca kiểm thử tương ứng với từng phương pháp. Ví dụ cụ thể sẽ bao gồm 2 bài toán:
Bài toán “Nhập điểm cho sinh viên”: Minh họa cho trường hợp các biến đầu vào là các biến hoàn toàn độc lập nhau, không có mối quan hệ ràng buộc logic.
Bài toán “NextDate” (đã khảo sát ở mục 3.3.3 của luận văn): Minh họa cho trường hợp các biến đầu vào có mối quan hệ logic ràng buộc.
Sau khi xây dựng các ca kiểm thử cho hai bài toán theo các phương pháp đã khảo sát, chúng ta tiến hành thử nghiệm chạy chương trình cho hai bài toán sử dụng tập các ca kiểm thử sinh ra. Với giả thiết là chương trình thực nghiệm đã được cài một số lỗi nhất định, việc kiểm tra trên tập ca kiểm thử sinh ra sẽ giúp ta đánh giá được hiệu quả của các ca kiểm thử trong việc phát hiện ra lỗi chương trình.
4.2. Thiết kế ca kiểm thử cho bài toán có các biến độc lập 4.2.1. Bài toán 4.2.1. Bài toán
Bài toán “ Nhập điểm cho sinh viên” được xây dựng để mô phỏng cho việc thiết kế các ca kiểm thử trong trường hợp các biến đầu vào hoàn toàn độc lập, không có mối quan hệ ràng buộc logic phức tạp. Với bài toán này, chúng ta sẽ tiến hành khảo sát trên các phương pháp: Kiểm thử giá trị biên (kiểm thử giá trị biên cơ bản, kiểm thử giá trị biên mở rộng) và phân lớp tương tương (phân lớp tương đương mạnh, phân lớp tương đương yếu, phân lớp tương đương truyền thống).
Bài toán yêu cầu nhập điểm cho danh sách sinh viên đã tồn tại trong cơ sở dữ liệu. Khi lựa chọn được lớp (tương ứng với mã lớp), mã sinh viên, tên sinh viên hợp lệ, người dùng sẽ có quyền nhập điểm cho sinh viên đó. Thông tin điểm ở đây bao gồm: điểm Toán, điểm Lý và điểm Hóa. Bỏ qua các giá trị đã cố định trong cơ sở dữ liệu là Lớp, Mã sinh viên, Tên sinh viên, chúng ta sẽ tập trung khảo sát và sinh các ca kiểm thử cho các biến đầu vào cần quan tâm là điểm Toán, điểm Lý và điểm Hóa. Với giao diện chương trình như hình 4.1, các biến đầu vào điểm Toán, điểm Lý và điểm Hóa được kí hiệu tương ứng là DToan, DLy, DHoa có miền giá trị vào như sau:
0<= DToan <=10 0<= DLy <=10 0<= DHoa <=10
Hình 4.1. Giao diện bài toán “Nhập điểm cho sinh viên”.
4.2.2. Áp dụng các phƣơng pháp kiểm thử để sinh ca kiểm thử 4.2.2.1. Phƣơng pháp phân tích giá trị biên cơ bản
Với miền giá trị đầu vào của các biến DToan, DLy, DHoa như ở mục 4.2.1, áp dụng nguyên tắc đã nghiên cứu ở chương 3, chúng ta xác định được các giá trị biên cần kiểm thử như bảng 4.1, với giả thiết kiểm thử trên bộ số nguyên dương.
Bảng 4.1 Các giá trị biên cơ bản cho bài toán “Nhập điểm sinh viên” min min+ Norm max- max
DToan 0 1 5 9 10
DLy 0 1 5 9 10
DHoa 0 1 5 9 10
Bảng 4.2 là danh sách 15 ca kiểm thử được sinh ra tương ứng với các giá trị biên trong bảng 4.1. Khi sử dụng các trường hợp kiểm thử này để kiểm tra chương trình thì kiểm thử viên không phát hiện ra lỗi nào, toàn bộ các ca kiểm thử đều có kết quả là OK.
Bảng 4.2 Các trường hợp kiểm thử biên cơ bản cho bài toán “Nhập điểm sinh viên”
TC_ID DToan DLy DHoa Output Result Result
TC_01 0 5 5 DToan=0 DLy=5 DHoa=5 OK TC_02 1 5 6 DToan=1 DLy=5 DHoa=6 OK TC_03 5 8 9 DToan=5 DLy=8 DHoa=9 OK TC_04 9 4 5 DToan=9 DLy=4 DHoa=5 OK TC_05 10 4 2 DToan=10 DLy=4 DHoa=2 OK TC_06 4 0 3 DToan=4 DLy=0 DHoa=3 OK TC_07 2 1 1 DToan=2 DLy=1 DHoa=1 OK TC_08 10 5 8 DToan=10 DLy=5 DHoa=8 OK TC_09 3 9 7 DToan=3 DLy=9 DHoa=7 OK TC_10 2 10 8 DToan=2 DLy=10 DHoa=8 OK
TC_11 5 6 0 DToan=5 DLy=6 DHoa=0 OK TC_12 7 8 1 DToan=7 DLy=8 DHoa=1 OK TC_13 9 10 5 DToan=9 DLy=10 DHoa=5 OK TC_14 8 2 9 DToan=8 DLy=2 DHoa=9 OK TC_15 5 4 10 DToan=5 DLy=6 DHoa=10 OK
4.2.2.2. Phƣơng pháp phân tích giá trị biên mở rộng
Sử dụng miền giá trị đầu vào của các biến DToan, DLy, DHoa như ở mục 4.2.1, ta xác định được các giá trị biên theo kỹ thuật kiểm thử biên mở rộng như trong bảng 4.3.
Bảng 4.3 Các giá trị biên mở rộng cho bài toán “Nhập điểm sinh viên” min- min min+ norm max- max max+
DToan -1 0 1 5 9 10 11
DLy -1 0 1 5 9 10 11
DHoa -1 0 1 5 9 10 11
Với miền giá trị biên như bảng 4.3, ta xây dựng được 21 ca kiểm thử. Thực tế cho thấy, sau khi thực hiện chạy chương trình thử nghiệm, có 18 ca kiểm thử có kết quả OK và 03 ca kiểm thử trả về kết quả NOK (Not OK), ba ca kiểm thử này phát hiện ra cả 3 lỗi của chương