Các điều kiện R1 R2 R3 c1: tháng là M1 T - - c2: tháng là M2 - T - c3: tháng là M3 - - T Số luật 4 4 4 a1
Theo quan điểm tính số luật dựa vào “điểm không quan tâm” thì số luật là 12. Tuy nhiên theo quy tắc tính luật dựa vào số biến đầu vào thì với 3 biến đầu vào (Date, Month, Year) chúng ta sẽ có 23 = 8 luật. Như vậy ở đây có sự sai khác vể tổng số luật sinh ra. Ta sẽ phân tích cụ thể các luật sinh ra như ở bảng 3.17 bên dưới.
Bảng 3.17 Phiên bản mở rộng của bảng quyết định 3.16 [6] Các điều kiện 1.1 1.2 1.3 1.4 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 c1: tháng là M1 T T T T T T F F T T F F c2: tháng là M2 T T F F T T T T T F T F c3: tháng là M3 T F T F T F T F T T T T Số luật 1 1 1 1 1 1 1 1 1 1 1 1 a1
Trong bảng 3.17 chúng ta có ba luật trong đó tất cả các điểm vào là T là các luật 1.1, 2.1, và 3.1. Chúng ta cũng có hai luật với các điểm vào có giá trị T, T, F là 1.2 và 2.2. Tương tự cho các luật 1.3 và 3.2, 2.3 và 3.3 là những cặp luật có điểm vào giống nhau. Nếu xóa những luật bị lặp lại, chúng ta sẽ còn lại 7 luật. Như vậy sẽ thiếu 1 luật ứng với trường hợp tất cả các điều kiện đều sai (F). Kết quả của quá trình này được thể hiện trong bảng 3.18. Việc phát triển các bảng quyết định đầy đủ đã tạo ra sự dự dư thừa và không nhất quán. Bảng quyết định 3.19 là dư thừa – 3 điều kiện và 9 luật tồn tại (trong đó luật 9 giống hệt luật 4).
Bảng 3.18 Các điều kiện loại trừ lẫn nhau với các luật không xảy ra [6]
Các điều kiện 1.1 1.2 1.3 1.4 2.3 2.4 3.4 c1: tháng là M1 T T T T F F F F c2: tháng là M2 T T F F T T F F c3: tháng là M3 T F T F T F T F Số luật
a1: không xảy ra X X X X X
Các quyết định ở luật số 4 và số 9 trong bảng 3.19 để xử lý một thực hiện trong đó điều kiện c1 đúng và các điều kiện c2 và c3 đều sai thì cả 2 luật 4 và 9 đều áp dụng được, như vậy ở đây có sự dư thừa luật. Bảng 3.19 minh họa cho một bảng quyết định dư thừa.
Bảng 3.19 Một bảng quyết định dư thừa [6]
Các điều kiện 14 5 6 7 8 9 c1 T F F F F T c2 - T T F F F c3 - T F T F F a1 X X X - - X a2 - X X X - - a3 X - X X X X
Bảng 3.20 Một bảng quyết định không nhất quán [6] Các điều kiện 14 5 6 7 8 9 c1 T F F F F T c2 - T T F F F c3 - T F T F F a1 X X X - - X a2 - X X X - - a3 X - X X X -
Trong bảng 3.20, các luật 4 và 9 không nhất quán vì tập các hành động tương ứng khác nhau. Bảng 3.20 được coi là không tiền định bởi vì không có cách nào quyết định sẽ áp dụng luật 4 hay luật 9. Vì vậy người kiểm thử cần xem xét cẩn thận khi những điểm vào “không quan tâm” được sử dụng trong bảng quyết định.
3.3.3.1. Phép thử đầu tiên cho bài toán NextDate
Giả sử ta phân lớp tương đương miền giá trị đầu vào cho các biến Date, Month, Year của bài toán Nextdate như dưới đây (nguyên tắc để phân lớp tương đương đã được trình bày trong mục 3.2 – Phương pháp kiểm thử dựa trên lớp đương đương).
M1 = {tháng: tháng có 30 ngày} M2 = {tháng: tháng có 31 ngày} M3 = {tháng: tháng là 2} D1 = {ngày: 1 <= ngày <= 28} D2 = {ngày: ngày = 29} D3 = {ngày: ngày = 30} D4 = {ngày: ngày = 31}
Y1 = {năm: năm là năm nhuận}
Y2 = {năm: năm không phải năm nhuận}
Với yêu cầu của bài toán này thì các năm xét từ năm 1812 đến 2012. Ta xây dựng được bảng quyết định tương ứng như bảng 3.21. Ở đây, với mục đích làm nổi bật những kết hợp không xảy ra, chúng ta có thể tạo ra một bảng quyết định điểm vào hạn chế với các điều kiện và hành động như sau (trong ví dụ này thì lớp tương đương cho biến năm thu lại thành một điều kiện – chỉ có lớp Y1).
Bảng 3.21 Bảng quyết định cho thử nghiệm đầu tiên với 256 luật [6] Các điều kiện c1: tháng trong M1 T c2: tháng trong M2 T c3: tháng trong M3 T c4: ngày trong D1 c5: ngày trong D2 c6: ngày trong D3 c7: ngày trong D4 c8: năm trong Y1 a1: Không xảy ra a2: Ngày tiếp theo
Bảng quyết định này sẽ có 256 luật, trong đó nhiều luật sẽ không xảy ra. Để giải thích tại sao những luật này không xảy ra thì chúng ta phải xem lại một số hành động sau khi xây dựng bảng quyết định. Có một số hành động cần quan tâm như, hành động a1 (có quá nhiều ngày trong một tháng tức là với mỗi một tháng, số ngày lớn nhất trong tháng đó là cố định. Trong trường hợp người dùng nhập ngày hiện tại có giá trị lớn hơn ngày lớn nhất trong tháng thì sẽ xử lý như thế nào); a2 là hành động xử lý các tình huống khi điều kiện vào không thể xảy ra trong một năm không nhuận; hành động a3 thực hiện việc tính ngày tiếp theo khi người dùng nhập đúng định dạng và giới hạn của ngày hiện tại.
3.3.3.2. Phép thử thứ hai cho bài toán NextDate
Phép thử thứ hai sẽ xử lý hạn chế ở phép thử đầu tiên. Để minh họa cho kỹ thuật xây dựng bảng quyết định khác, chúng ta sẽ phát triển một bảng quyết định với điểm vào mở rộng và lấy kết thúc từ gốc hành động. Trong việc tạo ra một bảng quyết định điểm vào mở rộng, chúng ta phải chắc chắn rằng các lớp tương đương được tạo ra phải là thành phần đúng của miền giá trị đầu vào. Tức là khi kết hợp các tập con tách rời của lớp tương đương sẽ tạo thành một tập toàn vẹn, đầy đủ. Vì nếu có bất kì sự “chồng lặp” nào giữa các điểm vào của luật, chúng sẽ sinh ra một trường hợp dư thừa trong đó có nhiều hơn một luật có thể được thỏa mãn. Các lớp tương đương cho các biến đầu vào Date, Month, Year như sau:
M1 = { tháng: tháng có 30 ngày } M2 = { tháng: tháng có 31 ngày } M3 = { tháng: tháng là tháng 2}
D1 = { ngày: 1 ≤ ngày ≤ 28} D2 = { ngày: ngày = 29 } D3 = { ngày: ngày = 30 } D4 = { ngày: ngày = 31 Y1 = { năm: năm = 1900}
Y2 = { năm: 1812 ≤ năm ≤ 2012 AND (năm ≠ 1900) AND (năm = 0 mod 4)} Y3 = { năm: (1812 ≤ năm ≤ 2012 AND năm ≠ 0 mod 4)}
Để đưa ra ngày tiếp theo của ngày hiện tại, chỉ có 5 thao tác có thể được sử dụng bao gồm: tăng ngày, đặt lại ngày, tăng tháng, đặt lại tháng và tăng năm. Ở đây không để cho thời gian đi ngược lại từ đầu nên sẽ không có hành động đặt lại năm. Các điều kiện cho 3 biến đầu vào ngày, tháng, năm sẽ được đưa ra trong một bảng quyết định với 36 luật phù hợp với tích để các của các lớp tương đương (3x4x3=36). Việc kết hợp các luật với các điểm vào “không quan tâm” tạo ra bảng quyết định 3.22 với 16 luật. Chúng ta vẫn có một vấn đề với các luật không xảy ra theo logic, nhưng công thức này giúp chúng ta xác đinh được đầu ra mong đợi của các trường hợp kiểm thử. Nếu chúng ta hoàn thành các điểm vào hành động trong bảng này, thì sẽ tìm được một vấn đề xảy ra với trường hợp tháng 12. Trong luật số 8, nếu là tháng 12 thì sẽ phải đặt lại ngày, đặt lại tháng và tăng năm. Vấn đề này sẽ được giải quyết ở lần thử nghiệm số 3.
Bảng 3.22 Bảng quyết định phép thử thứ 2 với 36 luật [6]
3.3.3.3. Phép thử thứ ba cho bài toán NextDate
Ở 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