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