南京大學<軟件測試>筆記

軟件測試

目的

通過在編寫代碼的整個過程中添加測試的檢測流程,來減少設計失誤、筆誤、以及在程序中表現出來的失誤。

基本概念

PIE模型

錯誤分類

  • Fault:程序中的錯誤代碼
  • Error:錯誤代碼導致的錯誤狀態
  • Failure:錯誤狀態表現出來後被感知

測試能夠發現的錯誤只有Failure級別,即表現出來的錯誤。程序中處於Error和Fault級別的錯誤單靠測試是無法檢測出來。所以這需要開發工程師自己做白盒測試儘量避免Fault的出現。

白盒測試方法

通過白盒測試,希望開發工程師在設計代碼編寫代碼之後,能夠自己證明代碼是無誤的。就像數學題算完之後的檢驗方法一樣。

圖覆蓋

任何代碼都可以用圖的方式表示。在測試的時候,將圖的每一部分跑一遍,看看能不能得到正確結果的方法就是圖覆蓋。

控制流生成

程序的控制流,由工作語句、if、while/for、switch組成。也相當與代碼邏輯的流程圖。

結構化覆蓋

節點覆蓋/邊覆蓋,控制流覆蓋的一部分

主路徑覆蓋

簡單路徑:每個節點在路徑中只出現一次。

主路徑:最長的簡單路徑,不是任何簡單路徑的子集。

生成測試用例,覆蓋所有主路徑。主路徑覆蓋可以減少覆蓋的工作量

基本路徑覆蓋

獨立路徑:路徑中含有其他路徑中不含有的節點或者邊

線性獨立路徑個數:CC=E-V+2(圈複雜度)

基本路徑測試步驟:

  1. 生成控制流圖
  2. 計算圈複雜度
  3. 選擇基本路徑集
  4. 生成基本路徑測試用例

數據流覆蓋

程序控制流中,點上操作的正確性。變量操作包括:

  • 定義:分配內存,賦值、初始化
  • 使用:進行操作,判斷等
  • 定義引用對:在前面定義,在後面引用
  • 定義清晰:前面定義,後面使用之間,沒有被重新定義
  • 數據流可達:有一條定義清晰的路徑從i到j
  • 定義引用路徑(du-path):從定義到使用的簡單路徑,路徑定義清晰

數據流覆蓋準則

  • ADC:全定義覆蓋,所有定義的地方都覆蓋過
  • AUC: 全引用覆蓋,所有引用的地方都覆蓋過,包括所有的定義也都覆蓋過
  • ADUPC:全部定義引用覆蓋,所有的定義和引用之間的路徑都覆蓋過

邏輯測試

  • 判定:每一個條件組爲一個判定,影響控制流
  • 條件:每一個布爾單元都是一個條件
  • 判定覆蓋:判定爲True和False各執行一遍的覆蓋
  • 條件覆蓋:每一個條件爲True和False各執行一遍的覆蓋
  • 條件判定覆蓋:同時滿足條件覆蓋和判定覆蓋
  • 完全條件覆蓋:所有條件的組合覆蓋,複雜度爲2n
  • 修訂條件/判定覆蓋(MC/DC):每一個條件的獨立影響都要執行一次

變異測試

在正常程序中注入Fault之後觀察測試用例是否將Fault檢測出來。用於評估測試用例集的充分性。

變異測試假設:

  • 程序員不可能大面積寫錯代碼,只會不小心寫錯小部分代碼
  • 如果單一錯誤可以測試到,那麼組合的錯誤就可以被測試到

重要的變異類型:

類型 描述 集合描述 數量
ABS 絕對值 {(e,abs(e)),(e,abs(e))} 2
AOR 算數運算符 {(x,y)x,y{+,,,/,%}xy} 20
LCR 邏輯連接符 {(x,y)x,y{&&,}xy} 2
ROR 關係運算符 {(x,y)x,y{>,,<,,=,}xy} 30
UOI 一元運算符 {(v,v)(v,v),(v,++v),(v,v++)} 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

  1. 選擇正常值norm
  2. 選取min,min+,max,max-
  3. 考慮非法輸入:min-,max+

決策表

反映程序輸入與輸出關係的表格。用於檢測輸 入與輸出的關係.

步驟:

  1. 計算規則數量,rules=2conditions
  2. 列出動作和條件
  3. 插入動作行
  4. 插入條件列
  5. 化簡,相似規則導致相同結果的條件可以合併

例子:從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;
    }
}

組合測試

考慮不同變量取值之間的組合

方法:

  • 兩維組合:所有變量等價類的兩兩組合都出現在測試用例中
  • 三維組合:任意變量三個組合都出現在測試用例中
  • 完全組合:任意變量的所有組合都在測試用例中
  • 可變粒度組合:相關組合被覆蓋

缺省項

輸入變量的默認值進行測試,保證絕大部分用戶的配置可以正確工作

合併輸入變量

將受到約束的變量放在一起考慮

測試進展

測試用例集約簡

測試預言

故障定位

功能測試

探索式測試

性能測試

自動化測試方法

希望利用自動化測試工具,來降低測試的人工成本。另一方面,從測試工具的角度來觀察發現軟件中存在的問題。

GUITAR

Android Instrumentation

Android BDD-Calabash

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章