## 一.什么是黑盒測試?
黑盒測試:其實是測試中把我們的被測軟件或者系統看成一個不能打開的盒子,在完全不考慮程序內部結構和內部特性的情況下,通過相關暴露出來的[**接口**]程序進行測試。
黑盒測試只檢查程序的功能是否按照我們的需求規格說明的規定,能正常的使用;能夠有正確的輸入輸出信息。著眼于程序的外部結構,不考慮程序的內部的邏輯。
一般來說關注對軟件的界面和可見的功能。從用戶的視角,通過不同的數據或者事件驅動系統,通過輸出結果進行判斷。
## 二.黑盒測試的優缺點?
A.優點:
1.容易實施,不需要關注內部實現
2.更貼近用戶的實用角度
B.缺點:
1.測試覆蓋率較低,一般只能覆蓋到代碼的40%
2.針對黑盒的自動化測試,復用率較低,維護成本較高。
一般我們的軟件產品在研發迭代過程中,容易變化的是功能。所以說特別是界面UI的產品,或者[**互聯網**]的產品非常頻繁的變化,搞個活動,明天搞個升級,變化非常快。所以針對功能的自動化測試,[**測試用例**]重復的利用率較低,功能頻繁變,腳本的維護成本代價相對比較大。
## 三.黑盒測試主要測試什么?
1.是否有不正確的或遺漏的功能?
2.在接口上,輸入是否能正確的接受?能否輸出正確的結果?
3.是否有數據結構錯誤或者外部信息(例如數據文件)訪問錯誤?
4.性能上是否能滿足要求?
## 四.黑盒測試的主要設計方法?
我們在寫測試用例的時候,要圍繞需求要點,考慮用戶不同的復雜場景;用下圖的設計測試用例方法,盡可能細致的寫出用例。常見的用例設計方法如下圖:

