王飛 向嫄
摘要:軟件單元測試是軟件測試的基礎,是保證軟件質量的一個重要階段,同時也是發現軟件缺陷的關鍵步驟,在核電數據庫軟件的測試以及范圍更廣泛的驗證和確認工作中占有重要地位。本文從單元測試的基本概念入手,介紹了單元測試的方法,然后重點闡述了利用自動化測試工具C++Test對核電數據庫軟件進行單元測試的過程。
關鍵詞:軟件單元測試;C++Test;數據庫軟件
中圖分類號:TP271 文獻標識碼:A
文章編號:1009-3044(2019)12-0001-03
開放科學(資源服務)標識碼(OSID):
The Research Application of C++ Test in Database Software of Nuclear Power Unit Testing
WANG Fei, XIANG Yuan
(China Nuclear Control System Engineering Co LTD, Beijing 100176, China)
Abstract: Software unit testing is the foundation of software testing and an important stage of software quality assurance. It is a key step in finding software defects and plays an important role in the testing of database software of the nuclear power plant and in the wider scope of the verification and validation. At first, this article gives a short introduction of unit testing and introduces the method of unit testing. Then it goes deeper into how to use C++Test to do unit testing in database software of nuclear power plant.
Key words: software unit testing; C++Test; database software
核電數據庫軟件是核電廠數字化儀控系統的重要組成部分,它相當于一個數據處理中心,起到數據交換區的作用。數據庫軟件的質量和可靠性是保障核電廠正常運轉的關鍵,而對數據庫軟件的測試是達到軟件質量目標的一個重要手段。在軟件工程實踐中,測試有助于軟件滿足核電標準中的質量和可靠性要求。作為軟件測試中一個不可或缺的組成部分,單元測試是各層次測試的基礎,是軟件驗證和確認的大框架中的一項重要活動。
本文研究了基于測試工具C++Test的軟件單元測試,主要介紹了單元測試的方法,并著重闡述了利用C++Test測試工具對核電數據庫軟件進行單元測試的方法及流程,并對測試結果進行了分析,給出了測試報告。
1 單元測試
單元測試采用的測試技術分為兩種:靜態測試和動態測試。動態測試的方法又分為白盒測試和黑盒測試,其中白盒測試為主,黑盒測試為輔。
1.1 靜態測試方法
代碼的靜態測試是單元測試的第一步,目的是盡量通過人工檢查來發現代碼的錯誤,以最小成本保證代碼中算法的邏輯正確性、清晰性、規范性、一致性、算法高效性。
靜態測試的過程:
1) 準備:測試負責人向測試人員分發代碼規范、審查標準、軟件詳細設計說明書和單元測試計劃等文檔,確定測試的代碼版本和測試環境等;
2) 代碼審查:依據相應的審查標準,仔細閱讀代碼,對照相關材料,發現和記錄問題;
3) 形成報告:將發現的問題形成(也可由測試工具輸出)靜態分析報告。
1.2 動態測試方法
動態測試的方法分為白盒測試和黑盒測試。黑盒測試又稱為功能測試、數據測試或規格測試。在不需要了解測試對象內部情況下,依據詳細設計說明書/需求規格說明書中的功能來設計和執行測試用例。白盒測試又稱結構、邏輯測試或程序測試。這種測試需要了解程序的內部情況,并依據內部構造設計和執行測試用例。單元測試時一般采用白盒測試。白盒測試測試方法有邏輯覆蓋法和基本路徑法。
2 C++Test測試工具
C++Test是一款針對C/C++的單元測試工具,使用C++Test進行單元測試,測試流程分為建立測試工程、靜態測試、動態測試和生成測試報告。每個流程都需要進行相應的配置和一些需要注意的事項。
(1)建立測試工程
建立測試工程的關鍵步驟是配置編譯器,須在Project Configuration中進行編譯器的配置,這一步非常關鍵,因為編譯器配置錯誤將導致整個測試無法進行。由于C++Test能和多種開發環境相集成,所以具體的配置應該和用戶開發環境的編譯器相一致。
(2)靜態測試
C++Test對每個規范都給出了詳細的說明和示例,通過對每一個檢測到的沖突進行分析,可以提高靜態分析的效率和正確性。但是C++Test的靜態測試只是使用編程規范對源文件進行掃描,規范不同,得到的結果也不同。因此我們應該根據項目的實際需要選擇和配置合適的測試規范,不然有可以能遺漏不少問題,另一方面,盲目的擴大測試規范可能產生大量冗余的測試結果,這也會增加測試人員的分析工作量。
(3)動態測試
C++Test能對被測單元進行詳盡的邏輯覆蓋測試,包括行覆蓋率,語句覆蓋率,塊覆蓋率,分支覆蓋率,路徑覆蓋率,條件覆蓋率,可變條件覆蓋率;同時通過將黑盒測試的大部分操作形成自動化,大大減輕了黑盒測試的負擔。
進行動態測試時,測試用例的設計應充分與覆蓋率相結合,系統分析測試用例的設計的合理性和充分性,并根據覆蓋率適當增加測試用例。
3 利用C++Test對核電數據庫軟件進行單元測試
應用上述討論的軟件單元測試方法,利用C++Test測試工具完成了核電廠數據庫軟件的單元測試。下面以核電廠數據庫軟件中添加標簽點函數AddTag.cpp為例,詳細說明C++Test進行單元測試的實現過程,并對結果進行分析。
示例程序AddTag.cpp是數據庫軟件在添加標簽點時獲取標簽ID的函數。軟件的源代碼如下:
nicInt32 CTagVector::AddTag(nicOUT nicUInt32* pTagId)
{
if (Size_ < nCapacity_)
{
*pTagId = (nicUInt32)Size_;
Size_++;
}
else if (DeletedHead_ == nicTagId_Unused)
{
nicInt32 nRet = ReAlloc();
if (nicErr(nRet))
{
return nRet;
}
*pTagId = (nicUInt32)Size_;
Size_++;
}
else
{
*pTagId = DeletedHead_;
DeletedHead_ = pData_[DeletedHead_].ParentId;
if (DeletedHead_ == nicTagId_Unused)
{
DeletedTail_ = nicTagId_Unused;
}
else
{
ACE_ASSERT(DeletedTail_ != * pTagId);
ACE_ASSERT(IsDeleted(DeletedHead_));
}
}
InitRecord(* pTagId);
++nCurTagCount_;
IsChange_ = 1;
return nicRET_OK;
}
程序的流程圖如下圖1所示。
3.1 靜態測試及結果分析
輸入新建工程名,導入工程文件,進行編譯器配置,讀取源文件,配置測試規范,進行靜態分析。。C++Test列出了源文件與規范不符的所有地方,并給出了很多詳細的信息,對其進行分析能幫助我們較快的定位錯誤和進行改進。
3.2 動態測試及結果分析
選中添加標簽點(AddTag)函數,會自動生成測試用例。自動生成的測試用例,無法滿足對代碼覆蓋率的要求,要在此基礎上對測試用例進行修改和添加[6]。如圖1所示,示例程序的代碼流程中有4個分支點,需要設計測試用例使每個分支點取真(T)、取假(F)各1次,同時由于函數調用了ReAlloc()用于分配空間的函數,需要在設計用例時對其打樁,因此,設計了7個測試用例,每個測試用例的內容和測試的分支點總結列于表1中。測試用例建立并編輯完成后,C++Test可自動依次執行每個測試用例。在測試用例執行過程中,C++Test會檢查單元模塊的實際輸出結果是否與期望值一致,統計執行每個測試用例時軟件覆蓋情況。如果測試用例中存在設計輸出值與期望值不符,則說明該單元模塊代碼存在功能錯誤;如果測試結果未實現100%覆蓋,則說明對該單元模塊的邏輯結構沒有實現完全測試[7]。從圖中可以看到測試用例對代碼的語句覆蓋、塊覆蓋、路徑覆蓋、決策覆蓋均達到了100%。
3.3 生成測試報告
C++Test的測試報告可以生成文本,以及自定義的HTML報告。這些報告將促使測試人員對軟件測試的進度進行控制,以及判斷軟件執行的對錯。
4 結論
單元測試是軟件測試的基礎,其重要性得到了廣泛的認可。C++Test是當前較為實用的單元測試軟件。本文通過運行C++Test測試工具對核電數據庫軟件進行單元測試,重點闡述了測試方法及測試流程。運用C++Test測試工具,提高了工作效率,完備了單元測試的完整性,有效地保證了核電數據庫軟件開發的代碼質量。
參考文獻:
[1] 劉樂,張奇.核電廠安全系統軟件單元測試的安全審評[J].核安全,2013:74-78.
[2] 張巍,尹海波.軟件的單元測試方法[J].光電技術應用,2006,21(2):36238.
[3] IEEE Std 610.12-1990“IEEE Standard Glossary of Software Engineering Terminology”.
[4] 朱少民.軟件測試方法和技術[M].清華大學出版社,2010:30-62.
[5] 徐宏革,郭慶,雷濤,等.白盒測試之道—C++test[M].北京航空航天大學出版社,2011:63-64.
[6] 張志成.數字化安全系統軟件單元測試中的測試用例設計策略[J].第一屆中國(國際)核電儀控技術大會,2011.
[7] 李鐸,張良駒,馮俊婷.安全軟件驗證與確認中的單元模塊測試技術[J].原子能科學技術,2008,42(6).
【通聯編輯:梁書】