作者 |包丹珠上??匕伯a(chǎn)品總監(jiān)
版塊 |鑒源論壇 · 觀模
社群 |添加微信號(hào)“TICPShanghai”加入“上??匕?1fusa安全社區(qū)”
“軟件單元測(cè)試真的有必要嗎?”專題將分為上下兩期,深度詳解軟件單元測(cè)試的重要意義,分享目前行業(yè)內(nèi)進(jìn)行的單元測(cè)試探索與實(shí)踐。本文著重探討單元測(cè)試的重要性及其正面臨的困境,并介紹功能安全標(biāo)準(zhǔn)中羅列的單元測(cè)試方法。
01
前 言
元宇宙虛擬世界被大家探討得越來(lái)越深入。隨著Facebook公司更名為Meta,這場(chǎng)未來(lái)之戰(zhàn)已經(jīng)吹響號(hào)角。元宇宙是虛擬的一個(gè)世界,核心是軟件創(chuàng)造的世界。那么,軟件定義一切對(duì)普羅大眾來(lái)說(shuō)將不再是個(gè)空想,而是正在抵達(dá)的不久的將來(lái)。
如果在讀的你對(duì)軟件還沒(méi)有成熟的認(rèn)知,對(duì)產(chǎn)品體驗(yàn)始終停留在有形的實(shí)體的執(zhí)念上的話,那么你要注意更新自己的認(rèn)知了,要盡快做好抓住虛擬未來(lái)各種機(jī)遇的準(zhǔn)備哦。
如果說(shuō)軟件成為未來(lái)世界的基礎(chǔ),那么軟件單元將是基礎(chǔ)中的基礎(chǔ)。當(dāng)我們?cè)谡務(wù)撥浖卧獪y(cè)試時(shí),我們實(shí)際在談的是如何打好軟件基礎(chǔ)。讓我們把視角從未來(lái)切回到當(dāng)下,一起來(lái)探討目前關(guān)于軟件單元測(cè)試所面臨的實(shí)際困境,以及如何正確面對(duì)這些困境,從而期待為基礎(chǔ)的軟件研發(fā)過(guò)程做好堅(jiān)實(shí)的技術(shù)支撐。
02
靈魂拷問(wèn):?jiǎn)卧獪y(cè)試耗時(shí)費(fèi)力、成效模糊難以直觀預(yù)見,功能安全標(biāo)準(zhǔn)為何將其作為關(guān)鍵過(guò)程進(jìn)行要求?

