測試方法和測試用例設計
用戶需求/原始需求
需求分析/規格說明書(評審過后,將不合理、無法做到的地方去掉以后的說明書)
測試需求(在需求分析的基礎上,以測試團隊的工作計划、方式的需要、工作優先級安排)
主要解決“測什么”的問題,即指明被測對象中什么需要測試。
功能是第一要務,按照測試團隊的工作要求進行計划
在后期交流中,要不斷驗證客戶需求,要保留文檔
對於測試工程師:測試一般划分為功能性測試、非功能性測試
如果沒有需求文檔,先做冒煙測試,對軟件大體有什么功能,進行了解,哪些是功能的重點,有多少功能點,把需求理出來
測試原則:
\1. 所有測試活動應以需求為源頭和驅動
\2. 應盡早地和不斷地進行測試
\3. 完全測試(窮舉測試)是不可能的,數據是無窮無盡的,總有測試不到的數據
\4. 沒有完美的軟件和完美的測試
\5. 應避免僅有程序員自己檢查程序,避免隨意性(避免隨意測試)
\6. 二八定律,把相對多的時間、成本、精力花在重要的模塊、部分
\7. Good enough 不做不充分的測試,也不做過多的測試,找到測試費用和測試量之間平衡點
\8. 一定要有正確和錯誤驗證
1、所有測試活動都應追溯到用戶需求,測試活動應以需求(用戶需求->需求規格說明書)為源頭和驅動
2、應盡早地和不斷地進行軟件測試
3、完全測試(窮舉測試)是不可能的,因為數據本身是無窮無盡的,總有無法測試到的數據、方面。沒有完美的測試和完美的軟件,只有未被發現的缺陷,沒有不存在問題的軟件
4、應充分注意測試中的集群現象:二八定律(把相對多數的時間花在重要的部分)
5、應避免只有程序員自己檢查程序,盡量避免測試的隨意性(即避免隨機測試)
6、測試的Good Enough,不要做不充分的測試,也不做過多的測試,找到測試費用和測試量之間的平衡點,是最佳選擇
制定測試內容和最低測試通過標准加以衡量(必要時具體問題具體分析)
7、兼顧合理的輸入數據、操作對軟件進行測試和不合理的輸入數據、操作對軟件進行測試
8、程序修改后要做回歸測試(不論修改的多少,都要做回歸測試)
測試的完成標准:
-
功能符合需求
-
被測系統所有的功能點都要被覆蓋到(100%覆蓋) 如果某個功能點被測試到了,就說該功能點被覆蓋了(但凡是要交付到下一階段的功能、內容,都必須覆蓋到,所有功能點至少覆蓋一次)
-
被測系統不允許出現嚴重程度為一、二、三級缺陷(致命錯誤、嚴重錯誤、一般錯誤)
-
所有的配置項必須完整(產業鏈的各個項目必須完整)
測試過程中遇到的問題:
不知道是否較全面的測試了所有功能
測試的覆蓋率無法衡量
對新版本的重復測試很難實施
存在大量冗余測試影響測試效率
軟件還未測試之前,就對需求進行設計,實用性要很強
測試用例
測試用例(Test Case)是為了實施測試而向被測試的系統提供的一組集合,這組集合包含:測試環境、操作步驟、測試數據、預期結果等要素。
解決要測什么、怎么測、如何衡量的問題
軟件名、版本、模塊、測試步驟、順序、數據、預期結果(根據需求、設計,對可能的結果進行預測)
//測試用例一般可以划分為:場景測試用例(簡稱“測試用例”)和基本測試用例(給或稱為“工用測試用例”)
定義:集合(測試環境、測試步驟、數據、代碼、預期結果)
解決“測什么,怎么測,如何衡量”
測試是在測試執行之前設計、編寫的文檔/報告,它不一定會發現缺陷
缺陷報告是在測試執行完成之后,發現問題、缺陷的報告
作用:
1、 執行測試的有效依據(文檔而非口頭或主觀)
2、 追溯測試的有效依據(可在做回歸、缺陷分析時查看)
3、 衡量測試工作量的有效數據
4、 衡量測試人員工作量和工作質量的依據
5、 評估測試覆蓋力度的依據(需求中的內容/功能點被測試涉及到了,就說它被覆蓋了,需求/功能點覆蓋100%)
6、 驗證需求和尋找缺陷的重要手段
7、 為新版本或其他項目參考和累積測試經驗
測試用例在什么時候開始
設計人員會根據需求進行設計,只要需求和設計文檔到位,就可以開始編寫測試用例
測試人員的時間周期比開發人員的時間周期長,測試人員早在需求階段就進入測試階段
1、如果需求、設計缺失或不完整,在軟件完成后編寫用例
2、需求、設計完整
熟悉需求、設計之后,在編碼之前或實現過程中設計用例
3、軟件代碼、需求、設計變更后,測試用例需要變更
4、執行用例過程中或執行之后需要適時調整、修改
如何對軟件執行操作動作、步驟?
操作步驟中輸入些什么樣的數據,數據有什么講究,有什么范圍,數據的營造
用合理的方式造出數據
黑盒測試與功能性測試、兼容性測試、自動化測試是平等的
黑盒設計用例的方法:(黑盒測試:以數據為驅動的功能性測試,不關注內部結構)
1、等價類
兩位數加法計數器
需求:兩位數范圍內(-99~99),兩個數求和
兩位數包不包括小數?
衡量成本、時間,評估一下工作量,進行測試
加數1:[-99,99]
加數2:[-99,99]
工作量:199*199=39601
留哪些數據?為什么留這些數據?為什么砍掉其他數據?
等價類(解決了不能窮舉測試的問題/極大的控制了測試成本在可接收范圍內/控制測試用例的數量)
根據用戶需求及其特點和數據本身的特點,將數據划分為有限的若干個類型,從每個類型中的抽取一個具有代表性的數據進行測試
如何利用現有的時間成本,將數據划分到什么地步
有效等價類
無效等價類
等價類1:[-99,99]
等價類2: <-99 因為無法找到小於-99同時大於99的數,因此,無效等價類分
等價類3: > 99 為兩個
划分等價類的方法
1、在連續的數據取值范圍中,至少可以划分三個等價類,其中1個有效等價類[0,100],2個無效等價類(<0)(>100)
有規律的數據,例如奇數、偶數,也可以用等價划分的方法
課堂練習:
微信紅包(0,200]
分析需求特點,邊界值的特點,是否需要取等於
等價類1 0<x<=200
等價類2 x<=0
等價類3 200>x
T0305樣品軟件
需求:一班學生學號[1,40]
各科成績[0,100]
一班學生學號
等價類1 [1,40]
等價類2 <1
等價類3 >40
等價類4 >200
成績
等價類1 [0,100]
等價類2 <0
等價類3 >100
2、輸入條件規定了必須輸入某些數據,至少划分為一個有效等價類、一個無效等價類
3、輸入數據只有兩種可能,true、false/yes、no等,划分為一個有效等價類、一個無效等價類
4、確定一個有效等價類(多個條件都滿足),若干個無效等價類(不滿足長度要求或者不滿足開頭或者不滿足組成,三個無效等價類)
5、在已知等價類的基礎上,根據具體情況再划分
等價類細分的素材 例如:
非數值:
漢字
字母
其他字符
空白
6、規定了輸入數據的一組值,並且對每個輸入值分別處理,划分若干個有效等價類,一個無效等價類
建議盡可能在一個下拉框中,減少輸入選項,可以增加下拉框控件數量
等價類划分步驟:
1、對輸入數據進行分析(結合需求分析,數據本身特點的分析),再划分等價類
考慮輸入數據的數據類型(輸入類型)、數據范圍(輸入長度)
2、為等價類進行編號
3、每個等價類中的數據至少要用一次
9.25回顧
等價類划分方法
1、連續數據取值范圍,可以分為一個有效,兩個無效
2、規定輸入某些無規律的數據取值集合,例如驗證碼,可以分為一個有效,一個無效
3、輸入條件是布爾量true/fales,yes/no,可以分為一個有效,一個無效
4、由多個無關聯的條件共同構成數據范圍,例如Java標識符的命名規則,可以分為一個有效,多個無效
5、在已知等價類基礎上,再進行細分
6、規定了輸入數據是無規律的一組值,並且對每個輸入值分別處理,例如下拉框,可划分為若干個有效,1個無效(除了下拉框中的,其他的都是無效的)
划分等價類標准
完備測試、避免冗余;
子集互不相交:保證無冗余,不會出現多個用例用到相同類型的數據;
所有子集相加即為數據總集(整個集合)。
等價類1 x>99
等價類2 x<-99
-99<=x<=99
等價類3 -99<=x<0
等價類4 x=0 若3和4中都包括0這個取值,那么會造成冗余
等價類5 0<x<=99
邊界值
-99<=x<=99
if(-99<=x&&x<=99)
{
…//正確處理
}
if(x<-99||x>99)
{
…//錯誤處理
}
邊界值是等價類派生出來的方法,只要有數據的取值范圍,就肯定有邊界值
開區間:一個連續的取值范圍,大於最小值,小於最大值,不包括兩個端點
1<x<10 (1,10)
閉區間:一個連續的取值范圍,大於等於最小值,小於等於最大值,包括兩個端點
1<=x<=10 [1,10]
上點:不區分開閉區間,邊界上的點,1和10是上點
若是開區間,上點在域范圍外
若是閉區間,上點在域范圍外
內點:在取值范圍內的任意一點,2,3,4等都是內點
離點:若是開區間,離點是范圍內離上點最近的點,若是閉區間,離點就是范圍外離上點最近的點
開區間(1,10),2和9就是離點,內收,因為1,10是無效值,所以還應取又消失
閉區間[1,10],0和11是離點,外放
邊界值:上點和離點
(49,79):49,79,50,78
(49,79]:49,79,50,80
[49,79):49,79,48,78
回顧上午的知識:
邊界值(等價類的補充/特例)
開區間:不包含最大值和最小值的數據取值范圍 (1,10)
閉區間:包含最大值和最小值的數據取值范圍 [1,10]
上點:邊界上的點,最大值、最小值,不區分開閉區間
內點:取值范圍內的任意一點
離點:區分開閉區間,離上點最近的點
開區間的離點是取值范圍內離上點最近的點,內收,最小值+1個單位,最大值-1個單位,因為上點是無效值,故還應取有效值
閉區間的離點是取值范圍外離上點最近的點,外放,最小值-1個單位,最大值+1個單位,因為上點是有效值,故還應取無效值
4+1理論,2個上點,2個離點,1個內點
6+1理論
[10,100] 邊界值,9,10,100,101
(10,100) 邊界值,10,11,99,100
不管開閉區間,六個邊界值:9,10,11,99,100,101
若已知,開閉區間,會產生冗余,若需求不明確,或團隊技術不高的情況可考慮采用6+1理論
回顧:
等價類的作用:解決不能窮舉測試的問題,極大的控制成本在可接收范圍內
等價類划分(根據需求的特點,數據本身的特點進行划分)
有效等價類:符合需求的數據
無效等價類:不符合需求的數據
等價類划分方法:
1、 連續數據取值范圍,可划分為一個有效,兩個無效
2、 規定輸入的數據是無規律的一組值,並且對每個輸入值分別進行處理,例如下拉框,可划分為若干個有效,一個無效(除了下拉框中的,都是無效的)
等價類缺點:數據值是不准確的,不精確的/數據值的准確性不一樣
邊界值:是等價類的補充,解決數據不准確的缺點
邊界值的優點:數據值的准確性、判斷數據的邊界,解決了數據中極大極小值可能存在的問題
int i;
If(i>=1 && i<=12)
{
System.out.print(i+“月是月份”);//正確處理
}
If(i<1 ||1>12)
{
System.out.print(i+”不是月份”);//錯誤處理
}
等價類、邊界值都是為黑盒測試設計數據的
4+1理論
開區間:包含最大值和最小值的數據取值范圍 (1,12) 1<x<12
1,2,12,13
閉區間:不包含最大值和最小值的數據取值范圍 [1,12] 1<=x<=12
0,1,12,13
上點:邊界上的點,取值范圍的兩個端點
離點:離上點最近的點,在開區間中,離點是取值范圍內離上點最近的點;
在閉區間中,離點是取值范圍外離上點最近的點。
char c;
for(c=0;c<70000;c++)
{
System.out.print(c);
}
代碼可編譯,可運行,結果是死循環,
ping –l 5000 192.168.0.106 向IP地址為192.168.0.106發送字節數為50000的數據包
ping –t 5000 192.168.0.106 不間斷的向IP地址為192.168.0.106發送字節數為32的數據包
ping –l 5000 192.168.0.106 -t 不間斷的向IP地址為192.168.0.106發送字節數為50000的數據包
ping IP地址,向該IP地址發送數據包,數據包字節的取值范圍為[0,65500]
端口號,采用短整型,[0,65536]
數據設計和制造
數據組合:因果圖,正交排列(有較強的局限性)
掌握原理、目的、操作步驟
因果圖:(質量控制,也稱石川圖/魚骨圖/樹杈圖)
輸入的數據(因)
程序結果(果)
先分析因果關系
確定因與因,因與果之間的關系
用例評審標准:
1、100%覆蓋需求、功能、控件
2、執行效率,文字說明不夠清晰、步驟不嚴謹
等價類之間互不相交
將等價類中的數據進行等價分類,將有效等價類和無效等價類划分出來,再將它們進行組合
一個應用程序輸入項目的個數很多,等價類個數偏多,組合更多,人工成本過大
因果圖基本步驟:
1、 在程序中梳理輸入項目,(再根據輸入項目數據的特點)划分等價類(因)
2、 在程序中梳理得出預期結果(果)
3、考慮因之間的關系、產生的結果的組合(石川圖)
4、判定驅動法形成判定表、對判定表進行優化(化簡)
5、判定表的每一列即一條測試用例
解決問題:
分析數據之間組合產生的不同結果,從而設計測試用例/分析因與因之間的組合產生的不同結果,設計測試用例
原因為真,結果必為真
 |
