分類菜單
軟件測試
培訓(xùn)首頁> 軟件測試培訓(xùn)頭條> 單元測試時(shí)需要確保這3個(gè)獨(dú)立

單元測試時(shí)需要確保這3個(gè)獨(dú)立

軟件測試
發(fā)表時(shí)間:2017-08-29 1192人瀏覽

  單元測試是針對(duì)代碼單元的獨(dú)立測試。“獨(dú)立”是指將代碼從原始項(xiàng)目及其依賴的環(huán)境中隔離出來,針對(duì)各個(gè)單元單獨(dú)進(jìn)行測試,包括三方面含義:形式獨(dú)立、實(shí)質(zhì)獨(dú)立和意識(shí)獨(dú)立。單元測試之所以困難,就在于技術(shù)上無法解決形式獨(dú)立和實(shí)質(zhì)獨(dú)立,主觀上沒有達(dá)到意識(shí)獨(dú)立。

  形式獨(dú)立

  將測試任務(wù)從原始項(xiàng)目及其依賴環(huán)境中隔離出來,并能在易于測試的環(huán)境下運(yùn)行。企業(yè)項(xiàng)目通常高耦合、可測性差、依賴于特定的軟件環(huán)境或硬件環(huán)境,單元測試要首先將測試任務(wù)從依賴的代碼和環(huán)境中分離出來,并解決編譯、平臺(tái)差異等問題,使測試任務(wù)在易于測試的環(huán)境下能夠獨(dú)立測試。

  實(shí)質(zhì)獨(dú)立

  被測試代碼通常會(huì)調(diào)用各種底層函數(shù),其功能邏輯難免受底層函數(shù)的影響,如何獨(dú)立完整地進(jìn)行測試?實(shí)際上,調(diào)用底層函數(shù)獲得的數(shù)據(jù),與通過參數(shù)傳遞的數(shù)據(jù)具有同等意義,例如,調(diào)用底層函數(shù)得到一個(gè)返回值,要測試的是被測程序?qū)@個(gè)值的各種可能有沒有做合適的判斷處理,并不關(guān)心底層函數(shù)如何計(jì)算這個(gè)值,正如只關(guān)心是否對(duì)參數(shù)的各種可能做了合適處理,而不關(guān)心參數(shù)是如何傳遞和由誰傳遞一樣。因此,調(diào)用底層函數(shù)獲得的數(shù)據(jù)可視為被測函數(shù)的一種輸入,稱為內(nèi)部輸入。

  如果可以模擬底層函數(shù)的各種輸出,并將這些輸出視為被測函數(shù)的內(nèi)部輸入,那么,無論底層函數(shù)屬于哪種情形,都可以完整測試被測代碼的功能邏輯,這就是實(shí)質(zhì)獨(dú)立。

  內(nèi)部輸入分為易于自然取得(調(diào)用真實(shí)的底層函數(shù)獲得)、不可控(調(diào)用真實(shí)底層函數(shù)但其行為難于控制)、失真(打樁的必然后果)、難于自然取得等四種情形。易以自然取得的內(nèi)部輸入并不影響被測函數(shù)的獨(dú)立性,而后三種則是單元測試的關(guān)鍵難點(diǎn)。靜態(tài)局部變量也是麻煩的內(nèi)部輸入。關(guān)于內(nèi)部輸入的詳細(xì)說明,請(qǐng)看這篇文章。

  意識(shí)獨(dú)立

  意識(shí)獨(dú)立是主觀要素,是指在制定測試目標(biāo)和執(zhí)行測試時(shí),要適應(yīng)“單元測試是針對(duì)代碼單元的獨(dú)立測試”這一基本現(xiàn)實(shí),把測試任務(wù)看作一個(gè)一個(gè)的獨(dú)立單元,正確設(shè)定測試目標(biāo)、正確選擇測試方法及工具。

  單元測試有獨(dú)特的優(yōu)勢,例如易于完整地測試代碼單元的功能邏輯,這些優(yōu)勢來自“獨(dú)立”,但凡事有其長必有其短,既然是“獨(dú)立”,就難于測試與其他代碼和依賴環(huán)境的相互關(guān)系。單元測試與系統(tǒng)測試是互補(bǔ)關(guān)系,不是代替關(guān)系,“獨(dú)立”狀態(tài)下易于發(fā)現(xiàn)的錯(cuò)誤,才是單元測試的目標(biāo);集成后才易于發(fā)現(xiàn)的問題,應(yīng)該留待系統(tǒng)測試。

  代碼單元本身的功能邏輯錯(cuò)誤都是單元測試的目標(biāo),而性能問題(時(shí)間性能如執(zhí)行速度,空間性能如存儲(chǔ)空間大小、內(nèi)存泄漏)難于在小單元內(nèi)測試,不是單元測試目標(biāo)。

  單元測試也不考慮平行和向上依賴關(guān)系,并把向下依賴抽象為內(nèi)部輸入,例如,測試一個(gè)函數(shù)時(shí),不考慮這個(gè)函數(shù)在項(xiàng)目中是被普通調(diào)用、系統(tǒng)回調(diào)、消息或信號(hào)調(diào)用、還是中斷調(diào)用;不考慮多線程、重載;嵌入式環(huán)境中的端口、寄存器等在代碼中都是內(nèi)存,視為全局變量;并把底層函數(shù)(包括操作系統(tǒng)api)的輸出視為內(nèi)部輸入??傊?,只用各種輸入是否產(chǎn)生了正確輸出的方式,完整測試函數(shù)的功能邏輯,也正因?yàn)檫@個(gè)原因,單元測試可以脫離原來的平臺(tái)環(huán)境,在易于實(shí)施的平臺(tái)上進(jìn)行,例如,在pc上測試嵌入式項(xiàng)目,在windows上測試linux項(xiàng)目,都是可行的。

  編碼規(guī)范檢查與單元測試無關(guān),無論是否實(shí)施單元測試,編碼規(guī)范檢查都是必不可少的工作。靜態(tài)分析屬于全局掃描,嚴(yán)格來說也不是單元測試,提高編譯器的警告,就是簡單的靜態(tài)分析。

  單元測試是意義重大且困難的工作,目標(biāo)應(yīng)該具體而明確,將不屬于單元測試或單元測試不擅長的目標(biāo)牽扯進(jìn)來,其結(jié)果往往是“揀了芝麻,丟了西瓜”。


溫馨提示

個(gè)性定制課程


溫馨提示