Kim th v m bo cht lng phn
Kiểm thử và đảm bảo chất lượng phần mềm Kiểm thử cấu trúc 1
Tổng quan • Kiểm thử cấu trúc – Giới thiệu – Kiểm thử luồng điều khiển • • DD-Paths Test Coverage Metrics Basis Path Testing Guidelines and Observations – Kiểm thử luồng dữ liệu – Phương pháp lai & Thảo luận 2
Kiểm thử cấu trúc • Tiếng Anh có thể gọi với các tên: glass box, structural, clear box and open box testing. • Tiếng Việt còn gọi là kiểm thử hộp trắng • Là kỹ thuật kiểm thử dựa trong đó tri thức tường minh về hoạt động bên trong của phần mềm được dùng để xây dựng các ca kiểm thử • Kiểm thử hộp trắng dựa trên mã nguồn để xây dựng các ca kiểm thử và kiểm tra đầu ra. 3
Kiểm thử cấu trúc • Kiểm thử cấu trúc dựa trên: – Các định nghĩa chặt chẽ liên quan đến ngữ nghĩa của ngôn ngữ lập trình • Luồng điều khiển, luồng dữ liệu, mục tiêu, tiêu chuẩn bao phủ – Phân tích toán học • Phân tích đồ thị, đường đi – Các phép đo chính xác • Bao phủ 4
Định nghĩa đồ thị chương trình “Cho một chương trình trong ngôn ngữ mệnh lệnh, đồ thị chương trình của nó là một đồ thị có nhãn, có hướng trong đó - Đỉnh là các nhóm lệnh hoặc một phần của một lệnh - Cạnh là luồng điều khiển” 5
Đồ thị chương trình • Nếu i và j là hai đỉnh thì có một cạnh từ i đến j trong đồ thị chương trình nếu và chỉ nếu lệnh ở đỉnh j có thể chạy ngay sau (các) lệnh ở đỉnh i. • Nhóm các lệnh tạo thành một đỉnh trong đồ thị chương trình gọi là khối cơ bản. • Dễ dàng xây dựng các khối cơ bản và tạo đồ thị chương trình 6
Ví dụ các khối cơ bản Find. Mean (FILE Score. File) { float Sum. Of. Scores = 0. 0; int Number. Of. Scores = 0; 1 float Mean=0. 0; float Score; Read(Score. File, Score); 2 while (! EOF(Score. File) { 3 if (Score > 0. 0 ) { Sum. Of. Scores = Sum. Of. Scores + Score; Number. Of. Scores++; } 5 Read(Score. File, Score); } /* Compute the mean and print the result */ 7 if (Number. Of. Scores > 0) { Mean = Sum. Of. Scores / Number. Of. Scores; printf(“ The mean score is %fn”, Mean); } else printf (“No scores found in filen”); } 4 6 8 9 7
Đồ thị chương trình 9
Đồ thị chương trình và đường đi? 1. 2. 3. 4. 5. 6. 7. x = z+5 z = 4*3 - y if(x > z) goto A; for( u=0; u < x; u++) { z = z+1; }; A: y = z + k 10
Các đường kiểm thử V( G) = 3 1 1. 2. 3. 4. x = z+5 z = 4*3 - y if(x > z) goto A; for( u=0; u < x; u++) { 5. z = z+1; 6. }; 7. A: y = z + k Basis set: 1, 2, 3, 4, 6, 7 1, 2, 3, 4, 5, 4, 6, 7 1, 2, 6, 7 x = z+5 z = 4*3 -y x>z R 1 2 t 6 f R 2 3 5 z = z+1 u++ t R 3 u=0 4 y = z+k f 7 u<x Ví dụ về đồ thị và đường kiểm thử 11
Đường đi đồ thị chương trình Xét đồ thị chương trình sau: 12
Đường đi - DD (1) • Dạng phổ biến nhất trong kiểm thử cấu trúc được dựa trên đường đi quyết định-đến-quyết định (decision-to-decision) • Đường đi DD là một dãy của đồ thị chương trình trong đó • Một dãy là một đường đi với đỉnh đầu khác đỉnh cuối/kết thúc – Mọi đỉnh trung gian có bậc vào và bậc ra bằng 1 – indegree = 1 và outdegree = 1. • Ví dụ một dãy Đỉnh đầu Đỉnh giữa Đỉnh cuối 13
Đường đi DD (2) • Chính xác hơn đường đi DD là dãy trong đồ thị chương trình thỏa mãn: – Loại 1: đỉnh đơn với bậc vào bằng 0 – Loại 2: đỉnh đơn với bậc ra bằng 0 – Loại 3: đỉnh đơn với bậc vào lớn hơn 1 hoặc bậc ra lớn hơn 1 – Loại 4: đỉnh đơn với bậc vào bằng bậc ra và bằng 1 – Loại 5: dãy với chiều dài lớn hơn 0 14
Đường đi DD của ví dụ Các đỉnh đồ thị Tên đường đi DD Trường hợp 4 first 1 5 -8 A 5 9 B 4 10 C 4 11 D 3 12 -14 E 5 15 F 4 16 G 3 17 H 4 18 I 3 19 J 4 20 K 3 21 L 4 22 last 2 15
Đồ thị đường đi DD • Đồ thị đường đi DD của một chương trình trong ngôn ngữ mệnh là đồ thị có nhãn có hướng mà các đỉnh là các đường đi DD và các cạnh là luồng điều khiển giữa các đường đi DD kế tiếp • Đường đi DD bản chất là một đồ thị thu gọn 16
Đồ thị chương trình – Bảng – Đồ thị đường đi DD Các đỉnh Tên đường đi DD Loại 4 first 1 5 -8 A 5 9 B 4 10 C 4 11 D 3 12 -14 E 5 15 F 4 16 G 3 17 H 4 18 I 3 19 J 4 20 K 3 21 L 4 22 last 2 first A B E C D G F I H L K J last 17
Độ đo bao phủ • Độ đo bao phủ là dụng cụ để đo mức độ bộ kiểm thử phủ (cover) chương trình đến đâu • Chúng giúp ra xác định ca kiểm thử thừa và thiếu khi các đường đi DD được dùng để kiểm thử các khía cạnh khác nhau của chương trình – Các đường đi DD cho phép mô tả chính xác bao phủ kiểm thử 18
Ví dụ 1 2 3 4 5 6 7 8 9 10 11 12 PROGRAM maxsum(maxint, value: INT) INT result: =0; i: =0; IF value < 0 THEN value: = - value; WHILE (i<value) AND (result <= maxint) DO i: = i+1; Result : = result + 1; OD; IF result <= maxint THEN OUTPUT(result) ELSE OUTPUT(“too large”) END 19
Một số độ đo bao phủ kiểm thử Độ đo Mô tả C 0 Tất cả các lệnh C 1 Tất cả các đường đi DD C 1 P Từng kết quả của mọi mệnh đề (điều kiện) C 2 C 1 + bao phủ vòng lặp Cd C 1 + mọi cặp phụ thuộc đường đi DD CMCC Bao phủ các điều kiện phức Ci k Mọi đường đi với tối đa k lần lặp của một vòng lặp (thường k=2) Cstat Phần đường đi “đáng kể về thống kê” C∞ Mọi đường đi có thể 20
Kiểm thử bao phủ dòng lệnh và điều kiện • Kiểm thử dựa trên bao phủ dòng lệnh nhắm đến các ca kiểm thử để chúng chạy qua tất cả các lệnh của chương trình • Bao phủ điều kiện (nhánh) sẽ có hai ca kiểm thử, một cho điều kiện trở thành True và một cho điều kiện trở thành False – Đi qua mọi cạnh của đồ thị đường đi DD • Ví dụ với đoạn chương trình if (A or B) then C • Hai ca kiểm thử sau đủ để bao phủ nhánh: – A=True, B= False (trường hợp True), và – A=False, B=False (trường hợp False). • Chú ý nếu chương trình có sai sót, viết thành if (A) then C • Thì chúng ta sẽ không phát hiện ra lỗi 21
Bao phủ cạnh đồ thị đường đi DD và C 1 1 Bao phủ này vẫn yếu, ví dụ chỉ cần hai ca kiểm thử đi theo T, T và F, F là đủ bao phủ các cạnh, và bao phủ điều kiện/nhánh C 1 2 T P 1 F T P 2 F 22
C 1 P • Tương tự C 1 nhưng các ca kiểm thử phải thực hiện mọi cặp T, T, T, F, F cho P 1 và P 2. T P 1 F T P 2 F 23
Kiểm thử bao phủ điều kiện phức MCDC • Nếu P 1 là mệnh đề phức (tức là (A or B)) thì MCDC đòi hỏi mệnh đề nguyên tử được kiểm tra với True và False • Ví dụ: “if (A or B)” sẽ cần 4 ca kiểm thử để: A = True, B = True A = True, B = False A = False, B = True A = False, B = False • Nếu có n điều kiện, sẽ cần 2 n ca kiểm thử, đây là vấn đề vì số ca kiểm thử tăng theo hàm mũ. 24
Kiểm thử đường đi cơ bản • Chúng ta có thể áp dụng độ phức tạp Cyclomatic của Mc. Cabe’s để xác định số ca kiểm thử tối đa để đảm bảo bao phủ các cạnh • Trên thực tế, “cận dưới” thường được áp dụng khi có vòng lặp. 25
Lý do kiểm thử đường đi cơ sở • Nếu ta coi các đường đi của một đồ thị chương trình (hoặc đồ thị DD) tạo thành một không gian vec-tơ V, chúng ta thường muốn rút ra một tập con của V, giả sử là B, mà B vẫn có đầy đủ bản chất của V. – Tức là mọi phần tử của V đều có thể được biểu diễn tuyến tính qua các phần tử của B – Cộng hai đường đi là nối chúng với nhau, nhân đường đi với một số biểu diễn số vòng lặp • Nếu không gian B như vậy chứa các đường đi độc lập tuyến tính và nó tạo thành cơ sơ của V thì nó sẽ có đầy đủ bản chất của V 26
Thuật toán Mc. Cabe để xác định đường đi cơ sở 1. Chọn đường cơ sở tương ứng với một đường đi bình thường của chương trình, từ đỉnh đầu đến đỉnh cuối và đi qua càng nhiều đỉnh quyết định càng tốt. 2. Lần ngược lại đường đi và đảo điều kiện đường đi từng cái một. 3. Lặp lại quá trình đến khi đã đảo hết các đỉnh quyết định. • Mục tiêu là sinh các ca kiểm thử để đi qua các đường đi “cơ sở” này. 27
Ví dụ V( G) = 3 1 Basis set: 1, 2, 3, 4, 6, 7 1, 2, 3, 4, 5, 4, 6, 7 1, 2, 6, 7 x = z+5 z = 4*3 -y if(x > z) goto A; for( u=0; u < x; u++) { z = z+1; }; A: y = z + k z = z+1 u++ x = z+5 z = 4*3 -y x>z 2 t 6 f R 1 R 2 3 5 t R 3 u=0 4 y = z+k f 7 u<x 28
Ví dụ Procedure Validate_Pin(Validate_Pin, Return_Code) Validate_pin = FALSE Return_Code = GOOD Pin_Count = 0 do until Valid_Pin = TRUE or Pin_Count>2 or Return_Code = CANCEL begin get_Pin_Number(Pin_Number, Return_Code) if (Return_Code = CANCEL) begin call Validate_Pin_Number(Pin_Number, Valid_Pin) if (Valid_Pin = FALSE) then begin output “Invalid PIN, please re-enter PIN” Pin_Count = Pin_Count + 1 end end return(Valid_Pin, Return_Code) 29
Ví dụ % macro Euclid 0 data _null_; retain m &m n &n 1 if (n>m) then do; 2 r = m; 3 m = n; 4 n = r; 5 end; 6 r = mod(m, n); 7 do while (r ne o); 8 m = n; 9 n = r; 10 r = mod(m, n); 11 end; 12 put n=; 13 run; 30
- Slides: 30