與(並且):兩個原因都為真,結果才為真
或:有一個原因為真,結果就為真
非:原因為假,結果為真
排他性約束:各個原因之間不能同時為真,但可以同時為假
 |
在一個復雜的應用程序中,可以局部的使用因果圖
使用因果圖的方法寫測試用例
1、 門檻相對較高(需要一定需求分析能力)
2、 需要較高的熟練度
3、 成本偏高(規模大、復雜度高)
正交
正交測試目標:
節省工作時間/節省測試用例設計時間,減少人工排列組合的時間
控制測試用例數量
具有比較均衡的覆蓋率
優點:
節省測試用例設計時間,減少人工排列組合的時間
控制測試用例數量
具有比較均衡的覆蓋率
特點:均勻分散、齊整可比(概率相同)
正交表必須滿足這兩個特點,有一條不滿足,就不是正交表:
1、 每列中不同數字(水平)出現的次數相等
2、 在任意兩列,其橫向組成的數字對中,每種數字對出現的次數相等
因素:考察的變量/被測的輸入項/ (外貌、家庭、個人、能力)
水平:因素被考察的值/輸入項中的等價類/控件中的取值范圍、等價類(身高、體重、顏值、背景、經濟、性格、三觀、年齡、經濟、生活)
因素1:水平1、水平2… 每個因素的水平數量相等
因素1:水平1、水平2…
……
Ln(mk) Ln_k_m
n:表的行數,需要測試組合的次數/測試用例的數量
k:表的列數,控件個數/因素的數量
m:每個控件包含的取值個數/水平的數量
正交表的表示形式:L行數(水平數因素數)
L9(34)表示用例數量為9,因素數量為4,每個因素含3個水平
正交表類型
1、完全符合正交表(每個因素的水平相同,且符合正交規律)的整齊排列直接套用現成的正交表
2、部分符合正交表(每個因素的水平相同,但因素或水平無現成的正交表),將因素或水平適當增減向可能的正交表靠攏,如果是減則在正交表基礎上適當人工增加用例
3、非整齊的排列借助正交公式縮減並計算出排列數量,再人工方式在最終的排列數量中按規律排列
正交表公式:N=(p1-1)q1+(p2-1)q2+…+1
p:水平的數量
q:擁有此水平數量的因素個數
N:最后求出的最后結果數量
1:校驗值
a:a1 a2
b:b1 b2
c:c1 c2 c3
d:d1 d2 d3
e:e1 e2 e3 e4 e5 e6
N=(2-1)2+(3-1)2+(6-1)*1+1=12
狀態圖
數據、操作動作
狀態圖的分析使用步驟
-
列出被測系統的輸入事件
-
對空閑狀態(程序剛啟動時的狀態)加所有可能的輸入,判斷產生哪些新狀態
-
對第二步產生的每個新狀態分別加所有可能的輸入
-
對第三步產生的每個新狀態分別加所有可能的輸入
-
對第四步產生的每個新狀態分別加所有可能的輸入
-
直到沒有新狀態產生
在空閑狀態下,單獨進行
第一輪
1、空閑->ip1->人民幣金額已輸入
2、空閑->ip2->國家已選擇
3、空閑->ip3->國家未選擇,人民幣金額未輸入
4、空閑->ip4->空閑
5、空閑->ip5->程序結束,退出
第二輪
1、人民幣金額已輸入->ip1->人民幣金額已輸入
6、人民幣金額已輸入->ip2->國家已選擇,人民幣金額已輸入
7、人民幣金額已輸入->ip3->國家未選擇,人民幣金額已輸入
4、人民幣金額已輸入->ip4->空閑
5、人民幣金額已輸入->ip5->程序結束,退出
第三輪
6、國家已選擇->ip1->國家已選擇,人民幣金額已輸入
2、國家已選擇->ip2->國家已選擇
8、國家已選擇->ip3->國家已選擇,人民幣金額未輸入
4、國家已選擇->ip4->空閑
5、國家已選擇->ip5->程序結束,退出
第四輪
7、國家未選擇,人民幣金額未輸入->ip1->國家未選擇,人民幣金額已輸入
6、國家未選擇,人民幣金額未輸入->ip2->國家已選擇,人民幣金額未輸入
3、國家未選擇,人民幣金額未輸入->ip3->國家未選擇,人民幣金額未輸入
4、國家未選擇,人民幣金額未輸入->ip4->空閑
5、國家未選擇,人民幣金額未輸入->ip5->程序結束,退出
4、國家未選擇,人民幣金額未輸入->ip6->空閑
第五輪
6、國家已選擇,人民幣金額已輸入->ip1->國家已選擇,人民幣金額已輸入
6、國家已選擇,人民幣金額已輸入->ip2->國家已選擇,人民幣金額已輸入
9、國家已選擇,人民幣金額已輸入->ip3->顯示金額
4、國家已選擇,人民幣金額已輸入->ip4->空閑
5、國家已選擇,人民幣金額已輸入->ip5->程序結束,退出
第六輪
7、國家未選擇,人民幣金額已輸入->ip1->國家未選擇,人民幣金額已輸入
6、國家未選擇,人民幣金額已輸入->ip2->國家已選擇,人民幣金額已輸入
7、國家未選擇,人民幣金額已輸入->ip3->國家未選擇,人民幣金額已輸入
4、國家未選擇,人民幣金額已輸入->ip4->空閑
5、國家未選擇,人民幣金額已輸入->ip5->程序結束,退出
7、國家未選擇,人民幣金額已輸入->ip6->國家未選擇,人民幣金額已輸入
第七輪
6、國家已選擇,人民幣金額未輸入->ip1->國家已選擇,人民幣金額已輸入
8、國家已選擇,人民幣金額未輸入->ip2->國家已選擇,人民幣金額未輸入
8、國家已選擇,人民幣金額未輸入->ip3->國家已選擇,人民幣金額未輸入
4、國家已選擇,人民幣金額未輸入->ip4->空閑
5、國家已選擇,人民幣金額未輸入->ip5->程序結束,退出
7、國家已選擇,人民幣金額未輸入->ip6->國家已選擇,人民幣金額未輸入
測試點:給出錯誤提示,點擊確定后,能否繼續正確的完成操作
每種狀態至少訪問一次
被用戶多次使用,常用的模塊、狀態要多次覆蓋
優點
能夠清晰地看出哪些狀態未被覆蓋到
能夠清楚的計算出狀態覆蓋力度
1、思路清晰,要求我們事先做好設計思路,需求分析
2、測試用例的概述、測試點要清晰准確
3、測試步驟簡潔,即別人看你的測試用例是,可以清晰地看到第一步做什么,第二步做什么
4、測試步驟清晰、具體,即不會產生歧義
5、無冗余即測試用例不要重復,每條用例的測試點要不一樣
6、100%覆蓋就是在設計用例時,用戶需求、功能、控件都要涉及到
7、可復用性,即測試用例可反復使用,可執行性高
1、100%覆蓋
2、預期結果是否確定、唯一
3、可執行性,語言描述是否清晰、步驟是否嚴謹
4、對中間、后台的數據的檢查
正確保存,即數據能夠完整、准確的保存到后台,
冗余:
在設計上存在等價類的子集相交(你在划分等價類的時候,就存在交集)
不是為了驗證重復性或業務需求,多條用例的數據步驟完全一樣
多條測試用例不能測試出需求、設計或程序或數據的不同類型和方面
考慮等價類、方法夠不夠
1、 需求點100%覆蓋
2、 被測功能點、控件100%覆蓋
3、 必須有正確數據、正確步驟和坑能導致出錯的數據、步驟
4、 有數據值域的必須考慮數據值域覆蓋:邊界值、等價類
5、 所有邊界值都必須覆蓋
6、 等價類必須包含有效和無效等價類
7、 所有等價類都必須覆蓋(等價類數量過多導致超過測試成本,優先考慮有效等價類,然后根據數據使用頻率、機率高低分優先級,高級優先覆蓋,同時考慮自動化測試)
8、 核心功能點必須被覆蓋多次()
9、 測試用例數量要大於功能點的數量