## 五.常見的測試方法
### 等價類劃分法:
?計算器:到底輸入幾組數據才算測試完畢?(討論課題)
?答案:一個一個測試效率低下,一定要分類測試!
?1、整數(在范圍內的整數\-99到99)取最大、最小、中間
?2、小數(在范圍內的整數\-99到99)
?3、符號(+-/\*,。、!@#¥%……&\*())
?5、漢字
?6、空格
?7、不輸入
通過上面的描述,我們發現我們用戶所有可能輸入的數據,劃分成了若干份(或者也可以稱為子集),然后從每一個子集當中選取少數具有代表性的數據作為測試用例,這種測試用例我們稱為“等價類劃分法”。
#### 定義
等價類劃分是一種重要的、常用的黑盒測試方法,不需要考慮程序的內部結構,只需要考慮程序的輸入規格即可。它將不能窮舉的測試過程進行合理分類,從而保證設計出來的測試用例具有完整性和代表性。
【注意】:在有限的測試資源的情況下,用少量有代表性的數據得到比較好的測試效果。
#### 等價類的分類
有效等價類
指符合《需求規格說明書》,輸入合理的數據集合
無效等價類
指不符合《需求規格說明書》,輸入不合理的數據集合
#### 等價類思考步驟
1、先確定有效和無效等價類
2、有效等價類就是題目條件(兩端的極值(邊界值)要判斷、中間隨意一個值也要判斷)
3、無效等價類先劃分與條件相反的情況,再找到特殊情況(中文、英文、符號、空格、空)
?我們可以把 “有效等價”和“無效等價”用例寫在一個Excel表格中(寫出來永遠比自己腦子里想要好)!
?例:計算 1---100的整數之和(包括1和100)

?一般是一個框輸入正確的值,一個框輸入錯誤的值,沒有兩個框都輸入錯誤的值,因為更容易確定到底是哪個框出現錯誤的值。
#### 等價類分類強化練習
測試要求是:測試QQ賬號,賬號的要求是 6---10位正整數。

有效的等價類:
1:長度在6—10位之間的整數
無效等價類:
1:長度小于6
2:長度大于10.
3:負數
4:小數
5:英文字母
6:中文
7:空格
8:特殊字符
#### 等價類分類強化練習
某城市電話號碼由三部分組成,分別是
地區碼:空白或是3位數字
前綴:非‘0’且非‘1’開頭的三位數字
后綴:4位數字
例子:1232341234
#### 等價類分類總結
通過上面的案例,我們可以總結一下,當我們在測試文本框
的程序可以考慮如下的情況:
1:文本框要求輸入的長度
2:輸入的類型
3:組成規則
4:是否為空
5:是否重復---區分大小寫,
6:是否去除空格
### **邊界值分析法:**
#### 什么是邊界?
邊界是指對于輸入等價類和輸出等價類而言,稍高于其邊界值及稍低于其邊界值的一些特定情況。邊界值分析法也是一種常用的黑盒測試方法。
注意: 大量的錯誤是發生在輸入或輸出范圍的邊界上,而不是在輸入范圍的內部。
**上點**:是指邊界上的點,無論此時的域是開區間還是閉區間,開區間的話,上點就是在域外,閉區間的話,上點就是在域內。
**離點**:是指離上點最近的點,這里就跟是閉區間還是開區間就有關系了,**如果是開區間,那么離點就在域內,如果是閉區間,那么離點就在域外**。
**內點**:域內的任意點都是內點。
題目:輸入的參數值必須大于0同時小于100的整數,邊界條件設置錯誤:把>寫成了>=,把<寫成了<=

【注意】
有效數據和無效數據的分界點,往往作為程序員編寫程序的判斷點,是程序員容易犯錯誤的地方,也是測試人員重點測試的內容。
?如何解決這類問題
–找到測試數據的邊界點,也就是有效等價類和無效等價類的邊界點,對邊界點數據專門進行測試。
–一般情況下,需要對邊界值(0和100)以及邊界值兩邊的數(\-1和1以及101和99)分別進行測試。
題目:輸入的參數值必須大于等于0同時小于等于100的整數
正確代碼:
num>-1或num>=0 num<101或num<=100
錯誤代碼:
num>=-1或num>0或num>=1 num<=101或num<100或num<=99
選中了\-1 選中了1 選中了101 選中了99

?確定邊界情況(輸入或輸出等價類的邊界)
?選取正好等于、剛剛好大于或剛剛好小于邊界值作為測試數據
?邊界值的取值依據輸入范圍區間不同而有所不同,但是都需要把上點值、離點值和內點值取到。(閉兩邊、開中間)

#### 邊界值方法練習
?練習1:使用邊界值的方法設計添加標題的測試用例
標題長度\>0 標題長度<=30

?練習2:
輸入一個學生成績n,判斷是否及格(0到100整數);
– (1)畫流程圖;
– (2)確定有效區域和無效區域;
– (3)臨界點:0、60、100;
– (4)取值:-1、0、1、59、60、61、99、100、101;
– (5)具體測試用例;


?練習3:
修改手機銀行登錄密碼:
密碼必須由字母與數字組合
密碼長度在8~24之間(包含8和24)

#### 邊界值的方法小結
?1、如果輸入條件規定了值得范圍,則應取剛到到這個范圍的邊界值,以及剛剛超越這個范圍邊界的值作為輸入數據。
–兩位整數加法器數的范圍為\-99—99,則應測試\-99,\-100和99,100
?2、輸入條件規定了值得個數
–姓名要求1—20個字符,需要測試0、1、2個字符和19、20、21個字符
–某商品信息查詢系統,每頁最多顯示10條商品信息,我們就應該準備商品信息,使能夠查詢出9、10條、11條、1條、0條商品記錄
–邊界值和等價類區別:邊界值分析不是從某等價類中隨便挑一個作為代表,而是這個等價類的每個邊界都要作為測試條件
#### 常見邊界值
?文本框接收字符個數,比如用戶名長度,密碼長度等;
?報表的第1行和最后1行;
?數值元素的第1個和最后1個;
?循環的第1次、2次和倒數第1次、2次。
### **錯誤推測法:**
定義:基于經驗和直覺推測程序中所有可能存在的各種錯誤, 從而有針對性的設計測試用例的方法。列舉出程序中所有可能有的錯誤和容易發生錯誤的特殊情況
### 因果圖法:
?因果圖法是一種利用圖解法分析輸入的各種組合情況,從而設計測試用例的方法,它適合于檢查程序輸入條件的各種組合情況
?特點:
–考慮輸入條件的相互制約及組合關系
–考慮輸出條件對輸入條件的依賴關系
–等價類劃分法和邊界值分析方法都是著重考慮輸入條件,但沒有考慮輸入條件的各種組合、輸入條件之間的相互制約關系。這樣雖然各種輸入條件可能出錯的情況已經測試到了,但多個輸入條件組合起來可能出錯的情況卻被忽視了。
–如果在測試時必須考慮輸入條件的各種組合,則可能的組合數目將是天文數字,因此必須考慮采用一種適合于描述多種條件的組合、相應產生多個動作的形式來進行測試用例的設計,這就需要利用因果圖(邏輯模型)。
?因果圖法比較適合輸入條件比較多的情況,測試所有的輸入條件的排列組合。所謂的原因就是輸入,所謂的結果就是輸出。
–因果圖的“因”——輸入條件
–因果圖的“果”——輸出結果
?因果圖法要注意考慮:
–所有輸入/輸出條件的相互制約關系以及組合關系
–輸出結果對輸入條件的依賴關系,也就是什么樣的輸入組合會產生怎樣的輸出結果,即“因果關系”
?通常在因果圖中用Ci表示原因,用Ei表示結果,各結點表示狀態,可取值“0”或“1”。“0”表示某狀態不出現,“1”表示某狀態出現。




#### 利用因果圖導出測試用例需要經過以下幾個步驟:
–① 找出所有的原因,原因即輸入條件或輸入條件的等價類。
–② 找出所有的結果,結果即輸出條件。
–③ 明確所有輸入條件之間的制約關系以及組合關系。
?哪些條件不能組合到一起,哪些條件可以組合到一起
–④ 明確所有輸出條件之間的制約關系以及組合關系。
?哪些輸出結果不能同時輸出,哪些輸出結果可以同時輸出
–⑤ 找出什么樣的輸入條件組合會產生哪種輸出結果
–⑥ 把因果圖轉換成判定表/決策表。
–⑦ 為判定表/決策表中的每一列表示的情況設計測試用例。
#### 案例:交通一卡通自動充值軟件系統需求

–系統只接收50或100元紙幣,一次只能使用一張紙幣,一次充值金額只能為50元或100元。
–若輸入50元紙幣,并選擇充值50元,完成充值后退卡,提示充值成功;
–若輸入50元紙幣,并選擇充值100元,提示輸入金額不足,并退回50元;
–若輸入100元紙幣,并選擇充值50元,完成充值后退卡,提示充值成功,找零50元;
–若輸入100元紙幣,并選擇充值100元,完成充值后退卡,提示充值成功;
–若輸入紙幣后在規定時間內不選擇充值按鈕,退回輸入的紙幣,并提示錯誤;
–若選擇充值按鈕后不輸入紙幣,提示錯誤



根據因果圖再制作出對應的“表格”

注意:一個圖中標識出一個測試用例的情況,因為畫在一起根本無法分辨。

根據因果圖再制作出對應的“表格”

注意:一個圖中標識出一個測試用例的情況,因為畫在一起根本無法分辨。

根據因果圖再制作出對應的“表格”

### 判斷表驅動法:
?因果圖只是一種輔助工具,通過分析最終得到判定表,再通過判定表編寫測試用例。但有時畫因果圖非常麻煩,影響測試效率,可以直接寫判定表,進而編寫測試用例。
?判定表的組成
–條件樁:問題的所有條件
–動作樁:問題的所有輸出
–條件項:針對條件樁的取值
–動作項:條件項的各種取值情況下的輸出結果
?1、列出所有的條件樁和動作樁。
?2、填入條件項。
?3、填入動作項。得到初始判定表。
?4、簡化判定表(合并相似規則(相同動作))
?怎樣稱為一個好學生?遵紀守法的前提下,學習成績好是一個好學生、品德高尚也是一個好學生;(只要違法亂紀就絕對不是一個好學生;成績和品德有一項,再加遵紀守法也是好學生)
?合并使用“-”代表無關條件,選什么都不影響結果。

### 流程圖法:
?流程分析法主要是針對測試場景類型屬于流程測試場景的測試項下的測試子項進行設計,是從白盒測試設計方法中的路徑覆蓋分析法借鑒過來的一種方法。
–在白盒測試中,路徑就是指函數代碼的某個分支組合,路徑覆蓋法需要構造足夠的用例覆蓋函數的所有代碼路徑。
–在黑盒測試中,若將軟件系統的某個流程看成路徑的話,則可以針對該路徑使用路徑分析的方法設計測試用例。
?第一步:詳細了解需求;
?第二步:根據需求說明或界面原型,找出業務流程的各個頁面以及各頁面之間的流轉關系;
?第三步:畫出業務流程(產品經理使用Axure軟件制作);
?第四步:寫用例,覆蓋所有的路徑分支。
一、詳細了解需求;
二、找出業務流程的各個頁面以及各頁面之間的流轉關系
? 1、用戶向ATM取款機中插入銀行卡……
? 2、用戶輸入銀行卡密碼……
? 3、用戶輸入取款金額……
? 4、系統同步銀行主機,點鈔票,輸出給用戶并減去用戶卡中相應數目的存款金額……
? 5、用戶取款,銀行卡退卡……

?第四步:用例設計寫用例,覆蓋所有的路徑分支。
–需求描述及流程圖中,ATM取款機的提示信息對應于測試用例中的預期輸出部分,用戶的操作對應測試用例中的測試步驟部分。原則是一條有效路徑使用一個測試用例覆蓋。
依據業務流程圖確定測試路徑,即需要測試的業務流程。其主要包含三個方面:
a)正常流程,取款成功(基本流程):對應一次性取款成功;
b)異常流程,取款失敗(分支流程):對應取款失敗,包括退卡、吞卡;
c)異常流程,取款成功(循環流程):對應取款中間出現意外,比如密碼輸入錯誤,但是最終成功取錢的情況。

