•Kiểm tra các vòng lặp, các điều kiện trong các mã nguồn có thực hiện đúng không?. •Bước 2: Thiết kế các Test case để bao phủ toàn bộ các Thiết kế các Test case để bao phủ toàn bộ các p
Trang 1White Box Testing
Trang 31/ Khái niệm (tt)
•Kiểm tra xem có các dead code (mã chết) trong mã nguồn hay không? (Sv tự xác định dead code)
•Kiểm tra các kết quả đầu ra có như mong đợi?
•Kiểm tra các vòng lặp, các điều kiện trong các mã nguồn có thực hiện đúng không?
•Xác minh từng dòng hoặc phần của các mục trong
mã nguồn & bao phủ các phân nhánh xử lý
Trang 4Giải thích Dead code:
Dead code (mã chết) là một phần trong mã
nguồn của một chương trình được thực thi nhưng
có kết quả là không bao giờ được sử dụng trong bất
kỳ tính toán khác
Trong khi kết quả của một sự tính toán chết có thể không bao giờ được sử dụng, nó có thể làm tăng lỗi hoặc ảnh hưởng đến tốc độ toàn cục, do đó cần loại bỏ các mã như vậy nhằm thay đổi hiệu năng của chương trình
Trang 5Lệnh là Z = X/Y; không bao giờ được dùng
và còn có khả năng gây lỗi khi Y = 0
Trang 72/ Các kỹ thuật kiểm thử hộp trắng
1 số tài liệu khác
Trang 82/ Các kỹ thuật kiểm thử hộp trắng (tt)
Một hình thức truyền thống của kiểm thử White-box thường trải qua là:
•Bước 1: Tạo 1 đồ thị mô tả luồng điều khiển từ mã nguồn
– Được gọi là đồ thị luồng điều khiển (CFG _ Control Flow Graph)
– Đồ thị được tạo từ mã nguồn thường tạo bằng tay.
•Bước 2: Thiết kế các Test case để bao phủ toàn bộ các Thiết kế các Test case để bao phủ toàn bộ các
phần tử của đồ thị (tùy theo kỹ thuật)
– Phần tử: các nút, cạnh, đường đi (nodes, edges, paths)
Trang 10Ví dụ về Control Flow Graph (CFG)
7 8
Trang 11Các phần tử của CFG
• Có 03 loại nút:
– Nút lệnh: mô tả nút vào, ra, tuần tự
– Nút điều kiện: nút mô tả điều kiện cho 1 nhánh.– Nút hỗ trợ: nút kết nối như IF, …
• Cạnh: biểu diễn các luồng điều khiển
Rất dễ khi tạo đồ thị, nó tương tự như vẽ lưu đồ chương trình (Flow Program)
Trang 12Biểu diễn IF-THEN, IF-THEN-ELSE,
SWITCH
if (c) if (c) switch (c)
// join point else case 2:
// join point // join point
…
Trang 13Biểu diễn vòng lặp (Loop)
Chú ý: Các vòng lặp khác như FOR, DO-WHILE được biểu diễn tương tự.
while (c)
{
…}
…
Trang 15Tạo các khối lệnh (Block statement)
Để đơn giản hóa các mã nguồn lớn có nhiều lệnh, người ta thường tạo CFG bằng các khối lệnh thay vì cho từng lệnh
Khối lệnh là tập hợp các lệnh liên tiếp tuần tự, không có phân nhánh (trừ ở cuối), không chứa vòng lặp
Trang 16Ví dụ:
Trang 17Ví dụ: có 2 xử lý riêng biệt
Trang 18Ví dụ: Khối lệnh If else
Trang 19Ví dụ: Khối lệnh If không có else
Trang 20Ví dụ: Khối lệnh chia nhiều nhánh như switch(), Select case,
Trang 21Ví dụ: Khối lệnh có nhiều cạnh vào, nhiều cạnh ra.
Trang 22Ví dụ: Khối lệnh có nhiều cạnh vào, nhiều cạnh ra.
Trang 23Ví dụ: Khối lệnh
Trang 24Ví dụ: Khối lệnh
Trang 25Ví dụ: Khối lệnh
Trang 262/ Các kỹ thuật kiểm thử hộp trắng (tt)
A/ Statement Coverage
Lệnh là các dòng mã hoặc hướng dẫn cho máy tính hiểu và hành động phù hợp Một lệnh sẽ trở thành một lệnh thực thi khi nó được biên soạn và chuyển đổi thành mã đối tượng và thực hiện các hành động khi chương trình ở chế độ chạy
Do đó ‘Phủ lệnh’, cho thấy đó là phương pháp
chứng thực rằng mỗi dòng mã được thực hiện ít nhất
Trang 272/ Các kỹ thuật kiểm thử hộp trắng (tt)
B/ Branch Coverage
Branch trong NNLT là lệnh 'IF', lệnh có các nhánh:
đúng và sai, hoặc các lệnh chuyển hướng điều khiển trong mã nguồn như switch(), goto, …
Trong phạm vi phủ nhánh (Branch Coverage _ còn gọi là phủ quyết định), chúng ta chứng thực rằng mỗi nhánh được thực hiện ít nhất một lần
Trang 292/ Các kỹ thuật kiểm thử hộp trắng (tt)
C/ Path Coverage
Phủ đường đi là kiểm tra tất cả các đường đi của chương trình Đây là một kỹ thuật toàn diện, đảm bảo rằng tất cả các đường đi của chương trình được
đi qua ít nhất một lần Phủ đường đi thậm chí còn mạnh mẽ hơn phủ nhánh Kỹ thuật này rất hữu ích
để kiểm thử các chương trình phức tạp.Hãy lấy một ví dụ đơn giản để hiểu tất cả các kỹ
Trang 302/ Các kỹ thuật kiểm thử hộp trắng (tt)
1 INPUT A & B
3 IF C>100
Xem xét đoạn mã giả sau (pseudo code):
Trang 31* Đối với Statement Coverage: ta chỉ có một trường hợp kiểm thử để kiểm tra tất cả các dòng m
Xét Test Case_01 với (A = 40 và B = 70), ta thấy tất
Trang 32* Đối với Branch Coverage: ta có thể phủ hết các nhánh, và sẽ đánh giá cả điều kiện "FALSE".
Vì vậy, bây giờ mã giả trở thành:
Trang 33* Đối với Branch Coverage: ta có thể phủ hết các nhánh, và sẽ đánh giá cả điều kiện "FALSE".
Vì vậy, bây giờ mã giả trở thành: (Sv tự vẽ CFG và tạo Test case)
Trang 34Ví dụ về Statement Coverage
Giả sử, chúng ta viết và thực
hiện 2 Test case:
•Test case #1: 1-2-exit (không
bao giờ vào vòng lặp)
7 8
Trang 35• Mục tiêu: bao phủ lệnh (statement coverage)
– Cần các Test case thực hiện bao phủ tất cả các nút trong CFG.
Trang 367 8
Trang 37Ví dụ về Branch Coverage
• Mục tiêu: viết các Test case mà nó bao phủ tất cả các nhánh của các nút điều kiện
– True và False là các nhánh của IF
– Có 2 nhánh tương ứng với điều kiện của vòng lặp
– Tất cả các trường hợp của lệnh SWITCH
Trang 38Ví dụ về Branch Coverage
Nhận xét:
•Statement coverage không bao hàm branch coverage
•Kinh nghiệm cho thấy rằng có nhiều lỗi xảy
ra tại nút quyết định (ví dụ rẽ nhánh, chuyển điều khiển, )
Trang 39cạnh, N: số nút).
Trang 407 8
Trang 41Ví dụ về Path Coverage
Trang 42Kinh nghiệm
• Làm thế nào chúng ta có thể chọn các đường đi bao phủ 100% các nhánh?
• Có thể không có con đường nào đi từ Start
End, vì vậy cần phải chọn nhiều con đường đi khác nhau để bao phủ tất cả các nhánh, các nút
Trang 43• Thường xảy ra nhiều lỗi trong vòng lặp với điều
kiện / giá trị tại biên vậy cần có sự kết hợp.
• Kiểm thử vòng lặp tập trung vào kiểm chứng tính
Trang 453/ Kiểm thử vòng lặp
Giả sử min là số lần lặp tối thiểu, max là số lần lặp đối đa của vòng lặp Cần viết các Test case sau: (5 test case)
•1 test case thực hiện lặp min lần, 1 test case thực
Trang 46Vòng lặp lồng nhau (Nested Loops)
thay hình khác
Outer loop
Trang 47Vòng lặp lồng nhau (Nested Loops)
Đối với vòng lặp lồng nhau, cho mỗi lần lặp của vòng lặp bên ngoài _ Outer loop, chúng ta có một số lần lặp của vòng lặp bên trong Inner loop:
•Thực hiện kiểm thử từ trong ra ngoài (bắt đầu từ vòng lặp trong nhất)
Trang 48Vẽ CFG cho các Source code sau
Trang 49Vẽ CFG cho các Source code sau
4
Trang 50Vẽ CFG cho các Source code sau
Trang 51Vẽ CFG cho các Source code sau
4
3 4,5
6
Jo in
9
7,8 1,2
Trang 54Vòng lặp lồng nhau (Nested Loops)
• Giả sử: Có 3 vòng lặp lồng nhau và 5 test case cho mỗi mức, tổng số các kết hợp có thể là 125 test case vậy là quá nhiều!
• Bắt đầu với vòng lặp trong cùng, thực hiện (m, m-1,
typical) test case và tương tự cho các vòng lặp khác với số min của nó.
• Tiếp tục ra bên ngoài cho mỗi vòng lặp, thực hiện
kiểm thử (m, m+1, typical, ) test case
– Vòng lặp trong với typical test case.
– Vòng lặp ngoài với min test case.