3 Đồ thị lƣu trình

Một phần của tài liệu (LUẬN văn THẠC sĩ) cơ sở toán học cho các kỹ thuật kiểm thử phần mềm (Trang 32)

Làm thế nào để kiểm thử số ca kiểm thử tối thiểu mà kết quả độ tin cậy tối đa. Nhƣng làm sao xác định đƣợc số ca kiểm thử tối thiểu nào có thể đem lại kết quả có độ tin cậy tối đa? Để trả lời câu hỏi này chúng ta cùng nghiên cứu tìm hiểu về phủ kiểm thử. Phủ càng lớn thì độ tin cậy càng cao.

Độ phức tạp cyclomat [12]

Độ phức tạp cyclomat là một thƣớc đo phần mềm, cung cấp phép đo định lƣợng độ phức tạp của chƣơng trình. Khi đƣợc sử dụng trong ngữ cảnh

1 2,3 4,5 6 7 8 9 10 11 R2 R1 R3 R4 Đỉnh Cạnh Vùng a b x y c d x y

của phƣơng pháp đƣờng dẫn cơ sở, giá trị đƣợc xác định cho độ phức tạp cyclomat cho biết số lƣợng đƣờng dẫn độc lập trong một tập cơ sở của chƣơng trình và cung cấp cho chúng ta một giới hạn trên số lƣợng kiểm thử bắt buộc để đảm bảo rằng tất cả các câu lệnh đƣợc thực hiện ít nhất một lần.

Trường hợp phủ cấp 1: sinh các ca kiểm thử viếng thăm tất cả các lệnh

một lần.

Một đƣờng dẫn độc lập là một đƣờng dẫn bất kỳ trong chƣơng trình đƣa ra ít nhất một tập lệnh xử lý hoặc điều kiện mới (tức là một cung mới). Phát biểu dƣới dạng đồ thị lƣu trình, một đƣờng dẫn độc lập phải đƣợc di chuyển dọc theo ít nhất một cung mà nó chƣa đi qua trƣớc khi đƣờng dẫn đƣợc xác định. Tập đƣờng dẫn độc lập cho đồ thị lƣu trình đƣợc minh hoạ trong hình 3.3 là:

Đƣờng dẫn 1: 1-11

Đƣờng dẫn 2: 1-2-3-4-5-10-1-11 Đƣờng dẫn 3: 1-2-3-6-8-9-10-1-11 Đƣờng dẫn 4: 1-2-3-6-7-9-10-1-11

Mỗi đƣờng dẫn mới đƣa ra một cung mới. Đƣờng dẫn 1-2-3-4-5-10-1-2- 3-6-8-9-10-1-11 khơng đƣợc xem là một đƣờng dẫn độc lập vì nó chỉ là một tổ hợp các đƣờng dẫn đã đƣợc chỉ ra (đƣờng dẫn 2 và 3) và nó sẽ khơng đi qua một cung mới nào.

Các đƣờng dẫn 1, 2, 3 và 4 tạo thành một tập cơ sở trong hình 3.3. Nếu các trƣờng hợp kiểm thử đƣợc thiết kế để thực hiện những đƣờng dẫn này (một tập cơ sở hay là phủ cấp 1) thì mọi lệnh trong chƣơng trình sẽ đảm bảo đƣợc thực hiện ít nhất một lần và mọi điều kiện sẽ đƣợc thực hiện cả hai trƣờng hợp đúng (true) và sai (false). Trường hợp này gọi là phủ cấp 2, sinh các ca kiểm thử viếng thăm tất cả các lệnh một lần tại hai trƣờng hợp đúng (true) và mặt sai (false).

