資料來(lái)源:軟件構(gòu)造PPT
軟件測(cè)試與測(cè)試優(yōu)先
PART Ⅰ 測(cè)試相關(guān)知識(shí)點(diǎn)
Q:為什么要測(cè)試?
測(cè)試能夠發(fā)現(xiàn)程序中的錯(cuò)誤,提高程序正確性的信心。
Q:測(cè)試需要注意哪些點(diǎn)?
- 正確性
- 需求是否滿足spec
- 對(duì)所有輸入能否正確相應(yīng)(robustness)
- 性能能否接受,運(yùn)行時(shí)間能夠接受
- 是否可用
- 能否正確的安裝部署和運(yùn)行
- 能否實(shí)現(xiàn)期望
Q:一個(gè)好的測(cè)試具有哪些特征?
- 能夠發(fā)現(xiàn)錯(cuò)誤
- 不冗余
- 能夠最佳測(cè)試要測(cè)試的函數(shù)
- 不是太復(fù)雜也不是太簡(jiǎn)單
Q:測(cè)試的等級(jí)有哪些?
最底層:?jiǎn)卧獪y(cè)試,測(cè)試功能函數(shù)
中間層:集成測(cè)試,對(duì)于多個(gè)類、包、組件的集中測(cè)試
頂層:系統(tǒng)測(cè)試,測(cè)試一個(gè)完整的系統(tǒng)
-
回退:回歸測(cè)試,重復(fù)迭代
image -
最終交付:驗(yàn)收測(cè)試
image
Q:靜態(tài)測(cè)試與動(dòng)態(tài)測(cè)試區(qū)別?
-
靜態(tài)測(cè)試不會(huì)實(shí)際的運(yùn)行代碼
? 靜態(tài)測(cè)試常常是內(nèi)部運(yùn)行的,比如在代碼工具/文本編輯器中會(huì)檢查代碼的結(jié)構(gòu)或者編譯器檢查語(yǔ)法和數(shù)據(jù)流。
-
動(dòng)態(tài)測(cè)試測(cè)試代碼運(yùn)行的表現(xiàn),也就是會(huì)在測(cè)試用例中真正的跑起來(lái)
在代碼未完全實(shí)現(xiàn)之前,動(dòng)態(tài)檢查會(huì)檢查特定的代碼段,現(xiàn)在用來(lái)動(dòng)態(tài)測(cè)試的技術(shù)要么是驅(qū)動(dòng)或者在debug環(huán)境中執(zhí)行。
Q:測(cè)試和調(diào)試的區(qū)別(testing vs. debugging)?
- 測(cè)試是用來(lái)發(fā)現(xiàn)是否存在錯(cuò)誤
- 調(diào)試是用來(lái)識(shí)別錯(cuò)誤根源,消除錯(cuò)誤
PART Ⅱ 軟件測(cè)試用例選擇
接下來(lái)就要說(shuō)一下軟件測(cè)試了。
Q:為什么說(shuō)軟件測(cè)試很難?
- 行為在離散輸入空間中差異巨大,輸入并不符合統(tǒng)計(jì)學(xué)規(guī)律。bug的出現(xiàn)不符合概率分布。
- 在錯(cuò)誤發(fā)生時(shí),輸入無(wú)統(tǒng)計(jì)分布規(guī)律可循
- 暴力窮舉是不可能的
所以說(shuō),軟件測(cè)試用例必須要慎重和系統(tǒng)的選擇
Q:測(cè)試用例是什么東西?
測(cè)試用例是一個(gè)測(cè)試輸入、執(zhí)行條件、預(yù)期結(jié)果的集合。測(cè)試用例是你項(xiàng)目中有價(jià)值的資產(chǎn)!
Q:測(cè)試用例的設(shè)計(jì)原則?
- 有代表性
- 明確性,有明確的結(jié)果
- 可重復(fù)性,同一case,同一結(jié)果
PART Ⅲ 測(cè)試優(yōu)先編程
Q:什么叫測(cè)試優(yōu)先編程?
在你寫代碼之前,先把測(cè)試寫好
Q:具體的流程應(yīng)該是什么?
- 先寫spec
- 再寫符合spec的測(cè)試用例
- 寫代碼 --> 執(zhí)行測(cè)試 --> 修改 ,重復(fù)
Q:SPEC怎么寫?
- 給輸入的參數(shù)類型和約束條件,比如平方函數(shù)不能是負(fù)的。
- 給出返回值和以及返回值和輸入之間關(guān)系
- spec也包括方法的特點(diǎn)和有關(guān)它是用來(lái)干啥的評(píng)述
當(dāng)然,SPEC是不可能一次就寫好的,所以我們得寫測(cè)試用例,寫測(cè)試用例,可以理解、修正、完善spec設(shè)計(jì)。
Q:先寫測(cè)試還是后寫呢?
題目叫什么??當(dāng)然是先寫
Q:什么叫測(cè)試驅(qū)動(dòng)開(kāi)發(fā)?
測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD),就是以測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。先寫需求,再寫測(cè)試,然后編程實(shí)現(xiàn)通過(guò)測(cè)試,循環(huán)。短平快,跟之前先編碼,后來(lái)發(fā)現(xiàn)對(duì)不上需求的編碼方式相反。
PART Ⅳ 單元測(cè)試 Unit Test
Q:什么叫單元測(cè)試?
針對(duì)軟件最小單元模型開(kāi)展測(cè)試,隔離各個(gè)模塊,容易定位錯(cuò)誤和調(diào)試
Q:那么單元測(cè)試要考慮哪些情況呢?
- 模塊的接口,確保數(shù)據(jù)流正確的輸入和輸出。
- 本地的數(shù)據(jù)結(jié)構(gòu),確保在經(jīng)過(guò)算法計(jì)算后結(jié)構(gòu)不會(huì)變。
- 各個(gè)獨(dú)立分支,確保所有控制結(jié)構(gòu),條件分支都能測(cè)試到。
- 邊界條件,不多說(shuō)了。
- 針對(duì)錯(cuò)誤的解決方法。
Q:有沒(méi)有自動(dòng)測(cè)試工具?
有,JUnit,測(cè)試文件要單獨(dú)放在test文件夾下.使用assert語(yǔ)句來(lái)判斷。

PART Ⅴ 黑盒測(cè)試(重要)
Q:什么是黑盒測(cè)試?
黑盒測(cè)試不關(guān)心代碼如何實(shí)現(xiàn),只檢查代碼的功能。
ⅰ以劃分來(lái)選擇測(cè)試用例
Q:什么叫等價(jià)類劃分?
將函數(shù)的輸入域劃分為等價(jià)類,從等價(jià)類中導(dǎo)出測(cè)試用例。其中根據(jù)每個(gè)輸入所需要滿足的約束條件,劃分等價(jià)類。每一個(gè)等價(jià)類都代表著對(duì)約束加以滿足/違反/無(wú)效的數(shù)據(jù)集合。
Q:等價(jià)類劃分的一般規(guī)則?
- 輸入數(shù)據(jù)限定了范圍,那么就會(huì)產(chǎn)生一個(gè)合法域和兩端的非法域。
- 輸入數(shù)據(jù)指明了特定的值,那么就會(huì)產(chǎn)生一個(gè)合法值和一個(gè)非法值。
- 輸入數(shù)據(jù)確定了一組數(shù)據(jù),那么就有一組合法和一組非法數(shù)據(jù)。
- 輸入數(shù)據(jù)為yes | no,我不說(shuō)了。
例:輸入學(xué)號(hào)
- 長(zhǎng)度為10位,:10、>10、<10
- 117開(kāi)頭:以此開(kāi)頭、以其他開(kāi)頭
- 后兩位數(shù)為特定數(shù)字
Q:對(duì)于數(shù)字測(cè)試如何劃分?
- 根據(jù)約束
- 考慮很大的數(shù)
例:
multiply()函數(shù)


每個(gè)劃分內(nèi)選一個(gè)就足夠代表了
例:
max()函數(shù)

練習(xí):


ⅱ 在劃分中包含邊界
-
大量的錯(cuò)誤發(fā)生在輸入域的邊界而非中央
- 0是正負(fù)的邊界
- 最大數(shù)MAX和最小數(shù)MIN對(duì)于int和double是邊界
- 空對(duì)象(empty string、empty list、 empty array)對(duì)于collection是邊界
- collection的第一個(gè)和最后一個(gè)是邊界
BVA(boundary value analysis)是測(cè)試技巧,在邊界中選擇測(cè)試用例
邊界值分析方法是對(duì)等價(jià)類劃分方法的補(bǔ)充
在考慮邊界劃分時(shí),不僅要考慮邊界,還要考慮邊界的兩側(cè)
邊界測(cè)試的例子:

邊界測(cè)試加上劃分例子:

邊界測(cè)試?yán)觤ax函數(shù)

ⅲ 兩種極端的劃分
-
笛卡兒積:全覆蓋
在多個(gè)維度劃分的多個(gè)取值,全部組合起來(lái),每個(gè)組合都要有一個(gè)用例。
-
覆蓋每個(gè)取值,最少1次即可
在每個(gè)維度選擇至少一個(gè)用例,但不需要測(cè)試所有的組合。
兩者的區(qū)別:
前者測(cè)試完備,但數(shù)量多,測(cè)試代價(jià)高。后者測(cè)試用例少,代價(jià)低,但覆蓋度未必高。
PART Ⅵ 白盒測(cè)試
白盒測(cè)試要考慮內(nèi)部實(shí)現(xiàn)的細(xì)節(jié),使用內(nèi)部視角來(lái)編寫測(cè)試用例。根據(jù)程序執(zhí)行的路徑設(shè)計(jì)測(cè)試用例,一般較早執(zhí)行。也就是說(shuō),白盒測(cè)試需要覆蓋被測(cè)代碼的所有路徑
ⅰ 代碼覆蓋度
代碼覆蓋度有很多不同的種類
- 函數(shù)覆蓋:測(cè)試的函數(shù)是否被調(diào)用
- 語(yǔ)句覆蓋:每條語(yǔ)句是否被執(zhí)行
- 分支覆蓋:if while for的每個(gè)分支,正確或錯(cuò)誤分支是否都被執(zhí)行
- 條件覆蓋:同上
- 路徑覆蓋:程序的每條執(zhí)行路徑path(各種執(zhí)行路線)是否 被用例覆蓋
測(cè)試效果:
? 路徑覆蓋 > 分支覆蓋 > 語(yǔ)句覆蓋
當(dāng)然……測(cè)試難度也是這樣從高到低
推薦工具:EclEmma
PART Ⅶ 自動(dòng)測(cè)試與回歸測(cè)試
? 事實(shí)上,手工測(cè)試的代價(jià)太高,最好達(dá)到完全的自動(dòng)化
自動(dòng)測(cè)試
? 意思為自動(dòng)調(diào)用被測(cè)函數(shù)、自動(dòng)判定測(cè)試結(jié)果、自動(dòng)計(jì)算覆蓋度。這里只是指測(cè)試用例的自動(dòng)執(zhí)行,而不是自動(dòng)生成測(cè)試用例。
回歸測(cè)試
? 一旦程序被修改,重新執(zhí)行之前的所有測(cè)試。在這里
- 一旦發(fā)現(xiàn)bug,馬上寫一個(gè)可以重現(xiàn)bug的輸入的測(cè)試用例,并將其加入測(cè)試庫(kù)
- 自動(dòng)測(cè)試和回歸測(cè)試幾乎都用在合并代碼構(gòu)建中
- 自動(dòng)化回歸測(cè)試是現(xiàn)代軟件工程中的最佳實(shí)踐方式
PART Ⅷ 編寫測(cè)試策略
在ADT設(shè)計(jì)文檔中,單元測(cè)試策略是非常重要的一環(huán)。寫它的目的是在代碼評(píng)審中,讓其他人可以理解你的測(cè)試,檢查你的測(cè)試是否足夠充分。
比如,在測(cè)試函數(shù)時(shí),在測(cè)試類頂部寫下測(cè)試策略,在每個(gè)測(cè)試函數(shù)上寫下它的測(cè)試用例是怎么選擇的,也就是這個(gè)測(cè)試覆蓋了哪些劃分類。

本章小結(jié)
- 測(cè)試優(yōu)先編程。
- 劃分和邊界,能夠系統(tǒng)的選擇測(cè)試用例
- 白盒測(cè)試和statement覆蓋來(lái)填充測(cè)試
- 單元測(cè)試,使得每個(gè)測(cè)試盡可能獨(dú)立不耦合
- 自動(dòng)回歸測(cè)試
- 免于遭受bug

