[軟件構(gòu)造] 軟件測(cè)試用例與測(cè)試優(yōu)先

資料來(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)判斷。

image

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)

  1. 長(zhǎng)度為10位,:10、>10、<10
  2. 117開(kāi)頭:以此開(kāi)頭、以其他開(kāi)頭
  3. 后兩位數(shù)為特定數(shù)字

Q:對(duì)于數(shù)字測(cè)試如何劃分?

  • 根據(jù)約束
  • 考慮很大的數(shù)

multiply()函數(shù)

約束
產(chǎn)生的劃分

每個(gè)劃分內(nèi)選一個(gè)就足夠代表了

max()函數(shù)

max函數(shù)

練習(xí):

String
image

ⅱ 在劃分中包含邊界

  • 大量的錯(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è)試加上劃分例子:

邊界加劃分

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

image

ⅲ 兩種極端的劃分

  • 笛卡兒積:全覆蓋

    在多個(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容