軟件驗(yàn)證和測(cè)試是軟件開(kāi)發(fā)必不可少的部分。投入到特定項(xiàng)目中的努力和預(yù)算取決于許多因素,如項(xiàng)目的功能安全性、業(yè)務(wù)風(fēng)險(xiǎn)水平或組織的質(zhì)量文化。不管是什么因素促使組織實(shí)施質(zhì)量管控,生產(chǎn)安全和高質(zhì)量的軟件產(chǎn)品需要的不僅僅是決心。
選擇合適的測(cè)試方法是一項(xiàng)具有挑戰(zhàn)性的任務(wù)。技術(shù)正在快速發(fā)展,公司必須選擇采用哪種軟件測(cè)試工具。許多情況下,在開(kāi)源和商業(yè)產(chǎn)品之間進(jìn)行選擇也很困難。
這篇文章解釋了自動(dòng)化測(cè)試技術(shù),如高級(jí)靜態(tài)分析,運(yùn)行時(shí)內(nèi)存監(jiān)控,自動(dòng)化單元測(cè)試和數(shù)據(jù)流分析,可以組合使用以提高軟件質(zhì)量,并確定使用測(cè)試工具的好處。我們討論的話題是通用的,可以適用于任何編程語(yǔ)言,但這里的例子是C和C++編程語(yǔ)言,我們使用Parasoft C/C++test。
缺陷類與工具自動(dòng)化
當(dāng)考慮到可能的高級(jí)軟件故障時(shí),可以將軟件錯(cuò)誤分為幾種類型:由于缺失需求而導(dǎo)致的錯(cuò)誤、由指定需求引起的錯(cuò)誤以及由于需求被錯(cuò)誤編碼而產(chǎn)生的錯(cuò)誤。前兩類軟件缺陷屬于需求工程范疇,在這里將不再討論。我們這里關(guān)注的是需求的錯(cuò)誤實(shí)現(xiàn),其中包括許多團(tuán)隊(duì)所面臨的各種各樣的潛在軟件問(wèn)題。那么,需求的不正確編碼意味著什么呢?它能導(dǎo)致很多種情況,例如:需求的實(shí)現(xiàn)不正確——需求相關(guān)的單元測(cè)試失敗并且自動(dòng)化測(cè)試工具報(bào)告出缺陷。另一個(gè)例子,運(yùn)行時(shí)分析工具可以在單元測(cè)試中檢測(cè)到無(wú)法從單元測(cè)試結(jié)果單獨(dú)檢測(cè)到的關(guān)鍵存儲(chǔ)器訪問(wèn)錯(cuò)誤。不同的工具更好地檢測(cè)某些類型的錯(cuò)誤,如下所示。
▲
圖 1. 軟件缺陷和檢查策略圖
顯然,并非每一個(gè)軟件項(xiàng)目都需要使用所有可用的技術(shù)來(lái)測(cè)試和改進(jìn)軟件質(zhì)量,組織面臨著如何平衡預(yù)算和質(zhì)量的兩難困境。與功能安全相關(guān)的項(xiàng)目可能會(huì)選擇所有可用的技術(shù)以確保質(zhì)量不受影響,以及符合軟件安全標(biāo)準(zhǔn),如ISO 26262。其他團(tuán)隊(duì)可能會(huì)決定只選擇靜態(tài)分析和單元測(cè)試,因?yàn)樗鼈兯坪醺采w了軟件缺陷的一大部分,并且一些團(tuán)隊(duì)可能會(huì)找到足夠的開(kāi)源單元測(cè)試框架。
不愿意使用多種的測(cè)試技術(shù)往往源于這樣一種擔(dān)心:使用多種技術(shù)會(huì)給開(kāi)發(fā)速度帶來(lái)巨大的開(kāi)銷,更不用說(shuō)預(yù)算了。如果團(tuán)隊(duì)決定選擇未知的工具,這些問(wèn)題就更加明顯。多個(gè)單獨(dú)工具的成本、學(xué)習(xí)曲線以及在不同的使用模型和接口之間切換的必要性都是需要考慮的。因此,開(kāi)發(fā)人員可能會(huì)避免使用工具和自動(dòng)化,因?yàn)檫@將他們的注意力從編寫代碼轉(zhuǎn)向工具使用,從而降低了他們的生產(chǎn)率。
統(tǒng)一測(cè)試工具的價(jià)值
在討論一個(gè)統(tǒng)一的測(cè)試工具的價(jià)值之前,一定要詳細(xì)說(shuō)明對(duì)它的期望。理想情況下,一個(gè)工具應(yīng)該具有以下功能:
·支持多種測(cè)試技術(shù)
·使用簡(jiǎn)單
·檢測(cè)函數(shù)問(wèn)題和回歸測(cè)試
· 提供從需求到測(cè)試的可追溯性
·度量代碼的復(fù)雜性、可移植性和可維護(hù)性
·通過(guò)在編寫代碼時(shí)提供即時(shí)反饋來(lái)改善開(kāi)發(fā)人員代碼編寫習(xí)慣
·提供開(kāi)發(fā)程序進(jìn)度的信息
·綜合多種技術(shù)的高級(jí)分析結(jié)果
一個(gè)統(tǒng)一的、集成的測(cè)試工具可以避免許多問(wèn)題:
·多個(gè)學(xué)習(xí)曲線和可用性問(wèn)題,使用不同接口的獨(dú)立工具
·分散開(kāi)發(fā)人員編寫代碼
·防止工具鏈的不同元素之間的信息交換
盡可能多的檢測(cè)缺陷
軟件缺陷分屬于不同的類別,因此不能期望所有的缺陷都通過(guò)一種測(cè)試技術(shù)進(jìn)行識(shí)別。例如,手動(dòng)系統(tǒng)級(jí)測(cè)試。下面提供一個(gè)更具體的示例,請(qǐng)觀察以下示例代碼片段:
上面幾行代碼包含幾個(gè)問(wèn)題。具體地說(shuō),在第16行中,開(kāi)發(fā)人員試圖使用calculateIdx()函數(shù)中計(jì)算的索引值初始化全局緩沖區(qū),但他們無(wú)法驗(yàn)證它是否在允許的范圍內(nèi)。即使運(yùn)行了數(shù)十個(gè)手動(dòng)測(cè)試會(huì)話,它們也可能不會(huì)揭示這個(gè)問(wèn)題,因?yàn)橄螂S機(jī)內(nèi)存位置寫入一個(gè)整數(shù)值幾乎不會(huì)立即產(chǎn)生意外的效果。
但是有一天,最有可能在發(fā)布之后,內(nèi)存布局產(chǎn)生改變,第16行的操作會(huì)破壞應(yīng)用程序。有趣的是,由于用于計(jì)算索引的循環(huán),靜態(tài)分析也不能標(biāo)記這個(gè)問(wèn)題。由于性能原因,在靜態(tài)分析工具中使用的數(shù)據(jù)和控制流分析會(huì)使用試探法和簡(jiǎn)化法來(lái)確保在合理的時(shí)間內(nèi)完成代碼分析,并且通常它們也會(huì)應(yīng)用于循環(huán)中,這意味著可能會(huì)丟失一些錯(cuò)誤。
使用內(nèi)存監(jiān)控工具,通過(guò)注入特殊檢查和報(bào)告不正確的內(nèi)存操作來(lái)檢測(cè)源代碼,肯定會(huì)檢測(cè)到這個(gè)錯(cuò)誤。運(yùn)行時(shí)分析工具只在實(shí)際執(zhí)行的路徑上檢測(cè)軟件問(wèn)題,而不進(jìn)行任何猜測(cè)——這是靜態(tài)分析的一大優(yōu)勢(shì),因?yàn)閳?bào)告的問(wèn)題的準(zhǔn)確性非常高。
在本例中,Parasoft的內(nèi)存錯(cuò)誤檢測(cè)很容易發(fā)現(xiàn)問(wèn)題:
相反的情況也是存在的——靜態(tài)分析可以檢測(cè)運(yùn)行時(shí)內(nèi)存監(jiān)視無(wú)法識(shí)別的問(wèn)題。例如,在下面的代碼段中,第27/28行有一個(gè)空指針引用的可能性。使用的person指針參數(shù)為Null時(shí),調(diào)用storePersonToFile函數(shù)會(huì)發(fā)生錯(cuò)誤,但是只有當(dāng)retrivePersonFromDB函數(shù)返回null時(shí)才會(huì)報(bào)錯(cuò)。在系統(tǒng)測(cè)試期間不太可能出現(xiàn)這種情況,因?yàn)閿?shù)據(jù)庫(kù)連接很可能像預(yù)期的那樣運(yùn)行,所以運(yùn)行時(shí)內(nèi)存監(jiān)測(cè)工具并不能發(fā)現(xiàn)問(wèn)題。然而,靜態(tài)分析工具中的流分析很容易檢測(cè)到要從這個(gè)函數(shù)返回的空指針,并報(bào)告一個(gè)潛在的空指針引用問(wèn)題。
▲
圖 4. 靜態(tài)分析結(jié)果示例.
檢查函數(shù)問(wèn)題和回歸測(cè)試
那些總是執(zhí)行起來(lái)無(wú)缺陷,但不符合要求的代碼呢?靜態(tài)和動(dòng)態(tài)分析在識(shí)別這類問(wèn)題時(shí)沒(méi)有用處。要檢測(cè)預(yù)期結(jié)果與實(shí)際結(jié)果之間的差異,需要將計(jì)算結(jié)果與預(yù)定義值進(jìn)行比較。實(shí)現(xiàn)這種檢查有許多的方法,包括手動(dòng)系統(tǒng)級(jí)測(cè)試、集成測(cè)試和單元測(cè)試。在許多領(lǐng)域,統(tǒng)一的測(cè)試工具可以促進(jìn)單元測(cè)試過(guò)程。優(yōu)點(diǎn)如下:
·在創(chuàng)建測(cè)試用例時(shí)提高開(kāi)發(fā)人員的執(zhí)行力,例如,通過(guò)提供圖形向?qū)?lái)創(chuàng)建、編輯和配置測(cè)試用例
·與Test Double框架相結(jié)合,允許簡(jiǎn)單的mock和stub來(lái)模擬復(fù)雜的測(cè)試場(chǎng)景,而不涉及大型代碼庫(kù)。
·相關(guān)測(cè)試用例代碼覆蓋率報(bào)告評(píng)估測(cè)試的完整性
·通過(guò)自動(dòng)計(jì)算驗(yàn)證代碼增量所需的最小測(cè)試用例集來(lái)優(yōu)化測(cè)試用例
·將代碼覆蓋率報(bào)告與其他測(cè)試技術(shù)相結(jié)合,如手動(dòng)或系統(tǒng)級(jí)測(cè)試或集成測(cè)試以識(shí)別未經(jīng)測(cè)試的代碼
·跟蹤結(jié)果并與需求關(guān)聯(lián)以更好的理解失敗測(cè)試的影響
使用圖形化向?qū)Щ蚓庉嬈鲃?chuàng)建測(cè)試,可以讓QA團(tuán)隊(duì)參與到編寫單元測(cè)試的過(guò)程,從而提高整個(gè)組織的生產(chǎn)力,使他們積極地為開(kāi)發(fā)過(guò)程做出貢獻(xiàn)。對(duì)于QA團(tuán)隊(duì)成員來(lái)說(shuō),使用圖形向?qū)П仍诖a編輯器中編寫適當(dāng)?shù)臏y(cè)試代碼更容易,因?yàn)槭褂幂斎氡韱?如下所示)配置值不需要高級(jí)的編碼技能,而且更省時(shí),尤其是在團(tuán)隊(duì)成員缺乏經(jīng)驗(yàn)的情況下。例如,下面的屏幕截圖顯示了Parasoft C/ C++test在實(shí)現(xiàn)C/C++單元測(cè)試能力的一個(gè)示例,該向?qū)椭鷦?chuàng)建單元測(cè)試。
使用統(tǒng)一測(cè)試工具的另一個(gè)好處是它提供了關(guān)于測(cè)試完整性和關(guān)鍵業(yè)務(wù)需求的狀態(tài)反饋。MC/DC覆蓋率報(bào)告中的低數(shù)字可能表明分支覆蓋率不足,即使報(bào)表覆蓋報(bào)告顯示了高值。這種分析需要一個(gè)支持多覆蓋率度量的工具鏈,允許團(tuán)隊(duì)從簡(jiǎn)單的東西開(kāi)始,比如行或語(yǔ)句覆蓋率,并在改進(jìn)測(cè)試用例的過(guò)程中繼續(xù)進(jìn)行更徹底的代碼覆蓋率。
測(cè)試可追溯性需求
單元測(cè)試和系統(tǒng)測(cè)試覆蓋報(bào)告是關(guān)于測(cè)試過(guò)程的一大信息源,尤其是當(dāng)它們結(jié)合在一起時(shí)。但是,如果測(cè)試結(jié)果與需求不相關(guān),團(tuán)隊(duì)就會(huì)缺少一些關(guān)鍵信息。通過(guò)查看測(cè)試到可追溯性的需求報(bào)告,您可以快速確定需求覆蓋率的狀態(tài)。此種情況的一個(gè)例子如下:
將需求與來(lái)自不同類型測(cè)試的結(jié)果關(guān)聯(lián)起來(lái)的能力是使用統(tǒng)一測(cè)試工具的一大好處。單元測(cè)試,系統(tǒng)測(cè)試,集成測(cè)試結(jié)果,編碼標(biāo)準(zhǔn)和代碼度量結(jié)果可以通過(guò)關(guān)聯(lián)來(lái)提供對(duì)關(guān)鍵和非關(guān)鍵需求的狀態(tài)反饋。
結(jié)合不同技術(shù)的結(jié)果進(jìn)行高級(jí)分析
當(dāng)你組合來(lái)自項(xiàng)目中使用的各種測(cè)試技術(shù)的數(shù)據(jù)時(shí),你可以獲得二級(jí)度量和更復(fù)雜的分析。使用統(tǒng)一的測(cè)試工具使團(tuán)隊(duì)能夠從全新的角度來(lái)審查代碼。單元測(cè)試用例執(zhí)行失敗對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)可能有不同的含義,這取決于它是發(fā)生在代碼度量分析中的高風(fēng)險(xiǎn)還是低風(fēng)險(xiǎn)代碼中。如果將這些信息與來(lái)自源碼控制的統(tǒng)計(jì)信息進(jìn)一步結(jié)合,并與需求相關(guān)聯(lián),團(tuán)隊(duì)就可以更好地決定何時(shí)以及如何糾正代碼。
使用Parasoft的工具套件,你可以利用基于變更的測(cè)試來(lái)提高團(tuán)隊(duì)的生產(chǎn)力。基于變更的測(cè)試通過(guò)捕獲源代碼、測(cè)試用例和代碼覆蓋結(jié)果之間的關(guān)系,來(lái)計(jì)算并驗(yàn)證特定代碼增量相關(guān)測(cè)試用例的最優(yōu)集。實(shí)際上,團(tuán)隊(duì)可以通過(guò)只運(yùn)行整個(gè)回歸套件的一小部分測(cè)試來(lái)限制他們的測(cè)試會(huì)話。這種只專注于絕對(duì)需要部分的測(cè)試,節(jié)省了大量的時(shí)間與資金,特別是對(duì)于中型或大型項(xiàng)目更是如此。
結(jié)合使用:ParasoftC/C++test and DTP
上面討論的所有測(cè)試技術(shù)都可以在Parasoft C/C++test和Parasoft DTP中使用。Parasoft C/C++test是針對(duì)C和C++項(xiàng)目的統(tǒng)一測(cè)試工具。C/C++test 作為插件嵌入當(dāng)前主流的IDE中,如 Eclipse和Visual Studio與IDE的緊密集成可以防止上面討論的問(wèn)題。開(kāi)發(fā)人員在編寫代碼時(shí)即可立即運(yùn)行編碼標(biāo)準(zhǔn)遵從性檢查或執(zhí)行單元測(cè)試。QA團(tuán)隊(duì)成員可以執(zhí)行手動(dòng)測(cè)試場(chǎng)景,同時(shí)監(jiān)視應(yīng)用程序的代碼覆蓋率和運(yùn)行時(shí)錯(cuò)誤。離線分析,例如由靜態(tài)分析提供的流分析,可以在連續(xù)集成階段中執(zhí)行。使用支持命令行接口的服務(wù)器會(huì)話,將分析結(jié)果報(bào)告給Parasoft DTP,以便于收集來(lái)自開(kāi)發(fā)環(huán)境的信息。Parasoft DTP提供了廣泛的報(bào)告能力,包括集成來(lái)自第三方工具的數(shù)據(jù)、在工作流的每個(gè)階段提供測(cè)試反饋的能力,這加速了敏捷開(kāi)發(fā)并降低了符合安全標(biāo)準(zhǔn)的成本。
還應(yīng)該注意到,這里討論的質(zhì)量保證相關(guān)的過(guò)程和體系結(jié)構(gòu)并不局限于C/C++項(xiàng)目。Parasoft為Java和C#/.NET提供相似的解決方案。
總結(jié)
軟件質(zhì)量改進(jìn)不是同質(zhì)化的工作,它需要不同的技術(shù)來(lái)消除不同類型的軟件缺陷。關(guān)鍵的挑戰(zhàn)是如何以一種有效的方式來(lái)實(shí)現(xiàn)這個(gè)目標(biāo),從而避免破壞項(xiàng)目預(yù)算并削弱開(kāi)發(fā)人員的積極性。集成到開(kāi)發(fā)人員IDE中的統(tǒng)一測(cè)試工具為開(kāi)發(fā)測(cè)試提供了最有效的環(huán)境。一個(gè)統(tǒng)一的工具,比如Parasoft的C/ C++ test,它具有統(tǒng)一測(cè)試軟件各個(gè)方面的能力,并提供統(tǒng)一的度量和結(jié)果,允許團(tuán)隊(duì)將測(cè)試集中在高風(fēng)險(xiǎn)和最近修改的代碼上,從而提供了更多的好處。
-
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1947瀏覽量
34807 -
軟件測(cè)試
+關(guān)注
關(guān)注
2文章
231瀏覽量
18606
原文標(biāo)題:為什么得要使用標(biāo)準(zhǔn)C/C++測(cè)試工具?
文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論