Hình 1.7: Đồ thị dòng điều khiển mô tả các chức năng trong Bảng 1.53
Xét vị từ đầu tiên:
P1: c > 5
Trong phát biểu if() đầu tiên chỉ có một giải thích, cụ thể là:
P1 : x +y > 5
bởi vì chƣơng trình điều khiển đạt đến tuyên bố if() chỉ thông qua một đƣờng đi từ nút đầu tiên. Tuy nhiên, ở vị từ thứ 2:
P2 : d ≥ c + 2
trong phát biểu if() thứ hai có hai giải thích. Vì khi đó điều khiển chƣơng trình có thể tới đƣợc nút if() thứ 2 theo hai con đƣờng: (i) khi đánh giá if () lần đầu là đúng và (ii) khi đánh giá if () lần đầu tiên là sai.
Hai giải thích đƣợc tóm tắt trong Bảng 1.6:
Bảng 1.6: Hai giải thích của tuyên bố if() thứ 2 trong hình 1.7
P1: c > 5 (x+y > 5)
False: thực hiện lệnh d = c + x/2 True: thực hiện lệnh d = c – x/2
P2: d>= c + 2 P2: d>= c + 2
False True False True
d = c + x/2 d < c + 2 d = c + x/2 d >= c + 2 d = c – x/2 d < c + 2 d = c – x/2 d >= c + 2 x < 4 x >=4 x > -4 x <= -4
Chi tiết hơn, chúng ta đi giải thích các thủ tục để có đƣợc các miền từ giải thích của P1 và P2 (Hình 1.7) và theo dõi cụ thể trong Hình 1.8 bên dƣới đây:
Xem xét các nút phát biểu của biểu đồ dòng điều khiển từng cái một (Hình 1.7). Đầu tiên vị từ P1 chia toàn bộ miền vào hai khu vực. Biên P1 đƣợc thể hiện bằng một đƣờng thẳng đƣợc xây dựng từ biểu thức x + y = 5: Mọi điểm nằm bên trên đƣờng thằng (không thuộc đƣờng thẳng) đáp ứng điều kiện P1 là True, các điểm thuộc đƣờng thẳng và các điểm nằm phía dƣới đƣờng thẳng sẽ thỏa mãn P1 là False
Tiếp theo, chúng ta xem xét hai cách giải thích của vị từ P2. Cho P1 = True, P2 có giải thích sau đây:
Vì vậy, P2 tiếp tục phân chia miền đƣợc xác định bởi giá trị P1 = True thành hai bộ tƣơng ứng với hai giá trị của nó. Biên P2 chia ra, khi P1 là True, đƣợc đại diện bởi các đƣờng thẳng x = -4. Khu vực bên trái của biên P2 và trên biên P1 tƣơng ứng với P1P2 = TT, và khu vực bên phải của biên P2 và trên biên P1 tƣơng ứng với P1P2 = TF.
Hình 1.8: Các miền thu được từ các giải thích vị từ trong hình 1.74
Khi P1 = False, P2 có giải thích nhƣ sau:
P2 : x >4
Nói cách khác, P2 tiếp tục phân chia miền đƣợc xác định khi P1 = False thành hai bộ tƣơng ứng với hai giá trị thật của nó. Biên P2, khi P1 = True, đƣợc phân chia bởi đƣờng thẳng x = 4. Khu vực bên phải của biên P2 và dƣới biên P1 tƣơng ứng với P1P2
= FT, và khu vực bên trái của biên P2 và dƣới biên P1 tƣơng ứng với P1P2 = FF trong Hình 1.8.
Chúng ta có thể lƣu ý rằng nếu một chƣơng trình có chứa k vị từ trong đó, số lƣợng tối đa các miền thu đƣợc là 2k. Trong thực tế, số lƣợng các miền thu đƣợc là nhỏ hơn nhiều so với 2k,
*)Ví dụ 05: Chƣơng trình nhập vào điểm và xét điểm tổng kết môn học
Bảng 1.7: Hàm tính điểm tổng kết môn học trong ví dụ 05
string tongket(int x){
if (x < 0 || x > 10) return “không hợp lệ”; else if ( x >= 0 && x < 5) return “trƣợt”; else return “đỗ”;
return(k); }
Ta xây dựng đƣợc các miền vào của biến nhƣ sau:
Hình 1.9: Miền vào cho chương trình ở Bảng 1.7
Từ mã nguồn xác định đƣợc 4 vị từ nhƣng số miền xác định là 4 miền. Tƣơng tự cho các trƣờng hợp áp dụng với không gian 2 chiều và 3 chiều…
1.2.3 Các kiểu xuất hiện của lỗi miền
a. Các khái niệm cơ bản:
Các thuộc tính của một miền:
- Một miền là một tập hợp các giá trị mà chƣơng trình thực hiện các tính toán giống hệt nhau.
- Một miền có thể đƣợc mô tả bởi một tập hợp các vị từ. Các phần tử riêng biệt của miền đáp ứng các vị từ của miền đó.
Ví dụ: Miền TT trong Hình 1.8 là cách biểu diễn theo toán học tập hợp các vị từ thể hiện trong Bảng 1.8 dƣới đây:
Bảng 1.8: Các vị từ định nghĩa trong miền TT trong Hình 1.8.
P1: x+y>5 ≡ True
Một miền đƣợc xác định, theo phƣơng pháp của hình học, bởi một tập các ràng buộc đƣợc gọi là các biên khác nhau. Các thuộc tính của một miền đƣợc thảo luận trong nhóm của các thuộc tính của các biên đó nhƣ sau:
Biên đóng (Closed Boundary): Một biên đƣợc cho là đóng nếu các điểm trên biên
cũng thuộc trong miền quan tâm.
Ví dụ: Hãy xem xét miền TT trong Hình 1.8 và biên của nó đƣợc xác định bởi:
P2 : x ≤ −4
Biên trên là một biên đóng của miền TT.
Biên mở (Open Boundary): Một biên đƣợc cho là mở nếu các điểm trên biên không
thuộc về miền đƣợc quan tâm.
Ví dụ: Xem xét miền TT trong Hình 1.8 và biên của nó đƣợc xác định bởi biểu thức
P1: x +y > 5
Biên trên là một biên mở của miền TT. Chúng ta có thể nhận thấy rằng ký hiệu dấu "=" trong một toán tử quan hệ xác định có hay không một biên đƣợc đóng lại. Nếu các toán tử quan hệ trong một hàm của biên có biểu tƣợng "=" trong nó, thì khi đó biên là một biên đóng, nếu không nó là một biên mở.
Miền đóng (Closed Domain): Một miền đƣợc cho là miền đóng nếu tất cả các biên
của nó là đóng.
Miền mở (Open Domain): Một miền đƣợc cho là mở nếu một số biên của nó đƣợc
mở.
Điểm cực biên (Extreme Point): Một điểm cực biên là một điểm mà hai hoặc nhiều
biên đi qua.
Miền liền kề (Adjacent Domains): Hai miền đƣợc cho là liền kề nếu chúng có một
biên chung.
b. Các kiểu lỗi miền:
Một đƣờng đi của chƣơng trình sẽ có một lỗi miền nếu ta xây dựng không chính xác một đƣờng đi của vị từ. Từ giải thích không chính xác của một vị từ sẽ sinh ra một con đƣờng khác với con đƣờng chính xác:
- Mập mờ giữa miền đóng và miền mở;
- Bị dịch chuyển một khoảng cách từ vị trí chính xác; - Bị quay nghiêng một góc so với vị trí chính xác. Từ đó tác giả đƣa ra 3 kiểu lỗi miền cơ bản:
+) Lỗi đóng biên (Closure Error):
Một lỗi đóng biên xảy ra nếu một biên mục tiêu là đóng bị thay bằng một biên mở hoặc ngƣợc lại biên mở bị thay bằng biên đóng trong quá trình xây dựng chƣơng trình. Một số ví dụ về lỗi đóng biên:
- Toán tử quan hệ ≤ đƣợc thực hiện nhƣ là <. - Toán tử quan hệ < đƣợc thực hiện nhƣ là ≤. - Toán tử quan hệ ≥ đƣợc thực hiện nhƣ là >. - Toán tử quan hệ > đƣợc thực hiện nhƣ là ≥.
Nguyên nhân chính xuất hiện lỗi đóng biên do sự mập mờ giữa dấu “=” trong các biểu thức của vị từ
Hình 1.11: Minh họa cho lỗi đóng biên
+) Lỗi dịch chuyển biên (Shifted-Boundary Error):
Một lỗi dịch chuyển biên xảy ra khi biên thực hiện song song với biên dự định. Điều này xảy ra khi giá trị bất biến của bất đẳng thức xác định biên chiếm một giá trị khác với giá trị dự kiến. Trong điều kiện cụ thể, một lỗi dịch chuyển biên xảy ra do sự thay đổi về độ lớn hoặc các dấu hiệu của giá trị bất biến của bất đẳng thức.
Ví dụ: Hãy xem xét biên đƣợc xác định bởi vị từ trong Hình 1.8 sau đây:
P1: x + y > 5
Nếu biên đúng mục đích cần lấy đƣợc đại diện bởi vị từ:
P1’: x + y > 4
Thì khi đó biên đƣợc xác định bởi P1 là song song, nhƣng không giống với biên đƣợc xác định bởi P1’
Hình 1.12: Minh họa cho lỗi dịch chuyển biên
+) Lỗi nghiêng biên (Tilted-Boundary Error):
Nếu các hệ số bất biến của các biến trong một vị từ xác định một biên lấy giá trị sai, thì lỗi nghiêng biên xảy ra
Ví dụ: Hãy xem xét biên đƣợc xác định bởi vị từ trong Hình 1.8 sau đây:
P1: x + y> 5
Nếu ý định của ngƣời lập trình là xác định một biên đại diện bởi vị từ
P1’’: x + 0.5y> 5
Thì khi đó biên đƣợc xác định bởi P1 nghiêng so với biên đƣợc xác định bởi P1’’
1.2.4 Xây dựng các điểm kiểm tra ON và OFF trong kiểm thử miền
Trong kiểm thử miền cần xác định rõ mục tiêu là để tìm ra các lỗi miền ở nơi mà các ca kiểm thử đƣợc thiết kế với mục đích phát hiện ra các lỗi miền đã đƣợc nêu trong Phần 1.2.3 ở trên.
Một đặc điểm quan trọng của lỗi miền đó là: Các điểm dữ liệu ở trên hoặc gần biên sẽ có khả năng cao để đƣa ra các lỗi miền. Do đó, với mục tiêu xác định các điểm dữ liệu đƣợc cho là nhạy cảm nhất dẫn đến các lỗi miền, thì việc thực hiện các chƣơng trình với những giá trị đầu vào đó sẽ đem đến kết quả khả thi nhất cho quá trình kiểm thử.
Trong kiểm thử miền tác giả sẽ cho chúng ta làm quen với hai khái niệm về điểm ON và OFF, đây chính là những điểm đƣợc xác định trên hoặc gần với biên của miền nhất, và vì vậy chúng là những điểm dễ phát hiện ra lỗi của chƣơng trình.
a. Điểm ON:
*) Định nghĩa: Cho một biên, một điểm ON là một điểm trên biên hoặc "rất gần" biên. Định nghĩa này cho thấy rằng chúng ta có thể chọn một điểm ON theo hai cách phụ thuộc vào vị từ và mục đích lựa chọn. Từ đó chúng ta sẽ biết lựa chọn một điểm ON theo cách nào là phù hợp:
- Nếu một điểm có thể đƣợc lựa chọn nằm chính xác trên biên, khi đó lựa chọn điểm nhƣ vậy sẽ là một điểm ON lý tƣởng nhất.
- Nếu một bất đẳng thức của biên dẫn đến một giải pháp gần đúng, chọn một điểm rất gần với biên. (ví dụ: x < 5 thì chọn giá trị nhỏ và gần 5 nhất để thỏa mãn điều kiện của x)
*) Ví dụ: Hãy xem xét những bất đẳng thức của biên sau đây
PON1: x + 7y ≥ 6
Cho x = -1, vị từ PON1 sẽ đƣa ra một giá trị chính xác của y là = 1. Do đó, điểm (-1, 1) nằm trên biên.
Tuy nhiên, nếu chúng ta chọn x = 0, vị từ PON1 dẫn đến một giải pháp gần đúng của y ở dạng y = 6/7 = 0.8571428. . . Vì y không có một giá trị chính xác, chúng ta có thể cắt nó thành 0.857 hoặc làm tròn nó thành 0.858. Ta nhận thấy rằng điểm (0, 0.857) không đáp ứng các vị từ PON1 (vì 0.857y < 6), trong khi điểm (0, 0.858) thỏa mãn (vì 0.858y > 6). Do đó, điểm (0, 0.858) là một điểm ON nằm rất gần với biên PON1.
Do đó ta thấy: theo bất đẳng thức PON1 thì nếu chọn x=1 sẽ xác định đƣợc chính xác y = 1, khi đó ta sẽ có một điểm chính xác nằm trên biên. Tuy nhiên nếu cho x = 0
thì y = 6/7 và cho một số không chính xác, khi đó chọn một giá trị tƣơng đối của y sẽ cho ta một điểm gần với biên.
*) Ví dụ: Hãy xem xét một miền với biên mở nhƣ sau: PON2: x + 7y < 6
Điểm nằm chính xác trên biên đƣợc xác định bởi vị từ: PON2’ : x + 7y = 6
Nhƣng điểm đó lại không phải là một phần của miền đang đƣợc xem xét. Điểm (- 1, 1) nằm chính xác trên biên PON2’ và là một điểm ON. Lƣu ý rằng điểm (-1, 1) không phải là một phần của miền đang đƣợc xem xét. Tƣơng tự nhƣ vậy, các điểm (0, 0.858), trong đó gần nhƣ trên biên, nó nằm rất gần với biên, là một điểm ON và nó nằm ngoài phạm vi quan tâm.
b. Điểm OFF:
*) Định nghĩa: Một điểm OFF của một biên là điểm nằm cách xa biên.
Tuy nhiên, khi lựa chọn một điểm OFF, chúng ta phải xem xét liệu một biên là mở hay đóng đối với một miền:
- Nếu một biên là mở với một miền đang đƣợc xem xét, thì khi đó một điểm OFF của biên đó là một điểm trong nằm bên trong miền với một khoảng cách nhỏ tùy ý từ biên.
- Nếu một biên là đóng so với miền đang đƣợc xem xét, thì sau đó một điểm OFF của biên đó là một điểm ngoài nằm ở phía ngoài của biên với một khoảng cách nhỏ tùy ý.
*) Ví dụ: Hãy xem xét một miền D1 với một biên đóng nhƣ sau: POFF1: x + 7y ≥ 6
Khi biên đƣợc đóng lại, một điểm OFF nằm ngoài miền này có nghĩa là bất đẳng thức biên không đáp ứng. Lƣu ý rằng điểm (-1, 1) nằm chính xác trên biên và nó thuộc về miền. Do đó, (-1, 1) không phải là một điểm OFF. Tuy nhiên, điểm (-1, 0.99) nằm bên ngoài miền, và nó không phải là một phần của miền đang đƣợc xem xét. Điều này có thể dễ dàng kiểm chứng bằng cách thay thế x = -1 và y = 0,99 vào trong bất đẳng thức POFF1, khi đó sẽ sinh ra một giá trị 5.93 < 6. Do đó, (-1, 0.99) là một điểm OFF.
*) Ví dụ: Hãy xem xét một miền D2, đó là miền tiếp giáp với miền D1 trong ví dụ trên với một biên mở nhƣ sau: POFF2: x + 7Y <6
Khi biên POFF2 là mở, một điểm OFF nằm bên trong miền. Có thể dễ dàng xác định điểm (-1, 0.99) nằm bên trong D2, và do đó nó là một điểm OFF cho miền D2 đối với biên POFF2.
c. Tổng quát:
- Trong khi kiểm thử một biên đóng, các điểm ON sẽ thuộc miền đƣợc kiểm tra, và các điểm OFF nằm trong một miền lân cận.
- Trong khi kiểm thử một biên mở, các điểm ON nằm trong một miền lân cận, còn các điểm OFF nằm trong miền đang đƣợc thử nghiệm.
Hình 1.14: Điểm ON và OF
Để hiểu rõ hơn ta có thể xem thêm một ví dụ trong Hình 1.14, trong đó cho thấy hai miền D1 và D2 đƣợc xác định bởi vị từ x < 4 và x ≥ 4 tƣơng ứng. Vì vậy, thực tế biên đƣợc xác định bởi vị từ sau đây:
PON, OFF: x = 4
Trong hình, chúng ta thấy hai điểm ON là A và B, trong đó A nằm chính xác trên biên và B nằm "rất gần" với biên. Vì vậy, chúng ta có A = 4 và ví dụ B = 4,00001. Chúng ta thấy một điểm OFF C nằm trong D1 và cách biên một khoảng. Điểm C = 3,95 nằm bên trong miền D1 và bên ngoài miền D2.
1.2.5 Xây dựng các chiến lƣợc lựa chọn ca kiểm thử
Trong phần này, chúng ta sẽ tìm hiểu cách tác giả giải thích các phƣơng pháp để lựa chọn các ca kiểm thử với các trƣờng hợp xuất hiện lỗi khác nhau trong kiểm thử miền và chứng minh đƣợc rằng dữ liệu thử nghiệm đã đƣợc lựa chọn sẽ tiết lộ lỗi miền xác định tại Phần 1.2.3.
a. Tổng quan các trƣờng hợp xuất hiện lỗi miền:
Đối với từng miền và cho mỗi biên, chọn hai điểm ON là A, B và một điểm OFF là C. Tiêu chí này tạo ra dữ liệu thử nghiệm cho thấy lỗi miền. Tuy nhiên tùy thuộc vào mỗi loại biên và loại lỗi miền mà các tiêu chí lựa chọn các ca kiểm thử cũng có sự khác nhau, cụ thể nhƣ sau:
+) Trƣờng hợp biên đóng với miền xét (Closed inequality boundary)
- Dịch chuyển biên làm giảm đi độ lớn miền (Boundary shift resulting in a reduced domain)
- Dịch chuyển biên làm mở rộng độ lớn miền (Boundary shift resulting in an enlarged domain)
- Nghiêng biên (Boundary tilt) - Lỗi đóng biên (Closure error)
+) Trƣờng hợp biên mở với miền xét (Open inequality boundary)
- Dịch chuyển biên làm giảm đi độ lớn miền (Boundary shift resulting in a reduced domain)
- Dịch chuyển biên làm mở rộng độ lớn miền (Boundary shift resulting in an enlarged domain)
- Nghiêng biên (Boundary tilt) - Lỗi đóng biên (Closure error) +) Biên bình đẳng(Equality boundary)
Để thuận tiện và tổng quát, tác giả xem xét trƣờng hợp bất đẳng thức chứa 2 biến quan hệ nhau, khi đó sẽ xây dựng miền vào cho các ca kiểm thử mô phỏng trong không gian miền hai chiều. Xem xét hai miền liền kề D1 và D2, giả thiết rằng việc tính