流程分析法總結
流程分析法適用于有先后順序的測試。常用于業務流程測試、安裝流程測試等。
流程分析法重點在于測試流程。因此,一般每個流程用一個測試用例驗證。
流程測試沒有問題并不能說明系統功能沒有問題,還需要針對每步功能進行測試。對于包含復雜流程的系統,只有功能點和處理流程都進行測試覆蓋,才算是比較充分的測試。
### 猜錯法:
? 錯誤推測法是指利用直覺和經驗猜測出出錯的可能類型,有針對性列舉出程序中所有可能的錯誤和容易發生錯誤的情況,它是測試經驗豐富的測試人員喜歡使用的一種測試用例設計方法。
?基本思想:
–基本思想是列舉出可能犯的錯誤或錯誤易發生的清單,然后根據清單編寫測試用例;這種方法很大程度上是憑經驗進行的,即憑人們對過去所作測試結果的分析,對所揭示缺陷的規律性作直覺的推測來發現缺陷。
采用錯誤推測法,最重要的是要思考和分析測試對象的各個方面,多參考以前發現的Bug的相關數據、總結的經驗,個人多考慮異常的情況、反面的情況、特殊的輸入,以一個攻擊者的態度對待程序,才能夠設計出比較完善的測試用例
### 隨機測試法:
隨機測試就是沒有書面測試用例、記錄期望結果、檢查列表、腳本或指令的測試。