Khái niệm đồ thì

Một phần của tài liệu Bài giảng kiểm thử phần mềm đh phạm văn đồng (Trang 72 - 76)

Đồ thị có hướng được sử dụng để định nghĩa nhiều tiêu chí kiểm thử cấu trúc. Từ cấu trúc chương trình, chẳng hạn mã nguồn, là đối tượng cần kiểm thử, chúng ta xây dựng đồ thị tương ứng. Các ca kiểm thử cho đối tượng cần kiểm thử được xây dựng tương ứng với các lộ trình trong đồ thị. Sau đó, tiêu chí bao phủ dựa trên đồ thị đánh giá tập ca kiểm thửcho đối tượng kiểm thử về mặt các lộtrình tương ứng các ca kiểm thử bao phủcác đồ thị.

Một đồ thị G được định nghĩa gồm: - Tập các định N,

- Tập các định đầu 𝑁0, với 𝑁0 ⊆ 𝑁,

- Tập các định cuối 𝑁𝑓 với 𝑁𝑓 ⊆ 𝑁,

- Tập các cung E, trong đó E là tập con của N x N.

Một đồ thị để tạo ra các ca kiểm thử chỉ có ý nghĩa khi 𝑁0, 𝑁𝑓 và N có ít nhất một đỉnh, hay nói cách khác các tập 𝑁0, 𝑁𝑓 và N khác rỗng. Cung xuất phát từ một đỉnh 𝑛𝑖 và đến một đỉnh 𝑛𝑗 được ký hiệu (𝑛𝑖, 𝑛𝑗). Đỉnh 𝑛𝑖 được gọi là đỉnh liền kề trước và đỉnh 𝑛𝑗 là đỉnh liền kề sau. Một đồ thị thường được biểu diễn dạng đồ họa: hình tròn biểu diễn đỉnh và mũi tên biểu diễn cung. Hình 3.11 minh họa một đồ thị có hai đỉnh đầu {𝑛0, 𝑛1} và hai đỉnh cuối {𝑛5, 𝑛6}. Đỉnh có mũi tên đi vào, nhưng không có đỉnh liền kề trước là đỉnh đầu. Đỉnh được biểu diễn bởi vòng tròn kép là đỉnh cuối.

Lưu ý rằng một đồ thị có thể có nhiều đỉnh đầu tương ứng với nhiều điểm vào của chương trình, và nhiều đỉnh cuối tương ứng với các điểm kết thúc của chương trình. Tuy nhiên, chúng ta thường giới hạn một đồ thị chỉ gồm một đỉnh đầu duy nhất và một đỉnh cuối duy nhất. Thật vậy, nếu một đồ thị có nhiều đỉnh đầu và nhiều đỉnh

cuối, chúng ta có thể dễ dàng chuyển thành đồ thị có duy nhất đỉnh đầu và duy nhất đỉnh cuối bằng cách bổ sung thêm một đỉnh đầu mới nối đến các đỉnh đầu hiện tại (các đỉnh đầu này không còn là đỉnh đầu nữa) và bổ sung thêm một đỉnh cuối mới, sau đó nối các đỉnh cuối hiện tại (các đỉnh cuối này không còn là đỉnh cuối nữa) đến đỉnh cuối mới.

Hình 3.11. Ví dụđồ thị

Chẳng hạn, chúng ta chuyển đồ thị trong Hình 4.1 với hai đỉnh đầu và hai đỉnh cuối thành đồ thị chỉ có một đỉnh đầu 𝑛0và một đỉnh cuối 𝑛7 trong Hình 4.2.

Một lộ trình (path) là một chuỗi các đỉnh [𝑛0, 𝑛1, ..., 𝑛𝑘] trong đó mỗi cặp đỉnh liền kề (𝑛𝑖, 𝑛𝑗), 1 ≤ i ≤ k, thuộc tập các cung E. Theo ký hiệu này, chúng ta cũng có thể nói một lộ trình là dãy các cung nối từđỉnh thứ nhất cho đến đỉnh cuối cùng của lộ trình.

Nhiều tiêu chí kiểm thử yêu cầu các dữ liệu vào xuất phát từ một đỉnh và kết thúc tại một đỉnh khác. Điều này chỉ có thể, nếu các đỉnh được nối với nhau bởi một lộ trình. Khi chúng ta áp dụng các tiêu chí này cho một đồ thị cụ thể, đôi khi chúng ta nhận thấy rằng có thể có các lộ trình không được thực thi. Vấn đề này tùy thuộc vào cú pháp và ngữnghĩa cảu chương trình mà đồ thị biểu diễn.

Chúng ta nói rằng một đỉnh n (hoặc một cung e) đạt đến được về mặt cú pháp

từ đỉnh 𝑛1 , nếu tồn tại một lộ trình từ đỉnh 𝑛𝑖 đến n (hoặc cung e); một đỉnh n (hoặc một cung e) đạt đến được về mặt ngữnghĩa, nếu có thể thực thi một lộ trình chứa đỉnh n (hay cung e) với dữ liệu vào. Trước mắt chúng ta chỉquan tâm đến sựđạt đến được về mặt cú pháp.

