Kiểm thử giá trị biên là một trong những kĩ thuật kiểm thử chức năng được áp dụng rộng rãi và hiệu quả. Kĩ thuật này tạo ra các ca kiểm thử bởi việc phân tích miễn dữ liệu vào. Kinh nghiệm của những người phát triển phần mềm cho thấy rằng các lỗi
thường do chương trình không được đặc tả các hành vi đối với các giá trị biên (giá trị rất lớn, giá trị không hay âm đối với chỉ số, chuỗi kí tự rỗng, hay các dữ liệu không hợp lệ). Các giá trị biên được xác định dựa vào miền giá trị của các biến đầu vào. Kĩ thuật kiểm thử giá trị biên xác định các giá trị để kiểm thử cho một biến đầu vào x gồm (Hình 3.2):
- giá trị nhỏ hơn giá trị nhỏ nhất (min-), - giá trị nhỏ nhất (min),
- giá trị lớn hơn giá trị nhỏ nhất (min+), - giá trịbình thường (nom),
- giá trị nhỏ hơn giá trị lớn nhất (max-), - giá trị lớn nhất (max),
- giá trị lớn hơn giá trị lớn nhất (max+).
x
min- min min+ nom max- max
max+ Hình 3.2. Minh họa các giá trị dữ liệu thử x b a c d
Hình 3.3. Miền vào của chương trình có hai biến vào
Với giả thuyết lỗi đơn, kiểm thử giá trịbiên cho chương trình f với hai biến đầu vào gồm các dữ liệu thử sau:
{< 𝑥𝑛𝑜𝑚, 𝑦𝑚𝑖𝑛− >, < 𝑥𝑛𝑜𝑚, 𝑦𝑚𝑖𝑛 >,< 𝑥𝑛𝑜𝑚, 𝑦𝑚𝑖𝑛+ >,< 𝑥𝑛𝑜𝑚, 𝑦𝑚𝑎𝑥− >,
< 𝑥𝑛𝑜𝑚, 𝑦𝑚𝑎𝑥 >,< 𝑥𝑛𝑜𝑚, 𝑦𝑚𝑎𝑥+ >,
< 𝑥𝑚𝑖𝑛−, 𝑦𝑛𝑜𝑚 >,< 𝑥𝑚𝑖𝑛, 𝑦𝑛𝑜𝑚 >,< 𝑥𝑚𝑖𝑛+, 𝑦𝑛𝑜𝑚 >,< 𝑥𝑚𝑎𝑥−, 𝑦𝑛𝑜𝑚 >,
< 𝑥𝑚𝑎𝑥+, 𝑦𝑛𝑜𝑚 >,< 𝑥𝑚𝑎𝑥, 𝑦𝑛𝑜𝑚 >,
< 𝑥𝑛𝑜𝑚, 𝑦𝑛𝑜𝑚 >}
Các dữ liệu thử này được minh họa trong Hình 3.4.
x b a
y
c d
Hình 3.4. Dữ liệu thử (với giả thuyết lỗi đơn) cho chương trình có hai biến vào
Số dữ liệu thử có thể được xác định qua số biến vào: nếu chương trình có n biến vào, chỉ một biến nhận các giá trị min-, min, min+, max-, max, max+, các biến còn lại nhận giá trị nom, và một trường hợp tất cả các biến đều nhận giá trị nom. Như vậy đối với chương trình có n biến vào, kiểm thử giá trị biên (với giả thuyết lỗi đơn) có 6n+1 dữ liệu thử.
Nếu bỏ qua giả thuyết lỗi đơn, chúng ta quan tâm đến điều gì xảy ra khi nhiều hơn một biến đầu vào đạt đến giá trị biên. Trong trường hợp này, chúng ta gọi kiểm thử gái biên trong trường hợp xấu nhất. Đối với mỗi biến đầu vào, chúng ta bắt đầu với tập hợp bảy giá trị min-, min, min+,nom, max-, max, max+. Chúng ta sử dụng tích Đề-các của các tập hợp này đẻ tạo ra các dữ liệu thử. Các dữ liệu thử đối với chương trình có hai biến đầu vào được minh họa trong Hình 3.5.
Chúng ta có thể nhận thấy rằng các dữ liệu thử có tính đến giả thuyết lỗi đơn chỉ là tập con của các dữ liệu thử bỏ qua giả thuyết lỗi đơn. Điều đó cũng cho thấy rằng kiểm thử trong trường hợp xấu nhất yêu cầu chi phí cao hơn: kiểm thử trong trường hợp xấu nhất cho một chương trình có n biến đầu và tạo ra 7𝑛 dữ liệu thử, so với 6n + 1 dữ liệu thửkhi tính đến giả thuyết lỗi đơn.
Kiểm thử giá trị biên là kĩ thuật đơn giản, dễ áp dụng và hiệu quả trong việc phát hiện lỗi. Tuy nhiên, kiểm thử giá trị biên không hiệu quả đối với các biến kiểu logic, bỏi vì biến chỉ nhận hai giá trị đúng hoặc sai.
x
b a
y
c d
Hình 3.5. Dữ liệu thử (bỏ qua giả thuyết lỗi đơn) cho chương trình có hai biến vào
Kiểm thử giá trị biên thường rất hiệu quả khi áp dụng để kiểm thử các chương trình có các biến đầu vào độc lập và biểu diễn các đại lượng vật lí có giới hạn (bounded physical quantities). Kiểm thử giá trị biên giả thuyết các biến đầu vào hoàn toàn độc lập, nghĩa là giá trị các biến không phụ thuộc lẫn nhau. Tuy nhiên trong thực tế, đối với một số chương trình các biến đầu vào thường phải thỏa mãn các ràng buộc nhất định. Chẳng hạn, một chương trình có ba đầu vào là ngày, tháng và năm. Khi đó, giữa các biến ngày, tháng và năm có sự phụ thuộc chặt chẽ với nhau. Hơn nữa, khi các biến biểu diễn các đại lượng vật lí như nhiệt độ, áp suất, tốc độ,… thì các giới hạn vật lí rất quan trọng.
Ngoài ra, kiểm thử giá trị biên tạo ra các dữ liệu thử chỉ dựa trên sự phân tích giá trị biên của các biến đầu vào, mà không quan tâm đến bản chất của chương trình cũng như ngữ nghĩa của các biến.
Ví dụ 1
Kiểm thử giá trị biên đối với chương trình tính hoa hồng cho một đại lý bán xe máy. Một đại lý bán xe máy cho Công ty Yamaha, có bán hai loại xe máy là Sirius và Jupiter. Do phụ thuộc vào ràng buộc sản xuất của công ty vào kho hàng của đại lý, nên mỗi tháng đại lý có ít nhất 1 xe Sirius, ít nhất 1 xe Jupiter và có nhiều nhất 100 xe Sirius và 50 xe Jupiter để bán. Giá bán xe Sirius là 15 triệu đồng và Jupiter là 20 triệu đồng. Đại lý hưởng tiền hoa hồng dựa trên doanh thu của đại lý trong tháng: đại lý được nhận 10% doanh thu bán hàng đến 1 tỉ đồng; 15% doanh thu bán hàng 500 triệu đồng tiếp theo; 20% doanh thu bán hàng vượt quá 1 tỉ 500 triệu đồng. Chúng ta cần kiểm thử chương trình nhận hai biến đầu vào là số lượng xe Jupiter và xe Sirius bán được trong tháng và tính toán cho ra kết quả là doanh thu và số tiền hoa hồng đại lí được nhận.
Phân tích các biến đầu vào của chương trình, chúng ta nhận thấy:
1 ≤ 𝑠ố 𝑙ượ𝑛𝑔 𝑥𝑒 𝑆𝑖𝑟𝑖𝑢𝑠 ≤ 100 1 ≤ 𝑠ố 𝑙ượ𝑛𝑔 𝑥𝑒 𝐽𝑢𝑝𝑖𝑡𝑒𝑟 ≤ 50
Như vậy các dữ liệu thử cho sốlượng xe Sirius (#Sirius) gồm: 0 ; 1 ; 2 ; 50 ; 99 ; 100 ; 101 ; các dữ liệu thử cho số lượng xe Jupiter (#Jupiter) gồm : 0 ; 1 ; 2 ; 25 ; 49 ; 50 ; 51.
Áp dụng kiểm thử giá trị biên với giả thuyết lỗi đơn, chúng ta có các ca kiểm thử (ca KT) được trình bày trong Bảng 3.1.
Bảng 3.1. Dữ liệu thử với giả thuyết lỗi đơn cho chương trình tính hoa hồng
Ca KT #Sirius #Jupiter Doanh thu
(triệu) Hoa hồng (triệu) 1 0 25 500 50 2 1 25 515 51,5 3 2 25 530 53 4 99 25 1985 272 5 100 25 2000 275 6 101 25 2015 278 7 50 0 750 75 8 50 1 770 77 9 50 2 790 79 10 50 49 1730 221 11 50 50 1750 225 12 50 51 1770 229 13 50 25 1250 137,5
Nếu bỏ qua giả thuyết lỗi đơn, khi áp dụng kiểm thử giá trị biên, chúng ta có các ca kiểm thử được trình bày trong Bảng 3.2.
Bảng 3.2. Dữ liệu thửcho chương trình tính hoa hồng không tính đến giả thuyết lỗi đơn.
Ca KT #Sirius #Jupiter Doanh thu
(triệu) Hoa hồng (triệu) 1 0 0 0 0 2 1 0 15 1,5 3 2 0 30 3 4 50 0 750 75 5 99 0 1485 172,75 6 100 0 1500 175 7 101 0 1515 178 8 0 1 20 2 9 1 1 35 3,5 10 2 1 50 5 11 50 1 770 77 12 99 1 1505 176 13 100 1 1520 179 14 101 1 1535 182 15 0 2 40 4 16 1 2 55 5,5 17 2 2 70 7 18 50 2 790 79 19 99 2 1525 180 20 100 2 1540 183 21 101 2 1555 186 22 0 25 500 50
23 1 25 515 51,5 24 2 25 530 53 25 50 25 1250 137,5 26 99 25 1985 272 27 100 25 2000 275 28 101 25 2015 278 29 0 49 980 98 30 1 49 995 99,5 31 2 49 1010 101,5 32 50 49 1730 221 33 99 49 2465 368 34 100 49 2480 371 35 101 49 2495 374 36 0 50 1000 100 37 1 50 1015 102,25 38 2 50 1030 104,5 39 50 50 1750 225 40 99 50 2485 372 41 100 50 2500 375 42 101 50 2515 378 43 0 51 1020 103 44 1 51 1035 105,25 45 2 51 1050 107,5 46 50 51 1770 229 47 99 51 2505 376 48 100 51 2520 379 49 101 51 2535 382 Ví dụ 2
Chương trình đào tạo Chất lượng cao Công nghệ Thông tin của Trường Đại học Bách khoa – Đại học Đà Nẵng tuyển chọn hằng năm 20 sinh viên. Đầu năm học mới, sinh viên vừa trúng tuyển vào trường có thể nộp hồ sơ đăng kí vào học chương trình Chất lượng cao. Chương trình chỉ nhận 200 hồ sơ nộp sớm nhất và sau đó chọn 20 sinh viên có hồsơ tốt nhất. Mỗi hồsơ được đánh giá dựa trên điểm thi trong kì thi tuyển sinh đại học toàn quốc. Mỗi sinh viên có điểm thi ba môn : Toán, Vật Lí, và Hóa học. Điểm mỗi môn thuộc khoảng 0 đến 10, điểm có thể lẻ 0,5. Tổng điểm của mỗi sinh viên được tính theo công thức:
Tổng điểm = điểm Toán × 3 + điểm Vật lí × 2 + điểm Hóa × 1 Sau đó, chọn 20 sinh viên có tổng điểm cao nhất.
Giả sử các hồ sơ sinh viên được chứa trong một tệp. Tệp này chứa nhiều nhất 200 sinh viên. Thông tin mỗi sinh viên gồm mã sinh viên (nhiều nhất 8 chữ số), điểm môn Toán, điểm môn Toán, Lí và Hóa. Một chương trình đọc tệp, tính tổng điểm mỗi
sinh viên và cho kết quả 20 sinh viên có tổng điểm cao nhất. Chúng ta sẽ áp dụng kĩ thuật kiểm thử giá trịbiên có xét đến giả thuyết lỗi đơn để kiểm thửchương trình này.
Trước hết, đối với tệp đầu vào, gồm các tệp: tệp rỗng, tệp chứa 1 sinh viên, tệp chứa 100 sinh viên, tệp chứa 199 sinh viên, tệp chứa 200 sinh viên và tệp chứa 201 sinh viên (lưu ý, chỉ có 6 dữ liệu thử khác nhau, giá trị -1 không có nghĩa trong trường hợp này). Trong đó, thông tin mỗi sinh viên gồm mã sinh viên và điểm các môn đều là những giá trị bình thường và hợp lệ.
Xét riêng dữ liệu mỗi sinh viên, mã sinh viên nhận các giá trị 0 chữ số (rỗng), 1 chữ số, 4 chữ số, 7 chữ số, 8 chữ số và 9 chữ số. Điểm mỗi môn nhận giá trị -0,5; 0 ; +0,5 ; 5 ; 9,5 ; 10 ; 10,5. Tương tự như ví dụ trước, kết hợp các biến này chúng ta có được 7 × 3 + 6 = 27 dữ liệu sinh viên khác nhau.