原創(chuàng)|行業(yè)資訊|編輯:鄭恭琳|2020-12-14 13:48:49.957|閱讀 728 次
概述:單元測(cè)試就是測(cè)試單獨(dú)的單元。在本文中,我們將進(jìn)行7次模擬,包括一些有用的問(wèn)題,以便您可以指導(dǎo)自己完成C和單元測(cè)試。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
單元測(cè)試就是測(cè)試單獨(dú)的單元。在本文中,我們將進(jìn)行7次模擬,包括一些有用的問(wèn)題,以便您可以指導(dǎo)自己完成C和單元測(cè)試。
我們需要多少單元測(cè)試隔離?在為C和C++開(kāi)發(fā)單元測(cè)試時(shí),這是一個(gè)反復(fù)出現(xiàn)的重要問(wèn)題,經(jīng)常被爭(zhēng)論。我在這里不是在談?wù)撆c開(kāi)發(fā)者的隔離,而是坐在開(kāi)放空間中坐在我們旁邊,敲打他耳機(jī)的音樂(lè)節(jié)奏(順便說(shuō)一句,當(dāng)我們想創(chuàng)造出色的質(zhì)量代碼時(shí),這也很重要)。我說(shuō)的是將經(jīng)過(guò)測(cè)試的代碼與其周圍環(huán)境(即所謂的協(xié)作環(huán)境)隔離開(kāi)來(lái)。
在繼續(xù)之前,讓我先澄清一件事:在討論C和C++語(yǔ)言的存根和模擬時(shí),由于語(yǔ)言層在復(fù)雜性,功能和期望方面的差異,通常在C和C++之間劃清界限。關(guān)于典型的模擬框架,使用Parasoft C/C++test時(shí),情況略有不同,因?yàn)閮煞N語(yǔ)言都可以使用大多數(shù)框架功能。因此,在討論該主題時(shí),我將給出一個(gè)C或C++單元測(cè)試示例,并且除非我專門將某項(xiàng)標(biāo)記為僅受C或C++支持,否則您應(yīng)始終假定這兩種語(yǔ)言均提供了特定功能。
一方面,常識(shí)要求除非有充分的理由,否則我們不應(yīng)該孤立。最后,測(cè)試真正的協(xié)作者只會(huì)增加我們對(duì)代碼庫(kù)的滲透。為什么我們要放棄一些額外的代碼覆蓋范圍以及發(fā)現(xiàn)錯(cuò)誤的可能性?好吧,看來(lái)有一些很好的理由——我們將很快進(jìn)行討論。
另一方面,一個(gè)正統(tǒng)的單元測(cè)試人員會(huì)認(rèn)為單元測(cè)試是對(duì)孤立的單元進(jìn)行測(cè)試,并且應(yīng)該保持原樣。與真正的合作者進(jìn)行測(cè)試是集成階段的領(lǐng)域。一個(gè)眾所周知的事實(shí)是,通過(guò)將真正的環(huán)境納入測(cè)試范圍,我們可以使測(cè)試噪音更大。依賴真實(shí)環(huán)境的測(cè)試不僅會(huì)對(duì)被測(cè)代碼中的更改做出反應(yīng),而且還會(huì)對(duì)相關(guān)組件中的更改做出反應(yīng)。嘈雜的測(cè)試使維護(hù)過(guò)程更加昂貴,并且會(huì)分散注意力。從長(zhǎng)遠(yuǎn)來(lái)看,這種分散注意力通常成為放棄單元測(cè)試實(shí)踐的主要原因。
那么隔離測(cè)試代碼的策略是什么?鑒于上述情況,很難制定一個(gè)好的規(guī)則來(lái)確定需要mock哪些環(huán)境以提供對(duì)測(cè)試代碼的適當(dāng)隔離。從測(cè)試效率和有效性的角度來(lái)看,“盡可能地隔離”和“盡可能避免單元測(cè)試隔離”這兩種方法各有利弊。
這是一些更明顯的情況:
1.合作者尚未實(shí)施或仍在開(kāi)發(fā)中
這很簡(jiǎn)單。我們別無(wú)選擇,我們需要一個(gè)mock實(shí)現(xiàn)。下圖說(shuō)明了這種典型的單元測(cè)試環(huán)境(SUT——被測(cè)系統(tǒng),DOC——依賴組件/環(huán)境):
2.硬件獨(dú)立性
對(duì)于編寫(xiě)桌面應(yīng)用程序的開(kāi)發(fā)人員來(lái)說(shuō),這類問(wèn)題似乎遙不可及,但對(duì)于嵌入式開(kāi)發(fā)人員而言,單元測(cè)試的硬件獨(dú)立性是一個(gè)重要方面,無(wú)需硬件即可實(shí)現(xiàn)高水平的測(cè)試自動(dòng)化和執(zhí)行。一個(gè)很好的例子是被測(cè)單元與GPS硬件交互,期望提供一定的定位坐標(biāo)序列來(lái)計(jì)算速度。盡管我們建議您多做些運(yùn)動(dòng),這是一個(gè)好主意,但我無(wú)法想象測(cè)試人員會(huì)在設(shè)備上跑來(lái)跑去以模擬運(yùn)動(dòng),只是為了生成所需的測(cè)試輸入,而無(wú)論何時(shí)需要進(jìn)行單元測(cè)試。為此,該示例說(shuō)明了如果在開(kāi)發(fā)過(guò)程中無(wú)法實(shí)現(xiàn)硬件獨(dú)立性,則設(shè)備的開(kāi)發(fā)生命周期將進(jìn)行GPS測(cè)試多晚。
3.故障注入
故意注入錯(cuò)誤是測(cè)試中的常見(jiàn)情況。例如,這可用于測(cè)試內(nèi)存分配失敗,或查看硬件組件是否失敗。一些開(kāi)發(fā)人員試圖在測(cè)試初始化階段激發(fā)真正的環(huán)境,以便當(dāng)從被測(cè)試的代碼中調(diào)用時(shí),它會(huì)以錯(cuò)誤響應(yīng)。對(duì)我來(lái)說(shuō),這不切實(shí)際,通常太麻煩了。通常,更好的選擇是測(cè)試特定的、仿造的實(shí)現(xiàn)來(lái)模擬故障。
除了這些明顯總是需要模擬的環(huán)境的明顯情況之外,還有其他一些更微妙的情況,仿造的環(huán)境是一個(gè)不錯(cuò)的選擇。如果我們的測(cè)試過(guò)程遇到下面列出的任何問(wèn)題,則表明需要更好地隔離測(cè)試的代碼。
1.單元測(cè)試不可重復(fù)
難以實(shí)現(xiàn)依賴于易失性的穩(wěn)定測(cè)試。在這種情況下通常會(huì)發(fā)生的情況是,我們?cè)诓桓臏y(cè)試代碼或測(cè)試代碼的情況下收到了不同的測(cè)試結(jié)果。瞬態(tài)可能是依賴系統(tǒng)調(diào)用或無(wú)法從測(cè)試內(nèi)部控制的外部信號(hào)的影響。一個(gè)典型的例子是系統(tǒng)時(shí)鐘——如果測(cè)試場(chǎng)景需要在特定的時(shí)間點(diǎn)做出反應(yīng),那么如果沒(méi)有能夠完全控制對(duì)測(cè)試代碼的間接輸入有完全控制權(quán)的模擬協(xié)作者,則很難實(shí)現(xiàn)自動(dòng)化。
2.測(cè)試環(huán)境難以初始化
初始化測(cè)試環(huán)境可能非常復(fù)雜。模擬真實(shí)的環(huán)境,以便他們?yōu)闇y(cè)試的代碼提供可靠的輸入,即使不是不可能,也是一項(xiàng)艱巨的任務(wù)。
組件通常是相互關(guān)聯(lián)的,當(dāng)嘗試初始化一個(gè)特定的模塊時(shí),我們可能最終會(huì)初始化系統(tǒng)的一半。用偽造的實(shí)現(xiàn)代替真正的協(xié)作者可以降低測(cè)試環(huán)境初始化的復(fù)雜性。
3.測(cè)試狀態(tài)難以確定
在許多情況下,確定測(cè)試結(jié)論需要在測(cè)試執(zhí)行后檢查協(xié)作者的狀態(tài)。使用真正的環(huán)境,通常是不可能的,因?yàn)樵谡嬲膮f(xié)作者界面中沒(méi)有合適的訪問(wèn)方法來(lái)查詢測(cè)試后的狀態(tài)。
用mock代替真正的環(huán)境通??梢越鉀Q問(wèn)題,并且我們可以使用各種訪問(wèn)方法來(lái)擴(kuò)展偽造的實(shí)現(xiàn)以確定測(cè)試結(jié)果。
4.測(cè)試很慢
在某些情況下,真實(shí)環(huán)境的響應(yīng)可能會(huì)花費(fèi)大量時(shí)間。當(dāng)延遲變得不可接受以及何時(shí)需要隔離時(shí),并不總是很清楚。測(cè)試運(yùn)行中2分鐘的延遲是否可以接受?通常希望能夠盡快運(yùn)行測(cè)試套件(也許在每次代碼更改之后)。與實(shí)際環(huán)境的交互導(dǎo)致的大量延遲會(huì)使測(cè)試套件變得太慢而無(wú)法實(shí)用。這些真正的環(huán)境可能會(huì)更快地提高幾個(gè)數(shù)量級(jí),并使測(cè)試執(zhí)行時(shí)間達(dá)到可接受的水平。
因此,在編寫(xiě)新的C或C++單元測(cè)試并決定使用原始環(huán)境或模擬實(shí)現(xiàn)時(shí),請(qǐng)考慮以下四個(gè)問(wèn)題:
如果我們對(duì)環(huán)境的了解足夠多,可以回答所有這些問(wèn)題,那么這是一個(gè)簡(jiǎn)單的選擇。如果沒(méi)有,那么我建議您從真正的環(huán)境開(kāi)始,然后嘗試回答這四個(gè)問(wèn)題。實(shí)際上,這是大多數(shù)測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)從業(yè)人員在日常工作中應(yīng)用的方法。這意味著您需要適當(dāng)注意測(cè)試用例并仔細(xì)檢查它們,直到它們變得穩(wěn)定為止。
大多數(shù)情況下,單元測(cè)試的隔離由于要測(cè)試的單元的依賴性而變得復(fù)雜。在某些情況下,顯然需要模擬從屬組件,但也需要更微妙的情況。在某些情況下,這不是很明確的方法,它取決于測(cè)試環(huán)境中依賴項(xiàng)所具有的風(fēng)險(xiǎn)和不確定性。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn