資料來源:軟件構造PPT
軟件測試與測試優(yōu)先
PART Ⅰ 測試相關知識點
Q:為什么要測試迄薄?
測試能夠發(fā)現(xiàn)程序中的錯誤风罩,提高程序正確性的信心。
Q:測試需要注意哪些點隐岛?
- 正確性
- 需求是否滿足spec
- 對所有輸入能否正確相應(robustness)
- 性能能否接受史飞,運行時間能夠接受
- 是否可用
- 能否正確的安裝部署和運行
- 能否實現(xiàn)期望
Q:一個好的測試具有哪些特征尖昏?
- 能夠發(fā)現(xiàn)錯誤
- 不冗余
- 能夠最佳測試要測試的函數(shù)
- 不是太復雜也不是太簡單
Q:測試的等級有哪些?
最底層:單元測試构资,測試功能函數(shù)
中間層:集成測試抽诉,對于多個類、包吐绵、組件的集中測試
頂層:系統(tǒng)測試迹淌,測試一個完整的系統(tǒng)
-
回退:回歸測試,重復迭代
image -
最終交付:驗收測試
image
Q:靜態(tài)測試與動態(tài)測試區(qū)別己单?
-
靜態(tài)測試不會實際的運行代碼
? 靜態(tài)測試常常是內部運行的唉窃,比如在代碼工具/文本編輯器中會檢查代碼的結構或者編譯器檢查語法和數(shù)據(jù)流。
-
動態(tài)測試測試代碼運行的表現(xiàn)纹笼,也就是會在測試用例中真正的跑起來
在代碼未完全實現(xiàn)之前纹份,動態(tài)檢查會檢查特定的代碼段,現(xiàn)在用來動態(tài)測試的技術要么是驅動或者在debug環(huán)境中執(zhí)行。
Q:測試和調試的區(qū)別(testing vs. debugging)蔓涧?
- 測試是用來發(fā)現(xiàn)是否存在錯誤
- 調試是用來識別錯誤根源件已,消除錯誤
PART Ⅱ 軟件測試用例選擇
接下來就要說一下軟件測試了。
Q:為什么說軟件測試很難元暴?
- 行為在離散輸入空間中差異巨大篷扩,輸入并不符合統(tǒng)計學規(guī)律。bug的出現(xiàn)不符合概率分布昨寞。
- 在錯誤發(fā)生時瞻惋,輸入無統(tǒng)計分布規(guī)律可循
- 暴力窮舉是不可能的
所以說,軟件測試用例必須要慎重和系統(tǒng)的選擇
Q:測試用例是什么東西援岩?
測試用例是一個測試輸入歼狼、執(zhí)行條件、預期結果的集合享怀。測試用例是你項目中有價值的資產羽峰!
Q:測試用例的設計原則?
- 有代表性
- 明確性添瓷,有明確的結果
- 可重復性梅屉,同一case,同一結果
PART Ⅲ 測試優(yōu)先編程
Q:什么叫測試優(yōu)先編程鳞贷?
在你寫代碼之前坯汤,先把測試寫好
Q:具體的流程應該是什么?
- 先寫spec
- 再寫符合spec的測試用例
- 寫代碼 --> 執(zhí)行測試 --> 修改 搀愧,重復
Q:SPEC怎么寫惰聂?
- 給輸入的參數(shù)類型和約束條件,比如平方函數(shù)不能是負的咱筛。
- 給出返回值和以及返回值和輸入之間關系
- spec也包括方法的特點和有關它是用來干啥的評述
當然搓幌,SPEC是不可能一次就寫好的,所以我們得寫測試用例迅箩,寫測試用例溉愁,可以理解、修正饲趋、完善spec設計拐揭。
Q:先寫測試還是后寫呢?
題目叫什么奕塑?堂污?當然是先寫
Q:什么叫測試驅動開發(fā)?
測試驅動開發(fā)(TDD)爵川,就是以測試驅動開發(fā)敷鸦。先寫需求息楔,再寫測試寝贡,然后編程實現(xiàn)通過測試扒披,循環(huán)。短平快圃泡,跟之前先編碼碟案,后來發(fā)現(xiàn)對不上需求的編碼方式相反。
PART Ⅳ 單元測試 Unit Test
Q:什么叫單元測試颇蜡?
針對軟件最小單元模型開展測試价说,隔離各個模塊,容易定位錯誤和調試
Q:那么單元測試要考慮哪些情況呢风秤?
- 模塊的接口鳖目,確保數(shù)據(jù)流正確的輸入和輸出。
- 本地的數(shù)據(jù)結構缤弦,確保在經(jīng)過算法計算后結構不會變领迈。
- 各個獨立分支,確保所有控制結構碍沐,條件分支都能測試到狸捅。
- 邊界條件,不多說了累提。
- 針對錯誤的解決方法尘喝。
Q:有沒有自動測試工具?
有斋陪,JUnit
朽褪,測試文件要單獨放在test
文件夾下.使用assert語句來判斷。
PART Ⅴ 黑盒測試(重要)
Q:什么是黑盒測試鳍贾?
黑盒測試不關心代碼如何實現(xiàn)鞍匾,只檢查代碼的功能。
ⅰ以劃分來選擇測試用例
Q:什么叫等價類劃分骑科?
將函數(shù)的輸入域劃分為等價類橡淑,從等價類中導出測試用例。其中根據(jù)每個輸入所需要滿足的約束條件咆爽,劃分等價類梁棠。每一個等價類都代表著對約束加以滿足/違反/無效的數(shù)據(jù)集合。
Q:等價類劃分的一般規(guī)則斗埂?
- 輸入數(shù)據(jù)限定了范圍符糊,那么就會產生一個合法域和兩端的非法域。
- 輸入數(shù)據(jù)指明了特定的值呛凶,那么就會產生一個合法值和一個非法值男娄。
- 輸入數(shù)據(jù)確定了一組數(shù)據(jù),那么就有一組合法和一組非法數(shù)據(jù)。
- 輸入數(shù)據(jù)為yes | no模闲,我不說了建瘫。
例:輸入學號
- 長度為10位,:10尸折、>10啰脚、<10
- 117開頭:以此開頭、以其他開頭
- 后兩位數(shù)為特定數(shù)字
Q:對于數(shù)字測試如何劃分实夹?
- 根據(jù)約束
- 考慮很大的數(shù)
例:
multiply()
函數(shù)
每個劃分內選一個就足夠代表了
例:
max()
函數(shù)
練習:
ⅱ 在劃分中包含邊界
-
大量的錯誤發(fā)生在輸入域的邊界而非中央
- 0是正負的邊界
- 最大數(shù)MAX和最小數(shù)MIN對于int和double是邊界
- 空對象(empty string橄浓、empty list、 empty array)對于collection是邊界
- collection的第一個和最后一個是邊界
BVA(boundary value analysis)是測試技巧亮航,在邊界中選擇測試用例
邊界值分析方法是對等價類劃分方法的補充
在考慮邊界劃分時荸实,不僅要考慮邊界,還要考慮邊界的兩側
邊界測試的例子:
邊界測試加上劃分例子:
邊界測試例子max函數(shù)
ⅲ 兩種極端的劃分
-
笛卡兒積:全覆蓋
在多個維度劃分的多個取值缴淋,全部組合起來泪勒,每個組合都要有一個用例。
-
覆蓋每個取值宴猾,最少1次即可
在每個維度選擇至少一個用例圆存,但不需要測試所有的組合。
兩者的區(qū)別:
前者測試完備仇哆,但數(shù)量多沦辙,測試代價高。后者測試用例少讹剔,代價低油讯,但覆蓋度未必高。
PART Ⅵ 白盒測試
白盒測試要考慮內部實現(xiàn)的細節(jié)延欠,使用內部視角來編寫測試用例陌兑。根據(jù)程序執(zhí)行的路徑設計測試用例,一般較早執(zhí)行由捎。也就是說兔综,白盒測試需要覆蓋被測代碼的所有路徑
ⅰ 代碼覆蓋度
代碼覆蓋度有很多不同的種類
- 函數(shù)覆蓋:測試的函數(shù)是否被調用
- 語句覆蓋:每條語句是否被執(zhí)行
- 分支覆蓋:if while for的每個分支,正確或錯誤分支是否都被執(zhí)行
- 條件覆蓋:同上
- 路徑覆蓋:程序的每條執(zhí)行路徑path(各種執(zhí)行路線)是否 被用例覆蓋
測試效果:
? 路徑覆蓋 > 分支覆蓋 > 語句覆蓋
當然……測試難度也是這樣從高到低
推薦工具:EclEmma
PART Ⅶ 自動測試與回歸測試
? 事實上狞玛,手工測試的代價太高软驰,最好達到完全的自動化
自動測試
? 意思為自動調用被測函數(shù)、自動判定測試結果心肪、自動計算覆蓋度锭亏。這里只是指測試用例的自動執(zhí)行,而不是自動生成測試用例硬鞍。
回歸測試
? 一旦程序被修改慧瘤,重新執(zhí)行之前的所有測試戴已。在這里
- 一旦發(fā)現(xiàn)bug,馬上寫一個可以重現(xiàn)bug的輸入的測試用例锅减,并將其加入測試庫
- 自動測試和回歸測試幾乎都用在合并代碼構建中
- 自動化回歸測試是現(xiàn)代軟件工程中的最佳實踐方式
PART Ⅷ 編寫測試策略
在ADT設計文檔中恭陡,單元測試策略是非常重要的一環(huán)。寫它的目的是在代碼評審中上煤,讓其他人可以理解你的測試,檢查你的測試是否足夠充分著淆。
比如劫狠,在測試函數(shù)時,在測試類頂部寫下測試策略永部,在每個測試函數(shù)上寫下它的測試用例是怎么選擇的独泞,也就是這個測試覆蓋了哪些劃分類。
本章小結
- 測試優(yōu)先編程苔埋。
- 劃分和邊界懦砂,能夠系統(tǒng)的選擇測試用例
- 白盒測試和statement覆蓋來填充測試
- 單元測試,使得每個測試盡可能獨立不耦合
- 自動回歸測試
- 免于遭受bug