軟件單元測(cè)試不是一個(gè)新的概念。不論是工業(yè)領(lǐng)域,還是金融、互聯(lián)網(wǎng)的軟件從業(yè)人員,相信對(duì)單元測(cè)試都或多或少有一定的認(rèn)知,甚至已經(jīng)產(chǎn)生了相關(guān)的實(shí)踐。隨著IEC 61508功能安全標(biāo)準(zhǔn)體系的不斷擴(kuò)充發(fā)展,安全攸關(guān)的領(lǐng)域最先對(duì)其引起了重視。
在快速軟件交付為王的背景之下,研發(fā)人員對(duì)單元測(cè)試的態(tài)度是認(rèn)為基礎(chǔ)且重要,但是存在較大負(fù)擔(dān)的。
1. 首先,單元測(cè)試任務(wù)瑣碎繁重,會(huì)占用大量時(shí)間。通常情況下,對(duì)于一個(gè)小型10萬(wàn)行規(guī)模的軟件,大約需要設(shè)計(jì)10000條用例去進(jìn)行測(cè)試?;旧?,在沒(méi)有工具支撐的情況,需要消耗同寫代碼同樣的時(shí)間去撰寫測(cè)試驅(qū)動(dòng)并測(cè)試;在有工具支持的情況會(huì)有所緩解,但也至少多花費(fèi)一半的時(shí)間。
2. 其次,單元測(cè)試預(yù)期能產(chǎn)生的效果不是能立即直觀體現(xiàn)出來(lái)的。軟件單元測(cè)試是在軟件開發(fā)過(guò)程中進(jìn)行,軟件還未集成在一起,那么對(duì)于單元測(cè)試發(fā)現(xiàn)的問(wèn)題不能立即直觀地體現(xiàn)在軟件的整體功能上的,因此一開始缺乏直觀可見的對(duì)比證據(jù)來(lái)說(shuō)服開發(fā)人員或者領(lǐng)導(dǎo)單元測(cè)試的重要意義。也就是說(shuō),單元測(cè)試的好處就好比保養(yǎng),在軟件開發(fā)階段是不能直觀體現(xiàn)出來(lái)的,需要到了軟件投入使用之后,經(jīng)過(guò)同類對(duì)比,才能真正的直觀體現(xiàn)出來(lái)。舉個(gè)例子,兩個(gè)負(fù)責(zé)不同模塊的程序員,一個(gè)總能快速完成開發(fā),另一個(gè)就要花較長(zhǎng)的時(shí)間才能給出。從效率上講似乎快的能力更強(qiáng)。但是當(dāng)給到客戶之后,你會(huì)發(fā)現(xiàn)完成快的模塊反饋出來(lái)奇奇怪怪的各種問(wèn)題,需要很大的后期維護(hù)成本;慢的問(wèn)題相對(duì)較少,漸漸地變得沒(méi)有新問(wèn)題反饋出來(lái)。整體上來(lái)講,快的反而要花更長(zhǎng)的時(shí)間,并且還消耗了口碑,投入了更多關(guān)系維護(hù)成本。
3. 再次,測(cè)試標(biāo)準(zhǔn)如何定義,何種程度可以認(rèn)為是測(cè)試充分的是一個(gè)很關(guān)鍵的問(wèn)題。單元測(cè)試通常會(huì)設(shè)定一些覆蓋率的指標(biāo),比如要求達(dá)到語(yǔ)句、分支覆蓋率100%。但是做到這些覆蓋率的指標(biāo)就能證明沒(méi)有問(wèn)題了嗎?很顯然不能,這是測(cè)試?yán)碚摫旧淼耐ú?,即只能發(fā)現(xiàn)問(wèn)題,不能證明沒(méi)有問(wèn)題。但這不是不進(jìn)行單元測(cè)試的理由。這些指標(biāo)要求是基礎(chǔ)要求,能夠完成這些指標(biāo),軟件的質(zhì)量會(huì)有一個(gè)質(zhì)的提升。
4. 最后,當(dāng)詳細(xì)設(shè)計(jì)文檔不完善時(shí),研發(fā)人員缺乏明確的測(cè)試依據(jù),導(dǎo)致工作難以開展。軟件單元測(cè)試需要比較強(qiáng)的前置條件,即需要有詳細(xì)的軟件設(shè)計(jì)文檔作為測(cè)試的需求依據(jù)。然而,這個(gè)前置條件本身如果不具備的話,那么就失去了做單元測(cè)試的基礎(chǔ)。這種情況下,企業(yè)可能需要考慮先下決心建立軟件質(zhì)量保證的流程體系,再來(lái)進(jìn)一步細(xì)化具體的單元測(cè)試工作(敏捷開發(fā)對(duì)文檔沒(méi)有強(qiáng)制要求,敏捷開發(fā)依賴的是成員高度的共識(shí)和信息通暢,低文檔,高溝通。單元測(cè)試依據(jù)的內(nèi)容本質(zhì)上沒(méi)有區(qū)別,只不過(guò)更多通過(guò)溝通結(jié)果來(lái)作為無(wú)形的依據(jù)。這個(gè)有機(jī)會(huì)可以深入探討)。
因此,耗時(shí)費(fèi)力,成效模糊難以直觀預(yù)見是軟件研發(fā)人員進(jìn)行單元測(cè)試時(shí)需要排除的困難,而不是單元測(cè)試沒(méi)有意義的原因。在來(lái)談困難以及解決辦法之前,我們應(yīng)當(dāng)先明確什么是對(duì)的。單元測(cè)試是很有必要的,功能安全標(biāo)準(zhǔn)制定者將其作為關(guān)鍵的軟件驗(yàn)證過(guò)程是有很高的指導(dǎo)意義的。軟件單元測(cè)試可以有效提升軟件整體的質(zhì)量和健壯性。除非極簡(jiǎn)單的軟件系統(tǒng),單元測(cè)試如果不充分,做再多的系統(tǒng)測(cè)試也是不夠的,就好比掃雷不徹底,始終有觸雷的隱患。
03
單元測(cè)試到底在做什么,要做到什么程度?
軟件單元是軟件最小的設(shè)計(jì)單位,軟件單元的實(shí)現(xiàn)需要依據(jù)軟件設(shè)計(jì)需求。根據(jù)IEC 61508的要求,即“每個(gè)軟件模塊應(yīng)當(dāng)按軟件設(shè)計(jì)所規(guī)定的進(jìn)行測(cè)試。這些測(cè)試應(yīng)當(dāng)表明每個(gè)軟件模塊將執(zhí)行其預(yù)期功能,且不會(huì)執(zhí)行非預(yù)期功能”。因此單元測(cè)試的核心目標(biāo)是確保軟件單元同軟件設(shè)計(jì)的一致性。
為了確保一致性,功能安全標(biāo)準(zhǔn)列出了多種單元測(cè)試的方法。其中等價(jià)類測(cè)試和基于結(jié)構(gòu)的測(cè)試對(duì)于單元測(cè)試來(lái)說(shuō)是充足的。邊界值測(cè)試和控制流程分析可以有效降低測(cè)試用例的數(shù)目。用盡可能少的用例來(lái)完成充足的測(cè)試是單元測(cè)試的最高追求。
1. 等價(jià)類測(cè)試
等價(jià)類測(cè)試指的是將測(cè)試的輸入分成幾類,每一類提供一個(gè)有代表性的輸入進(jìn)行測(cè)試即可。這種方法免除了窮盡所有可能性的不切實(shí)際的測(cè)試方法,通過(guò)減少測(cè)試用例的數(shù)目到可接受的程度,可以有效提升測(cè)試的成效。
等價(jià)類劃分的方法有兩種:
1)從設(shè)計(jì)需求推導(dǎo)等價(jià)類??梢詮妮斎霐?shù)據(jù)的角度,或者從輸出數(shù)據(jù)的角度進(jìn)行劃分。
2)
從程序的內(nèi)部結(jié)構(gòu)推導(dǎo)等價(jià)類。可以根據(jù)靜態(tài)分析后的程序路徑來(lái)進(jìn)行劃分。
2. 基于結(jié)構(gòu)的測(cè)試
基于結(jié)構(gòu)的測(cè)試,又稱白盒測(cè)試,是基于代碼來(lái)進(jìn)行測(cè)試的一種技術(shù)。該測(cè)試方法關(guān)注代碼的內(nèi)部結(jié)構(gòu),需要研發(fā)或測(cè)試人員詳細(xì)了解代碼的內(nèi)部結(jié)構(gòu)。同時(shí)測(cè)試充分性有確定的覆蓋度量方法,可以通過(guò)系統(tǒng)性的增加測(cè)試用例來(lái)提升覆蓋率。
基于結(jié)構(gòu)的測(cè)試方法有多種,比較基礎(chǔ)的包含以下四種。
1)調(diào)用圖覆蓋。也叫做入口點(diǎn)測(cè)試,或者調(diào)用覆蓋測(cè)試。調(diào)用圖指的是子程序調(diào)用的樹形圖。該測(cè)試方法的目的是確保所有的子程序都被至少調(diào)用一次。
2)語(yǔ)句覆蓋。語(yǔ)句覆蓋是最基礎(chǔ)的測(cè)試方法,需要確保所有的語(yǔ)句都至少被測(cè)試一次。該方法較為簡(jiǎn)單,然而對(duì)于測(cè)試來(lái)講精確度不是很高。
3)分支覆蓋。分支覆蓋指的是對(duì)于代碼的分支結(jié)構(gòu),需要確保所有的分支都被至少測(cè)試一次。該方法相對(duì)語(yǔ)句覆蓋,其測(cè)試精確度有較明顯的提升。
4)
MC/DC 覆蓋。修正的條件判定覆蓋,其針對(duì)的是程序的分支結(jié)構(gòu),并且影響分支走向的是多種條件的組合判定。該方法需要確保所有條件均能夠至少影響分支走向一次。該測(cè)試方法相對(duì)分支覆蓋,其測(cè)試精確度有了更高的提升。并且可以確保以最少的用例數(shù)目,達(dá)到更精確化測(cè)試的目的。以上是IEC 61508功能安全標(biāo)準(zhǔn)對(duì)基于結(jié)構(gòu)測(cè)試的基礎(chǔ)推薦方法。其中每一種測(cè)試覆蓋方法,均要達(dá)到100%的覆蓋。更高級(jí)的基于結(jié)構(gòu)的測(cè)試方法還有LCSAJ線性代碼序列和跳轉(zhuǎn)測(cè)試、數(shù)據(jù)流、基本路徑等覆蓋測(cè)試方法。有興趣的讀者可以進(jìn)一步研究,并結(jié)合代碼特征靈活進(jìn)行選用。
3. 邊界值測(cè)試
通常軟件錯(cuò)誤通常會(huì)出現(xiàn)在軟件參數(shù)的邊界點(diǎn)。邊界值測(cè)試要求測(cè)試應(yīng)涵蓋等價(jià)類的邊界和極端情況,同時(shí)還要檢查需求中的邊界同程序中的邊界是否一致。通常情況下,零值特別容易引起錯(cuò)誤,需要特別注意零值的測(cè)試。如:
1)除零錯(cuò)誤
2)空ASCII字符
3)空?;蛘弑碓?/p>
4)滿矩陣
5)
0表項(xiàng)
4. 控制流分析
控制流分析是為了尋找程序結(jié)構(gòu)潛在錯(cuò)誤的一種測(cè)試方法。它通過(guò)采用靜態(tài)測(cè)試技術(shù)來(lái)分析程序的控制流程圖,然后進(jìn)一步分析控制流程圖來(lái)發(fā)現(xiàn)不良的程序?qū)嵺`。通過(guò)控制流程圖分析,可以發(fā)現(xiàn)以下問(wèn)題。
1)
不可達(dá)代碼。也被稱為死代碼,指的是永遠(yuǎn)不會(huì)被觸發(fā)執(zhí)行到的代碼。
2)
打結(jié)的代碼。良好的代碼通常可以將其控制流程圖簡(jiǎn)化為一個(gè)單節(jié)點(diǎn),相反的,不良的代碼則會(huì)簡(jiǎn)化為一個(gè)環(huán)狀結(jié)構(gòu)。
因此,軟件單元測(cè)試是一項(xiàng)有明確的測(cè)試方法指導(dǎo),并且具備充分性度量的標(biāo)準(zhǔn)的一項(xiàng)測(cè)試工作。在設(shè)定測(cè)試方法時(shí),可以根據(jù)待測(cè)軟件的質(zhì)量或安全要求級(jí)別,選取適合的測(cè)試方法組合。
在下一期“軟件單元測(cè)試真的有必要嗎?(下)”中,將深入探討單元測(cè)試過(guò)程中,如何在保質(zhì)保量完成測(cè)試任務(wù)的同時(shí),縮減時(shí)間成本、提高測(cè)試效率,并分享目前行業(yè)內(nèi)的實(shí)踐經(jīng)驗(yàn)以及相關(guān)自動(dòng)化測(cè)試工具。
審核編輯 黃宇
-
單元測(cè)試
+關(guān)注
關(guān)注
0文章
54瀏覽量
3514
發(fā)布評(píng)論請(qǐng)先 登錄
嵌入式軟件單元測(cè)試必要性與專業(yè)工具重要性的系統(tǒng)性專業(yè)研究報(bào)告
資料] 汽車軟件質(zhì)量躍遷的系統(tǒng)性路徑:基于ISO 26262標(biāo)準(zhǔn)的單元測(cè)試體系重構(gòu)與中日實(shí)踐深度對(duì)比(2026學(xué)術(shù)研究報(bào)告)
汽車軟件質(zhì)量躍遷的系統(tǒng)性路徑:基于ISO 26262標(biāo)準(zhǔn)的單元測(cè)試體系重構(gòu)與中日實(shí)踐深度對(duì)比(2026學(xué)術(shù)研究報(bào)告)
嵌入式軟件單元測(cè)試中AI自動(dòng)化與人工檢查的協(xié)同機(jī)制研究:基于專業(yè)工具的實(shí)證分析
C語(yǔ)言單元測(cè)試在嵌入式軟件開發(fā)中的作用及專業(yè)工具的應(yīng)用
嵌入軟件單元測(cè)試的全面研究與實(shí)踐
新能源汽車質(zhì)量保證體系與傳統(tǒng)汽車單元測(cè)試規(guī)范的融合研究
單元測(cè)試專業(yè)工具在新能源開發(fā)中的作用研究
嵌入式軟件測(cè)試與專業(yè)測(cè)試工具的必要性深度解析
邊聊安全 | 軟件單元測(cè)試的設(shè)計(jì)方法
軟件單元測(cè)試真的有必要嗎?(上)
評(píng)論