軟件測試
目的
通過在編寫代碼的整個過程中添加測試的檢測流程,來減少設計失誤、筆誤、以及在程序中表現出來的失誤。
基本概念
PIE模型
錯誤分類
- Fault:程序中的錯誤代碼
- Error:錯誤代碼導致的錯誤狀態
- Failure:錯誤狀態表現出來後被感知
測試能夠發現的錯誤只有Failure級別,即表現出來的錯誤。程序中處於Error和Fault級別的錯誤單靠測試是無法檢測出來。所以這需要開發工程師自己做白盒測試儘量避免Fault的出現。
白盒測試方法
通過白盒測試,希望開發工程師在設計代碼編寫代碼之後,能夠自己證明代碼是無誤的。就像數學題算完之後的檢驗方法一樣。
圖覆蓋
任何代碼都可以用圖的方式表示。在測試的時候,將圖的每一部分跑一遍,看看能不能得到正確結果的方法就是圖覆蓋。
控制流生成
程序的控制流,由工作語句、if、while/for、switch組成。也相當與代碼邏輯的流程圖。
結構化覆蓋
節點覆蓋/邊覆蓋,控制流覆蓋的一部分
主路徑覆蓋
簡單路徑:每個節點在路徑中只出現一次。
主路徑:最長的簡單路徑,不是任何簡單路徑的子集。
生成測試用例,覆蓋所有主路徑。主路徑覆蓋可以減少覆蓋的工作量
基本路徑覆蓋
獨立路徑:路徑中含有其他路徑中不含有的節點或者邊
線性獨立路徑個數:CC=E-V+2(圈複雜度)
基本路徑測試步驟:
- 生成控制流圖
- 計算圈複雜度
- 選擇基本路徑集
- 生成基本路徑測試用例
數據流覆蓋
程序控制流中,點上操作的正確性。變量操作包括:
- 定義:分配內存,賦值、初始化
- 使用:進行操作,判斷等
- 定義引用對:在前面定義,在後面引用
- 定義清晰:前面定義,後面使用之間,沒有被重新定義
- 數據流可達:有一條定義清晰的路徑從i到j
- 定義引用路徑(du-path):從定義到使用的簡單路徑,路徑定義清晰
數據流覆蓋準則
- ADC:全定義覆蓋,所有定義的地方都覆蓋過
- AUC: 全引用覆蓋,所有引用的地方都覆蓋過,包括所有的定義也都覆蓋過
- ADUPC:全部定義引用覆蓋,所有的定義和引用之間的路徑都覆蓋過
邏輯測試
- 判定:每一個條件組爲一個判定,影響控制流
- 條件:每一個布爾單元都是一個條件
- 判定覆蓋:判定爲True和False各執行一遍的覆蓋
- 條件覆蓋:每一個條件爲True和False各執行一遍的覆蓋
- 條件判定覆蓋:同時滿足條件覆蓋和判定覆蓋
- 完全條件覆蓋:所有條件的組合覆蓋,複雜度爲
2n 次 - 修訂條件/判定覆蓋(MC/DC):每一個條件的獨立影響都要執行一次
變異測試
在正常程序中注入Fault之後觀察測試用例是否將Fault檢測出來。用於評估測試用例集的充分性。
變異測試假設:
- 程序員不可能大面積寫錯代碼,只會不小心寫錯小部分代碼
- 如果單一錯誤可以測試到,那麼組合的錯誤就可以被測試到
重要的變異類型:
類型 | 描述 | 集合描述 | 數量 |
---|---|---|---|
ABS | 絕對值 | 2 | |
AOR | 算數運算符 | 20 | |
LCR | 邏輯連接符 | 2 | |
ROR | 關係運算符 | 30 | |
UOI | 一元運算符 | 4 |
等價變異:兩個語法不一樣的程序,語義完全一致。代碼不一樣,但是產生的輸出輸出映射完全一致。
// example 1
for(int i = 0; i != 5; i++){
nop();
}
// example 2
for(int i = 0; i < 5; i++){
nop();
}
故障假設測試
評估測試用例集合的能力。變異測試是故障假設測試的一部分
故障類型:E=(a|b)&c
- 運算符誤用
- ORF:誤用操作數,E’=(a&b)&c
- ENF:誤用表達式,E’=!(a|b)&c
- VNF:誤用否定,E’=(a|b)&!c
- ASF :優先級誤用,E’=a|b&c
- 操作數誤用
- MVF:操作數丟失,E’=(a|b)
- VRF:誤用變量,E’=(a|b)&a
- CCF:E’=(a|b)&(c&a)
- CDF:E’=(a|b)&(c|a)
- SA0:永久爲0,E’=(0|b)&c
- SA1:永久爲1,E’=(1|b)&c
測試條件:異或
黑盒測試方法
希望通過開發工程師自己編寫黑盒測試用例,來增加邏輯思維的嚴謹性。在最開始編寫測試,來讓工程師更好地理解代碼的邏輯。
隨機測試
隨機選取測試用例的測試
等價類劃分
按照一定標準將輸入域劃分成幾個子集,然後在子集中隨機選取測試用例
劃分原則:
- 完備性:所有分類都要被覆蓋
- 無冗餘:兩個等價類中不應該有交集
劃分方法:
- 數據的取值範圍
- 不同數據的控制流和數據流
- 數據合法/非法
- 合法:檢測功能
- 非法:檢測錯誤處理
邊界值分析
添加不同等價類之間的邊界
邊界值相關代碼
- 判斷
- 循環
- 數據最大值/最小值
邊界值分析方法
min < min+ < norm < max- < max
- 選擇正常值norm
- 選取min,min+,max,max-
- 考慮非法輸入:min-,max+
決策表
反映程序輸入與輸出關係的表格。用於檢測輸 入與輸出的關係.
步驟:
- 計算規則數量,
rules=2conditions - 列出動作和條件
- 插入動作行
- 插入條件列
- 化簡,相似規則導致相同結果的條件可以合併
例子:從String中提取浮點數
"Duration: 1000.0000\n"
"Loation: 50.0000"
−符號1000整數.點0000小數
負號 | 整數部分 | 小數點 | 小數部分 | 合法性 |
---|---|---|---|---|
T | F | F | F | F |
T | F | F | T | T |
T | F | T | F | F |
T | F | T | T | T |
T | T | F | F | T |
T | T | F | T | T |
T | T | T | F | T |
F | T | T | T | T |
java代碼
public static float peekFloat(String content) {
if (content == null || content.length() == 0){
return 0;
}
Pattern p = Pattern.compile("-?(\\d+\\.?\\d*|\\.\\d+)");
Matcher m = p.matcher(content);
if (m.find()) {
return Float.valueOf(m.group(0));
} else {
return 0;
}
}
組合測試
考慮不同變量取值之間的組合
方法:
- 兩維組合:所有變量等價類的兩兩組合都出現在測試用例中
- 三維組合:任意變量三個組合都出現在測試用例中
- 完全組合:任意變量的所有組合都在測試用例中
- 可變粒度組合:相關組合被覆蓋
缺省項
輸入變量的默認值進行測試,保證絕大部分用戶的配置可以正確工作
合併輸入變量
將受到約束的變量放在一起考慮
測試進展
測試用例集約簡
測試預言
故障定位
功能測試
探索式測試
性能測試
自動化測試方法
希望利用自動化測試工具,來降低測試的人工成本。另一方面,從測試工具的角度來觀察發現軟件中存在的問題。