Trường hợp phủ cấp 3: Chính là phủ cấp 2 và tại các điểm quyết định đƣợc bóc tách riêng theo mỗi điều kiện luận lý con (subcondition) của từng điểm quyết định và đều đƣợc thực hiện ít nhất 1 lần cho cả hai trƣờng hợp đúng (true) và sai (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.

Một số nghiên cứu công nghiệp đã chỉ rằng độ phức tạp Cyclomat càng cao, xác suất hoặc lỗi càng cao đồng nghĩa với việc khả năng phát hiện lỗi chƣơng trình càng cao. Việc tính tốn độ phức tạp cyclomat sẽ cho chúng ta biết có bao nhiêu đƣờng dẫn cần tìm.

Cho đồ thị lƣu trình G, độ phức tạp Cyclomat V(G) đƣợc tính theo một trong 3 công thức sau (dựa trên Lý thuyết đồ thị):

1. V(G) = R (R là số vùng của đồ thị lƣu trình)

2. V(G) = P + 1 (P là số đỉnh điều kiện - đỉnh có ít nhất 2 đầu ra trong

đồ thị lƣu trình G).

3. V(G) = E – N + 2 (E là số cạnh và N là số đỉnh của đồ thị lƣu trình G).

Đối chiếu với đồ thị lưu trình trong hình 3.3, độ phức tạp Cyclomat được tính như sau:

1. Công thức 1: V(G) = R = 4

2. Công thức 2: V(G) = P + 1 = 3 + 1 = 4

3. Công thức 3: V(G) = E – N + 2 = 11 – 9 + 2 = 4

Phát sinh các trường hợp kiểm thử theo đường dẫn cơ sở:

Phƣơng pháp kiểm thử đƣờng dẫn cơ sở có thể đƣợc áp dụng để thiết kế thủ tục chi tiết hoặc cho mã nguồn. Dựa trên ý tƣởng của Tom McCabe kiểm thử đƣờng dẫn cơ sở có thể đƣợc xem nhƣ một tập các bƣớc:

Bƣớc 1: Sử dụng thiết kế hoặc mã nguồn nhƣ là căn cứ để xây dựng đồ thị lƣu trình tƣơng ứng.

Bƣớc 2: Xác định độ phức tạp Cyclomat của đồ thị lƣu trình kết quả (=C). Bƣớc 3: Xác định C tập cơ sở các đƣờng dẫn độc lập tuyến tính cần kiểm thử. Bƣớc 4: Sinh các ca kiểm thử (sinh các test case) có khả năng thực hiện mỗi

đƣờng dẫn trong tập cơ sở.

Bƣớc 5: Thực hiện kiểm thử trên từng ca kiểm thử.

Bƣớc 6: So sánh kết quả có đƣợc với kết quả đƣợc kỳ vọng.

Bƣớc 7: Lập báo cáo kết quả để phản hồi cho những ngƣời có liên quan.

Việc sinh các ca kiểm thử chính là việc chọn dữ liệu để kiểm thử các điều kiện tại các nút điều kiện. Mỗi trƣờng hợp kiểm thử (mỗi test case) đƣợc thực thi và đƣợc đối chiếu với đầu ra mong muốn. Một khi tất cả các ca kiểm thử đã đƣợc hồn thành, ngƣời kiểm thử có thể chắc chắn rằng tất cả các câu lệnh trong chƣơng trình đã đƣợc thực hiện ít nhất một lần. Một điều cần lƣu ý là một số đƣờng dẫn độc lập chỉ có thể đƣợc thực hiện nhƣ là một phần của việc kiểm thử các đƣờng dẫn khác (chẳng hạn nhƣ đƣờng dẫn 1 trong ví dụ trên).

3.2 Áp dụng vào kiểm thử đoạn mã chƣơng trình trong ví dụ "Nhập điểm thi cao học" thi cao học"

Phủ cấp 3 bao hàm cả phủ cấp 2 và phủ cấp 1 đồng thời khả năng phát hiện lỗi cao, chính vì vậy ở đây tơi trình bày cách vẽ đồ thị lƣu trình và sinh các ca kiểm thử theo phủ cấp 3.

Giao diện màn hình nhập điểm thi cao học

Kiểm thử 2 đoạn mã chƣơng trình đƣợc viết trên ngơn ngữ Visual Studio cho chƣơng trình nhập điểm thi cao học ở trên:

3.2.1 Trƣờng hợp 1: Đoạn mã chƣơng trình A:

Private Sub Lƣu_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Lƣu.Click

If (d1.Text < 0) Or (d1.Text > 10) Or (d2.Text < 0) Or (d2.Text > 10) Or (d3.Text > 100) Then

ketqua.Text = "Dữ liệu sai"

ElseIf (d1.Text >= 5) And (d2.Text >= 5) And (d3.Text >= 50) Then

ketqua.Text = "Đỗ" Else ketqua.Text = "Trƣợt" End If (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)

- Bƣớc 1: Vẽ đồ thị lƣu trình dựa trên mã nguồn:

Hình 3.4 Đồ thị lƣu trình đoạn mã chƣơng trình A

- Bƣớc 2: Xác định độ phức tạp Cyclomat của đồ thị lƣu trình kết quả

1. Công thức 1: V(G) = R = 9

2. Công thức 2: V(G) = P + 1 = 8 + 1 = 9

3. Công thức 3: V(G) = E – N + 2 = 19 – 12 + 2 = 9

Nhƣ vậy, độ phức tạp Cyclomat của đồ thị trong hình 3.3b là 9.

Bƣớc 3: Xác định tập cơ sở các đƣờng dẫn độc lập tuyến tính. + Đƣờng dẫn 1: 1,6 + Đƣờng dẫn 2: 1,2,6 + Đƣờng dẫn 3: 1,2,3,6 + Đƣờng dẫn 4: 1,2,3,4,6 + Đƣờng dẫn 5: 1,2,3,4,5,6 + Đƣờng dẫn 6: 1,2,3,4,5,7,8,9,10 1 2 3 4 5 6 7 8 9 11 10

+ Đƣờng dẫn 7: 1,2,3,4,5,7,11 + Đƣờng dẫn 8: 1,2,3,4,5,7,8,11 + Đƣờng dẫn 9: 1,2,3,4,5,7,8,9,11

Bƣớc 4: Sinh các ca hợp kiểm thử (sinh các test case) có khả năng thực hiện mỗi đƣờng dẫn trong tập cơ sở.

Tại đây tôi lấy lại số liệu ở chƣơng 2 (Kiểm thử hộp đen) để sinh các các ca kiểm thử trong trƣờng hợp này.

+ Đƣờng dẫn 1: 1,6

Đầu vào: D1<0, D2 và D3 là một số bất kỳ Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC_01: (-10; 4 ; 85)

+ Đƣờng dẫn 2: 1,2,6

Đầu vào: D1>10, D2 và D3 là một số bất kỳ Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC_02: (12; 8; 20)

+ Đƣờng dẫn 3: 1,2,3,6

Đầu vào: D1 [0,10], D2<0, D3 là một số bất kỳ Đầu ra mong muốn: "Dữ liệu sai"

0 5 10 0 5 10 0 50 100 D1 D2 D3 -10 3 7 12 -11 4 8 15 -7 20 85 140

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC_03: (3; -11; 8)

+ Đƣờng dẫn 4: 1,2,3,4,6

Đầu vào: D1 [0,10], D2>10, D3 là một số bất kỳ Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC-04: (7; 15; 20)

+ Đƣờng dẫn 5: 1,2,3,4,5,6

Đầu vào: D1 [0,10], D2 [0,10], D3>100 Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC-05: (7; 4; 140)

+ Đƣờng dẫn 6: 1,2,3,4,5,7,8,9,10

Đầu vào: D1 [5,10], D2 [5,10], D3  [50,100] Đầu ra mong muốn: "Đỗ"

Mục đích: Kiểm tra kết quả có đỗ khơng

TC-06: (7; 8; 85)

+ Đƣờng dẫn 7: 1,2,3,4,5,7,11

Đầu vào: D1 [0,5), D2 [0,10], D3 <100 Đầu ra mong muốn: "Trƣợt"

Mục đích: Kiểm tra kết quả có thơng báo "Trƣợt" không.

TC-07: (3; 8; 85)

+ Đƣờng dẫn 8: 1,2,3,4,5,7,8,11

Đầu vào: D1 [5,10], D2 [0,5), D3<100 Đầu ra mong muốn: "Trƣợt"

Mục đích: Kiểm tra kết quả có thơng báo "Trƣợt" khơng.

TC-08: (7; 4; -7)

Đầu vào: D1 [5,10], D2 [5,10], D3 <50 Đầu ra mong muốn: "Trƣợt"

Mục đích: Kiểm tra kết quả có thơng báo "Trƣợt" không.

TC-09: (7; 8; 20)

Bảng 3.1: Kết quả kiểm thử theo phƣơng pháp kiểm thử luồng điều khiển trên đoạn mã chƣơng trình A

TC_ID Dữ liệu vào Đầu ra thực tế Đầu ra mong

muốn Kết quả

D1 D2 D3

TC_01 -10 4 85 Dữ liệu sai Dữ liệu sai Ok

TC_02 12 8 20 Dữ liệu sai Dữ liệu sai Ok

TC_03 3 -11 85 Dữ liệu sai Dữ liệu sai Ok

TC_04 7 15 20 Dữ liệu sai Dữ liệu sai Ok

TC_05 7 4 140 Dữ liệu sai Dữ liệu sai Ok

TC_06 7 8 85 Đỗ Đỗ Ok

TC_07 3 8 85 Trƣợt Trƣợt Ok

TC_08 7 4 -7 Trƣợt Dữ liệu sai Not Ok

TC_09 7 8 20 Trƣợt Trƣợt Ok

Với kết quả tại bảng trên chúng ta thấy có tất cả 09 ca kiểm thử, trong đó 8 ca kiểm thử là Ok cịn 01 ca kiểm thử là Not Ok. Chứng tỏ đoạn mã chƣơng trình trên vẫn cịn lỗi và lỗi tại ca kiểm thử TC_08 đƣợc sinh bởi đƣờng dẫn 8 (1,2,3,4,5,7,8,11). Nhƣ vậy lập trình viên cần phải xem xét lại đoạn mã chƣơng trình tại đƣờng dẫn nói trên.

Tuy nhiên trong trường hợp này phụ thuộc vào cách chọn giá trị kiểm thử, bởi vì: tại đƣờng dẫn số 8

Đầu vào: D1 [5,10], D2 [0,5), D3<100

+ Ta chọn D1=7; D2=4; D3=-7 kết quả trả về "Trƣợt" không đúng nhƣ mong muốn. (NOT OK)

+ Nếu ta chọn: D1=7; D2=4; D3=85 kết quả trả về "Trƣợt" đúng nhƣ mong muốn. (OK)

Vậy ta có thể khẳng định rằng việc kiểm thử bằng kỹ thuật hộp trắng khơng thể đảm bảo rằng chƣơng trình đã tn theo đặc tả.

3.2.2 Trƣờng hợp 2: Đoạn mã chƣơng trình B (đã chỉnh sửa).

Private Sub Lƣu_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Lƣu.Click

If (d1.Text<0) Or (d1.Text >10) Or (d2.Text <0) Or (d2.Text >10) Or (d3.Text <0) Or (d3.Text>100) Then

ketqua.Text = "Dữ liệu sai"

ElseIf (d1.Text >= 5) And (d2.Text >= 5) And (d3.Text >= 50) Then

ketqua.Text = "Đỗ" Else ketqua.Text = "Trƣợt" End If End Sub (1) (2) (3) (4) (5) (7) (8) (9) (10) (11) (12) (6)

- Bƣớc 1: Vẽ đồ thị lƣu trình dựa trên mã nguồn:

Hình 3.4 Đồ thị lƣu trình trên đoạn mã chƣơng trình B

- Bƣớc 2: Xác định độ phức tạp Cyclomat của đồ thị lƣu trình kết quả

bằng 1 trong 3 cách:

1. Công thức 1: V(G) = R = 10

2. Công thức 2: V(G) = P + 1 = 9 + 1 = 10

3. Công thức 3: V(G) = E – N + 2 = 21 – 13 + 2 = 10

Nhƣ vậy, độ phức tạp Cyclomat của đồ thị trong hình 3.4 là 10.

Bƣớc 3: Xác định tập cơ sở các đƣờng dẫn độc lập tuyến tính. + Đƣờng dẫn 1: 1,7 + Đƣờng dẫn 2: 1,2,7 + Đƣờng dẫn 3: 1,2,3,7 + Đƣờng dẫn 4: 1,2,3,4,7 + Đƣờng dẫn 5: 1,2,3,4,5,7 1 2 3 4 5 7 8 9 10 12 11 6

+ Đƣờng dẫn 6: 1,2,3,4,5,6,7

+ Đƣờng dẫn 7: 1,2,3,4,5,6,8,9,10,11 + Đƣờng dẫn 8: 1,2,3,4,5,6,8,12 + Đƣờng dẫn 9: 1,2,3,4,5,6,8,9,12 + Đƣờng dẫn 10: 1,2,3,4,5,6,8,9,10,12

Bƣớc 4: Sinh các trƣờng hợp kiểm thử (sinh các test case) có khả năng thực hiện mỗi đƣờng dẫn trong tập cơ sở.

+ Đƣờng dẫn 1: 1,7

Đầu vào: D1<0, D2 và D3 là một số bất kỳ Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC_01: (-10; 4 ; 85)

+ Đƣờng dẫn 2: 1,2,7

Đầu vào: D1>10, D2 và D3 là một số bất kỳ Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC_02: (12; 8; 20)

+ Đƣờng dẫn 3: 1,2,3,7

Đầu vào: D1 [0,10], D2<0, D3 là một số bất kỳ Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC_03: (3; -11; 85)

+ Đƣờng dẫn 4: 1,2,3,4,7

Đầu vào: D1 [0,10], D2>10, D3 là một số bất kỳ Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

+ Đƣờng dẫn 5: 1,2,3,4,5,7

Đầu vào: D1 [0,10], D2 [0,10], D3<0 Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC-05: (7; 4; -7)

+ Đƣờng dẫn 6: 1,2,3,4,5,6,7

Đầu vào: D1 [0,10], D2 [0,10], D3>100 Đầu ra mong muốn: "Dữ liệu sai"

Mục đích: Kiểm tra điểm nhập vào có hợp lệ khơng.

TC-06: (7; 4; 140)

+ Đƣờng dẫn 7: 1,2,3,4,5,6,8,9,10,11

Đầu vào: D1 [5,10], D2 [5,10], D3  [50,100] Đầu ra mong muốn: "Đỗ"

Mục đích: Kiểm tra kết quả có đỗ khơng

TC-07: (7; 8; 85)

+ Đƣờng dẫn 8: 1,2,3,4,5,6,8,12

Đầu vào: D1 [0,5), D2 [0,10], D3  [0,100] Đầu ra mong muốn: "Trƣợt"

Mục đích: Kiểm tra kết quả có thơng báo "Trƣợt" khơng.

TC-08: (3; 8; 85)

+ Đƣờng dẫn 9: 1,2,3,4,5,6,8,9,12

Đầu vào: D1 [5,10], D2 [0,5), D3  [0,100] Đầu ra mong muốn: "Trƣợt"

Mục đích: Kiểm tra kết quả có thơng báo "Trƣợt" khơng.

+ Đƣờng dẫn 10: 1,2,3,4,5,6,8,9,10,12

Đầu vào: D1 [5,10], D2 [5,10], D3  [0,50) Đầu ra mong muốn: "Trƣợt"

Mục đích: Kiểm tra kết quả có thơng báo "Trƣợt" khơng.

TC-10: (7; 8; 20)

Bảng 3.2: Kết quả kiểm thử theo phƣơng pháp kiểm thử luồng điều khiển trên đoạn mã chƣơng trình B

TC_ID

Dữ liệu vào

Đầu ra thực tế Đầu ra mong muốn

Kết quả

D1 D2 D3

TC_01 -10 4 85 Dữ liệu sai Dữ liệu sai Ok

TC_02 12 8 20 Dữ liệu sai Dữ liệu sai Ok

TC_03 3 -11 85 Dữ liệu sai Dữ liệu sai Ok

TC_04 7 15 20 Dữ liệu sai Dữ liệu sai Ok

TC_05 7 4 -7 Dữ liệu sai Dữ liệu sai Ok

TC_06 7 4 140 Dữ liệu sai Dữ liệu sai Ok

TC_07 7 8 85 Đỗ Đỗ Ok

TC_08 3 8 85 Trƣợt Trƣợt Ok

TC_09 7 4 85 Trƣợt Trƣợt Ok

TC_10 7 8 20 Trƣợt Trƣợt Ok

Với kết quả tại bảng trên chúng ta thấy có tất cả 10 ca kiểm thử, kết quả tất cả các ca kiểm thử đều Ok. Vậy đoạn mã chƣơng trình trên khơng phát hiện ra lỗi nào, ta có thể kết luận: Đoạn mã chƣơng trình trên chấp nhận đƣợc.

CHƯƠNG 4

KẾT LUẬN

Kiểm thử phần mềm là một hoạt động quan trọng nhằm đảm bảo chất lƣợng phần mềm. Luận văn đã tập trung nghiên cứu các phƣơng pháp kiểm thử phần mềm nhằm tìm ra bản chất tốn học của các phƣơng pháp này. Từ đó, chúng ta có những hiểu biết bản chất và khai thác tối đa khả năng phát hiện lỗi của các phƣơng pháp kiểm thử phần mềm. Luận văn đã đạt đƣợc các kết quả chính nhƣ sau.

Tìm hiểu các phƣơng pháp kiểm thử phần mềm và các hoạt động nhằm đảm bảo chất lƣợng phần mềm.

Nghiên cứu phƣơng pháp phân hoạch tƣơng đƣơng cho kiểm thử hộp đen. Tìm ra bản chất tốn học của phƣơng pháp này là dựa trên lý thuyết về quan hệ tƣơng đƣơng trên một tập hợp. Một phân hoạch tƣơng đƣơng cho phép chia một tập hợp thành các tập con sao cho các phần tử trong mỗi tập con thỏa mãn các tính chất: phản xạ, đối xứng và bắc cầu. Ứng dụng vào kiểm thử phần mềm, các tình chất này có nghĩa là các phần tử phản ứng nhƣ nhau với chƣơng trình. Vì vậy, thay vì kiểm thử trên nhiều giá trị của miền dữ liệu đầu vào, ta chỉ cần chọn ngẫu nhiên một phần tử của mỗi tập con. Một ví dụ minh họa cũng đã đƣợc trình bày nhằm chỉ ra tính hiệu quả của phƣơng pháp này.

Nghiên cứu phƣơng pháp kiểm thử luồng điều khiển cho kiểm thử hộp trắng (kiểm thử mã nguồn). Tìm ra bản chất toán học của phƣơng pháp này chính là lý thuyết đồ thị. Các luống điều khiển của chƣơng trình sẽ đƣợc biểu diễn tƣơng đƣơng với một đồ thị luồng điều khiển. Áp dụng lý thuyết đồ thị, chúng ta sẽ tìm ra các đƣờng đi từ điểm bắt đầu đến điểm kết thúc của chƣơng trình. Với cách làm này, tất cả các câu lệnh và các nhánh có thể của chƣơng

trình sẽ đƣợc kiểm thử ít nhất một lần. Nhờ vậy, các lỗi tiềm năng của chƣơng

Một phần của tài liệu (LUẬN văn THẠC sĩ) cơ sở toán học cho các kỹ thuật kiểm thử phần mềm (Trang 32)