Ứng dụng đồ thị lƣu trình trong lý thuyết đồ thị vào kiểm thử luồng điều khiển

Một phần của tài liệu Cơ sở toán học cho các kỹ thuật kiểm thử phần mềm (Trang 29 - 35)

điều khiển

Một đồ thị có hƣớng G(N, E) đƣợc định nghĩa nhƣ sau [1]:

Tập hợp N  đƣợc gọi là tập các đỉnh của đồ thị;

Tập hợp E là tập các cạnh có hƣớng của đồ thị hay cung của G ; mỗi

cạnh eE là cặp sắp thứ tự (u,v) của 2 đỉnh, đỉnh u (đứng trƣớc) gọi là gốc

của cung, đỉnh v đứng sau gọi là ngọn của cung. Cung (u,v) kí hiệu là uv. Đồ thị có hƣớng các cung (các cạnh có hƣớng) đƣợc biểu thị bằng những đƣờng cong có mũi tên đi từ gốc tới ngọn. Ta cũng nói: cung uv đi ra khỏi u và đi vào v. Một đồ thị có hƣớng, không có cạnh song song và không có khuyên.

Đƣờng đi trong đồ thị có hƣớng trên cung uv chỉ có thể đi từ u (gốc) đến v (ngọn).

Một dây chuyền trong G(N, E) là một đồ thị con C(V, T) của G với: V = {x1, x2, …, xM}. T = {u1, u2, …, uM-1} với u1=x1x2, u2=x2x3, …, uM-

1=xM-1xM; liên kết xixi+1 không phân biệt thứ tự. Khi đó, x1 và xM đƣợc nối với

nhau bằng dây chuyền C. x1 là đỉnh đầu và xM là đỉnh cuối của C.

Số cạnh của C đƣợc gọi là độ dài của C. Khi các cạnh hoàn toàn xác định bởi cặp đỉnh kề, dây chuyền có thể viết gọn (x1, x2, …, xM). Dây chuyền SƠ CẤP: dây chuyền không có đỉnh lặp lại.

Đƣờng đi SƠ CẤP: đƣờng đi không có đỉnh lặp lại. MẠCH: là một đƣờng đi có đỉnh đầu trùng với đỉnh cuối.

Mạch trong đồ thị có hƣớng còn đƣợc gọi là “chu trình có hƣớng”. Đƣờng đi trong đồ thị có hƣớng cũng đƣợc gọi là “đƣờng đi có hƣớng”.

Dựa vào bản chất toán học về lý thuyết đồ thị trình bày ở trên, ngƣời ta đã áp dụng vào kiểm thử luồng điều khiển (Basic Path Testing) trong kiểm thử hộp trắng, và là một công cụ rất hữu ích để hiểu lƣu trình điều khiển và minh hoạ phƣơng pháp tiếp cận. Tuy nhiên áp dụng vào kiểm thử luồng điều khiển trong kiểm thử hộp trắng, khi xác định đƣờng dẫn trong đồ thị lƣu trình phải thoả mãn điều kiện: đƣờng dẫn này không phải là một mạch và không phải là một đƣờng đi sơ cấp. Phần quan trọng nhất đối với kiểm thử hộp trắng là ngƣời kiểm thử cần phải biết thuật toán, ngôn ngữ lập trình để từ đó căn cứ vào mã nguồn chƣơng trình tiến hành vẽ đồ thị lƣu trình.

Sử dụng một số ký hiệu đƣợc minh hoạ nhƣ hình 3.1 để vẽ lƣu trình điều khiển logic. Mỗi cấu trúc điều khiển có một ký hiệu đồ thị lƣu trình tƣơng ứng.

Đồ thị lƣu trình gồm có:

Mỗi hình tròn gọi là đỉnh, biểu diễn một hoặc nhiều lệnh thủ tục.

Con trỏ đƣợc gọi là cung hoặc liên kết biểu diễn lƣu trình điều khiển.

Một cung cần phải kết thúc tại một đỉnh, cho dù đỉnh đó không biểu diễn cho một lệnh thủ tục nào.

Mỗi đỉnh có chứa điều kiện gọi là đỉnh điều kiện.

Phần đƣợc bao bởi các cung và các đỉnh gọi là vùng. Phần bên ngoài

Bất kỳ một thiết kế thủ tục nào đều có thể chuyển đƣợc sang đồ thị lƣu trình. Các biểu thức Bool tổ hợp trong các kiểm thử có thể tạo ra ít nhất hai đỉnh điều kiện và các cung bổ sung.

* Các thành phần cơ bản:

* Miêu tả các cấu trúc điều khiển phổ dụng:

Hình 3.1 - Ký hiệu đồ thị lƣu trình

Biểu diễn các điều kiện phức trong đồ thị lưu trình

Khi gặp các điều kiện phức xuất hiện trong câu lệnh điều kiện đƣợc biểu diễn gồm một hoặc nhiều phép toán logic (AND, OR, NOT), cần phải đƣợc chia thành các điều kiện đơn trong thực hiện kiểm thử đƣờng dẫn cơ sở. Mỗi đỉnh chứa điều kiện đƣợc gọi là đỉnh điều kiện và đƣợc đặc trƣng bởi hai hoặc nhiều cạnh bắt nguồn từ nó.

Ví dụ: if (a OR b) then {Procedure x} else {Procedure y} if (c AND d) then {Procedure x} else {Procedure y}

Tuần tự Rẽ nhánh (if) Lựa chọn (Switch) Lặp While (for) Lặp Until

Hình 3.2 - Điều kiện phức

Ví dụ: đồ thị lƣu trình có thể xác định nhƣ hình 3.3.

Hình 3.3 – Đồ thị lƣu trình

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 toá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 hoà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).

Một phần của tài liệu Cơ sở toán học cho các kỹ thuật kiểm thử phần mềm (Trang 29 - 35)