Hình 3.12. Ví dụđồ thị với một đỉnh đầu và một đỉnh cuối.

Chúng ta định nghĩa lộ trình kiểm thử (test path) là một lộ trình xuất phát từ một đỉnh đầu thuộc 𝑁0 và kết thúc tại một đỉnh cuối thuộc 𝑁𝑓. Một lộ trình kiểm thử biểu diễn sự thực thi của một ca kiểm thử. Lộ trình kiểm thử phải xuất phát từ một đỉnh đầu trong 𝑁0 vì ca kiểm thử luôn bắt đầu từ điểm khởi đầu của chương trình. Cần lưu ý rằng một lộ trình kiểm thử có thể tương ứng với một số lượng rất lớn các ca kiểm thử. Ngược lại, một ca kiểm thử chỉ thực thi một lộ trình kiểm thử. Tuy nhiên, cũng có thể một lộ trình kiểm thửkhông tương ứng với ca kiểm thử nào cả, nếu như lộ trình kiểm thử đó không thực thi được. Chúng ta sẽ thảo luận về vấn đề lộ trình không thực thi được sau.

Các tiêu chí kiểm thử hộp trắng dựa trên đồ thị chủ yếu được định nghĩa cho mã nguồn. Loại đồ thị được sử dụng phổ biến để định nghĩa các tiêu chí kiểm thử là đồ thị luồng điều khiển. Vì vậy, trong các mục dưới đây, chúng ta sẽ tìm hiểu chi tiết về việc xây dựng đồ thị này từ mã nguồn.

Đồ thị luồng điều khiển

Mặc dù chi tiết của mối ngôn ngữ lập trình có thể khác nhau, tuy nhiên các cấu trúc cơ bản như lệnh tuần tự, lệnh rẽ nhánh hay lệnh lặp thường không thay đổi cho hầu hết các ngôn ngữ. Đồ thị được sử dụng phổ biến nhất trong kiểm thử cấu trúc là

đồ thị luồng điều khiển (control flow graph). Đồ thị luồng điều khiển biểu diễn mỗi rẻ nhánh trong chương trình bởi một cung và dãy các lệnh tuần tự hay khối lệnh tuần tự bởi một đỉnh. Một khối lệnh tuần tự (basic block) là một dãy lớn nhất các lệnh trong chương trình sao cho bất kỳ một lệnh nào trong khối được thực thi thì tất cả các lệnh khác trong khối cũng được thực thi. Một khối lệnh tuần tự chỉ có một điểm vào và một điểm ra.

Chúng ta sẽ minh họa việc xây dựng luồng đồ thị điều khiển từ các cấu trúc cơ bản trong ngôn ngữ lập trình C, như cấu trúc rẽ nhánh if-else và switch, cấu trúc lặp

while và for.

Hình 3.13 minh họa lệnh if có phần else và đồ thị luồng điều khiển tương ứng. Đỉnh 𝑛0, biểu diễn điều kiện a > b có nhiều hơn một cung đi ra, được gọi là đỉnh quyết định. Đỉnh 𝑛3, có nhiều hơn một cung đi vào, được gọi là đỉnh hợp.

Tiếp theo, chúng ta minh họa biểu diễn lệnh if không có phần else trong Hình 3.14. Lưu ý rằng đồ thị này chỉ chứa ba đỉnh, nếu điều kiện a > b đúng, tất cảcác đỉnh được bao phủ, nhưng không bao phủ tất cả các cung.

Hình 3.13. Đồ thịđiều khiển biểu diễn lệnh if có phần else

Tương tự như cấu trúc rẽ nhánh if, đồ thị trong Hình 3.15 minh họa biểu diễn cấu trúc switch, tuy nhiên gồm nhiều rẽ nhánh khác nhau.

Đồ thị trong Hình 3.16 minh họa biểu diễn cấu trúc lặp while. Đỉnh 𝑛1 có thể xem là đỉnh biểu diễn điều kiện. Nếu điều kiện a > b đúng, thực hiện cung (𝑛2, 𝑛1), nghĩa là tiếp tục lặp, ngược lại nếu điều kiện sai, kết thúc vòng lặp.

Hình 3.15. Đồ thị luồng điều khiển biểu diễn cấu trúc switch

Hình 3.16. Đồ thị luồng điều khiển biểu diễn cấu trúc lặp while

Cuối cùng, chúng ta minh họa cấu trúc lặp for trong Hình 3.16. Đồ thị luồng điều khiển vòng lặp for cũng tương tự như cho vòng lặp while, tuy nhiên, phải lưu ý biểu diễn việc khởi gán biến đếm và thay đổi giá trị biến đếm.

Một phần của tài liệu Bài giảng kiểm thử phần mềm đh phạm văn đồng (Trang 72 - 76)