軟體測試的覆蓋準則
假設
假設這是我們今天要測試的程式。
INPUT A,B,X
IF (A>1) AND (B=0) THEN Y=A
IF (A=2) OR (X>1) THEN Y=X
PRINT Y
流程圖
%%{init: {'theme':'dark'}}%%
flowchart TD
A(程式開始) --> B{A>1 and B=0}
B -->|True| D(Y=A)
B -->|False| E{A=2 or x>1}
D --> E{A=2 or x>1}
E{A=2 or x>1} --> |False| G(程式結束)
E{A=2 or x>1} -->|True| F(Y=X)
F(Y=X) --> G(程式結束);
敘述覆蓋(Statements Coverage)
每條指令測試時都要執行一次,可以想像成每行都要執行一次。
輸入值為(A,B,X)=(2,0,3)
每一行程式都會被涵蓋到,但是不一定能挑出錯誤,也不一定能檢查每一個條件。
%%{init: {'theme':'dark'}}%%
flowchart TD
A(程式開始) --> B{A>1 and B=0}
B -->|True| D(Y=A)
B -->|False| E{A=2 or x>1}
D --> E{A=2 or x>1}
E{A=2 or x>1} --> |False| G(程式結束)
E{A=2 or x>1} -->|True| F(Y=X)
F(Y=X) --> G(程式結束)
linkStyle 0,1,3,5,6 stroke:red
style B fill:darkred
style D fill:darkred
style E fill:darkred
style F fill:darkred
這屬於最弱邏輯涵蓋準則,白箱測試至少要完成到此。
分支決策覆蓋(Branches/Decision Coverage)
測試案例要使程式每一決策分支至少執行一次。
也就是遇到每個IF時,至少要跑出一次If與Else。
但是不要求,If(…)括弧內的布林組合例如if(A>1 and B=0)內的所有組合都被跑過一遍。
如果我們輸入(3,0,3)與(3,1,1)
輸入為(3,0,3)
%%{init: {'theme':'dark'}}%%
flowchart TD
A(程式開始) --> B{A>1 and B=0}
B -->|True| D(Y=A)
B -->|False| E{A=2 or x>1}
D --> E{A=2 or x>1}
E{A=2 or x>1} --> |False| G(程式結束)
E{A=2 or x>1} -->|True| F(Y=X)
F(Y=X) --> G(程式結束);
linkStyle 0,1,3,5,6 stroke:darkgreen
style B fill:darkgreen
style D fill:darkgreen
style E fill:darkgreen
style F fill:darkgreen
輸入為(3,1,1)
%%{init: {'theme':'dark'}}%%
flowchart TD
A(程式開始) --> B{A>1 and B=0}
B -->|True| D(Y=A)
B -->|False| E{A=2 or x>1}
D --> E{A=2 or x>1}
E{A=2 or x>1} --> |False| G(程式結束)
E{A=2 or x>1} --> |True|F(Y=X)
F(Y=X) --> G(程式結束);
linkStyle 0,2,4 stroke:darkorange
style B fill:darkorange
style E fill:darkorange
條件覆蓋(Condition Coverage)
所有邏輯判斷情況都至少執行過一次,或者說所有的If括弧內的真假至少執行一次。
輸入值(2,0,3)
第一個條件,A>1 and B=0都被檢查,並且都是符合的。
A=2 or x>1也都被檢查為是。
每個If或是其他判斷理的每個條件是否被檢查,會是條件覆蓋(Condition Coverage)的判斷標準。
%%{init: {'theme':'dark'}}%%
flowchart TD
A(程式開始) --> B{A>1 and B=0}
B -->|True| D(Y=A)
B -->|False| E{A=2 or x>1}
D --> E{A=2 or x>1}
E{A=2 or x>1} --> |False| G(程式結束)
E{A=2 or x>1} -->|True| F(Y=X)
F(Y=X) --> G(程式結束);
linkStyle 0,1,3,5,6 stroke:darkblue
style B fill:darkblue
style E fill:darkblue
style F fill:darkblue
style D fill:darkblue
輸入值(1,1,1)
第一個條件,A>1 and B=0都被檢查,並且答案都為否。
A=2 or x>1也都被檢查為否。
每個If或是其他判斷理的每個條件是否被檢查,會是條件覆蓋(Condition Coverage)的判斷標準。
%%{init: {'theme':'dark'}}%%
flowchart TD
A(程式開始) --> B{A>1 and B=0}
B -->|True| D(Y=A)
B -->|False| E{A=2 or x>1}
D --> E{A=2 or x>1}
E{A=2 or x>1} --> |False| G(程式結束)
E{A=2 or x>1} -->|True| F(Y=X)
F(Y=X) --> G(程式結束);
linkStyle 0,2,4 stroke:darkorange
style B fill:darkorange
style E fill:darkorange
多重條件組合覆蓋(Multiple-condition Combination Coverage)
不同組合的判斷情況都至少被執行一次
輸入組合(2,0,4)(2,1,1)(1,0,2)(1,1,1)
所有條件組合都被涵蓋
%%{init: {'theme':'dark'}}%%
flowchart TD
A(程式開始) --> B{A>1 and B=0}
B -->|True| D(Y=A)
B -->|False| E{A=2 or x>1}
D --> E{A=2 or x>1}
E{A=2 or x>1} --> |False| G(程式結束)
E{A=2 or x>1} --> |True|F(Y=X)
F(Y=X) --> G(程式結束)
linkStyle 0,1,2,3,4,5,6 stroke:red
style A fill:darkred
style B fill:darkred
style D fill:darkred
style E fill:darkred
style F fill:darkred
全面路徑覆蓋(All-Paths Coverage)
測試案例要使軟體每一路徑至少執行一次,而且每個判斷If(…),While(…),Switch(…)/case裡頭的所有可能性與布林值組合都會被涵蓋。
測試覆蓋的層次
All path是最完整的覆蓋,而Statement Path則是比較簡單的覆蓋。
%%{init: {'theme':'dark'}}%%
graph TD
A[Statement Path] --> B[Branch Path]
A[Statement Path] --> C[Condition Path]
B --> D[Multi-condition-combination Path]
C --> D[Multi-condition-combination Path]
D[Multi-condition-combination Path]-->E[All Path]
style A fill:red
style B fill:darkorange
style C fill:darkorange
style D fill:darkred
style E fill:green