王飛 向嫄
摘要:軟件單元測(cè)試是軟件測(cè)試的基礎(chǔ),是保證軟件質(zhì)量的一個(gè)重要階段,同時(shí)也是發(fā)現(xiàn)軟件缺陷的關(guān)鍵步驟,在核電數(shù)據(jù)庫(kù)軟件的測(cè)試以及范圍更廣泛的驗(yàn)證和確認(rèn)工作中占有重要地位。本文從單元測(cè)試的基本概念入手,介紹了單元測(cè)試的方法,然后重點(diǎn)闡述了利用自動(dòng)化測(cè)試工具C++Test對(duì)核電數(shù)據(jù)庫(kù)軟件進(jìn)行單元測(cè)試的過(guò)程。
關(guān)鍵詞:軟件單元測(cè)試;C++Test;數(shù)據(jù)庫(kù)軟件
中圖分類號(hào):TP271 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)12-0001-03
開(kāi)放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(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
核電數(shù)據(jù)庫(kù)軟件是核電廠數(shù)字化儀控系統(tǒng)的重要組成部分,它相當(dāng)于一個(gè)數(shù)據(jù)處理中心,起到數(shù)據(jù)交換區(qū)的作用。數(shù)據(jù)庫(kù)軟件的質(zhì)量和可靠性是保障核電廠正常運(yùn)轉(zhuǎn)的關(guān)鍵,而對(duì)數(shù)據(jù)庫(kù)軟件的測(cè)試是達(dá)到軟件質(zhì)量目標(biāo)的一個(gè)重要手段。在軟件工程實(shí)踐中,測(cè)試有助于軟件滿足核電標(biāo)準(zhǔn)中的質(zhì)量和可靠性要求。作為軟件測(cè)試中一個(gè)不可或缺的組成部分,單元測(cè)試是各層次測(cè)試的基礎(chǔ),是軟件驗(yàn)證和確認(rèn)的大框架中的一項(xiàng)重要活動(dòng)。
本文研究了基于測(cè)試工具C++Test的軟件單元測(cè)試,主要介紹了單元測(cè)試的方法,并著重闡述了利用C++Test測(cè)試工具對(duì)核電數(shù)據(jù)庫(kù)軟件進(jìn)行單元測(cè)試的方法及流程,并對(duì)測(cè)試結(jié)果進(jìn)行了分析,給出了測(cè)試報(bào)告。
1 單元測(cè)試
單元測(cè)試采用的測(cè)試技術(shù)分為兩種:靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試。動(dòng)態(tài)測(cè)試的方法又分為白盒測(cè)試和黑盒測(cè)試,其中白盒測(cè)試為主,黑盒測(cè)試為輔。
1.1 靜態(tài)測(cè)試方法
代碼的靜態(tài)測(cè)試是單元測(cè)試的第一步,目的是盡量通過(guò)人工檢查來(lái)發(fā)現(xiàn)代碼的錯(cuò)誤,以最小成本保證代碼中算法的邏輯正確性、清晰性、規(guī)范性、一致性、算法高效性。
靜態(tài)測(cè)試的過(guò)程:
1) 準(zhǔn)備:測(cè)試負(fù)責(zé)人向測(cè)試人員分發(fā)代碼規(guī)范、審查標(biāo)準(zhǔn)、軟件詳細(xì)設(shè)計(jì)說(shuō)明書和單元測(cè)試計(jì)劃等文檔,確定測(cè)試的代碼版本和測(cè)試環(huán)境等;
2) 代碼審查:依據(jù)相應(yīng)的審查標(biāo)準(zhǔn),仔細(xì)閱讀代碼,對(duì)照相關(guān)材料,發(fā)現(xiàn)和記錄問(wèn)題;
3) 形成報(bào)告:將發(fā)現(xiàn)的問(wèn)題形成(也可由測(cè)試工具輸出)靜態(tài)分析報(bào)告。
1.2 動(dòng)態(tài)測(cè)試方法
動(dòng)態(tài)測(cè)試的方法分為白盒測(cè)試和黑盒測(cè)試。黑盒測(cè)試又稱為功能測(cè)試、數(shù)據(jù)測(cè)試或規(guī)格測(cè)試。在不需要了解測(cè)試對(duì)象內(nèi)部情況下,依據(jù)詳細(xì)設(shè)計(jì)說(shuō)明書/需求規(guī)格說(shuō)明書中的功能來(lái)設(shè)計(jì)和執(zhí)行測(cè)試用例。白盒測(cè)試又稱結(jié)構(gòu)、邏輯測(cè)試或程序測(cè)試。這種測(cè)試需要了解程序的內(nèi)部情況,并依據(jù)內(nèi)部構(gòu)造設(shè)計(jì)和執(zhí)行測(cè)試用例。單元測(cè)試時(shí)一般采用白盒測(cè)試。白盒測(cè)試測(cè)試方法有邏輯覆蓋法和基本路徑法。
2 C++Test測(cè)試工具
C++Test是一款針對(duì)C/C++的單元測(cè)試工具,使用C++Test進(jìn)行單元測(cè)試,測(cè)試流程分為建立測(cè)試工程、靜態(tài)測(cè)試、動(dòng)態(tài)測(cè)試和生成測(cè)試報(bào)告。每個(gè)流程都需要進(jìn)行相應(yīng)的配置和一些需要注意的事項(xiàng)。
(1)建立測(cè)試工程
建立測(cè)試工程的關(guān)鍵步驟是配置編譯器,須在Project Configuration中進(jìn)行編譯器的配置,這一步非常關(guān)鍵,因?yàn)榫幾g器配置錯(cuò)誤將導(dǎo)致整個(gè)測(cè)試無(wú)法進(jìn)行。由于C++Test能和多種開(kāi)發(fā)環(huán)境相集成,所以具體的配置應(yīng)該和用戶開(kāi)發(fā)環(huán)境的編譯器相一致。
(2)靜態(tài)測(cè)試
C++Test對(duì)每個(gè)規(guī)范都給出了詳細(xì)的說(shuō)明和示例,通過(guò)對(duì)每一個(gè)檢測(cè)到的沖突進(jìn)行分析,可以提高靜態(tài)分析的效率和正確性。但是C++Test的靜態(tài)測(cè)試只是使用編程規(guī)范對(duì)源文件進(jìn)行掃描,規(guī)范不同,得到的結(jié)果也不同。因此我們應(yīng)該根據(jù)項(xiàng)目的實(shí)際需要選擇和配置合適的測(cè)試規(guī)范,不然有可以能遺漏不少問(wèn)題,另一方面,盲目的擴(kuò)大測(cè)試規(guī)范可能產(chǎn)生大量冗余的測(cè)試結(jié)果,這也會(huì)增加測(cè)試人員的分析工作量。
(3)動(dòng)態(tài)測(cè)試
C++Test能對(duì)被測(cè)單元進(jìn)行詳盡的邏輯覆蓋測(cè)試,包括行覆蓋率,語(yǔ)句覆蓋率,塊覆蓋率,分支覆蓋率,路徑覆蓋率,條件覆蓋率,可變條件覆蓋率;同時(shí)通過(guò)將黑盒測(cè)試的大部分操作形成自動(dòng)化,大大減輕了黑盒測(cè)試的負(fù)擔(dān)。
進(jìn)行動(dòng)態(tài)測(cè)試時(shí),測(cè)試用例的設(shè)計(jì)應(yīng)充分與覆蓋率相結(jié)合,系統(tǒng)分析測(cè)試用例的設(shè)計(jì)的合理性和充分性,并根據(jù)覆蓋率適當(dāng)增加測(cè)試用例。
3 利用C++Test對(duì)核電數(shù)據(jù)庫(kù)軟件進(jìn)行單元測(cè)試
應(yīng)用上述討論的軟件單元測(cè)試方法,利用C++Test測(cè)試工具完成了核電廠數(shù)據(jù)庫(kù)軟件的單元測(cè)試。下面以核電廠數(shù)據(jù)庫(kù)軟件中添加標(biāo)簽點(diǎn)函數(shù)AddTag.cpp為例,詳細(xì)說(shuō)明C++Test進(jìn)行單元測(cè)試的實(shí)現(xiàn)過(guò)程,并對(duì)結(jié)果進(jìn)行分析。
示例程序AddTag.cpp是數(shù)據(jù)庫(kù)軟件在添加標(biāo)簽點(diǎn)時(shí)獲取標(biāo)簽ID的函數(shù)。軟件的源代碼如下:
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 靜態(tài)測(cè)試及結(jié)果分析
輸入新建工程名,導(dǎo)入工程文件,進(jìn)行編譯器配置,讀取源文件,配置測(cè)試規(guī)范,進(jìn)行靜態(tài)分析。。C++Test列出了源文件與規(guī)范不符的所有地方,并給出了很多詳細(xì)的信息,對(duì)其進(jìn)行分析能幫助我們較快的定位錯(cuò)誤和進(jìn)行改進(jìn)。
3.2 動(dòng)態(tài)測(cè)試及結(jié)果分析
選中添加標(biāo)簽點(diǎn)(AddTag)函數(shù),會(huì)自動(dòng)生成測(cè)試用例。自動(dòng)生成的測(cè)試用例,無(wú)法滿足對(duì)代碼覆蓋率的要求,要在此基礎(chǔ)上對(duì)測(cè)試用例進(jìn)行修改和添加[6]。如圖1所示,示例程序的代碼流程中有4個(gè)分支點(diǎn),需要設(shè)計(jì)測(cè)試用例使每個(gè)分支點(diǎn)取真(T)、取假(F)各1次,同時(shí)由于函數(shù)調(diào)用了ReAlloc()用于分配空間的函數(shù),需要在設(shè)計(jì)用例時(shí)對(duì)其打樁,因此,設(shè)計(jì)了7個(gè)測(cè)試用例,每個(gè)測(cè)試用例的內(nèi)容和測(cè)試的分支點(diǎn)總結(jié)列于表1中。測(cè)試用例建立并編輯完成后,C++Test可自動(dòng)依次執(zhí)行每個(gè)測(cè)試用例。在測(cè)試用例執(zhí)行過(guò)程中,C++Test會(huì)檢查單元模塊的實(shí)際輸出結(jié)果是否與期望值一致,統(tǒng)計(jì)執(zhí)行每個(gè)測(cè)試用例時(shí)軟件覆蓋情況。如果測(cè)試用例中存在設(shè)計(jì)輸出值與期望值不符,則說(shuō)明該單元模塊代碼存在功能錯(cuò)誤;如果測(cè)試結(jié)果未實(shí)現(xiàn)100%覆蓋,則說(shuō)明對(duì)該單元模塊的邏輯結(jié)構(gòu)沒(méi)有實(shí)現(xiàn)完全測(cè)試[7]。從圖中可以看到測(cè)試用例對(duì)代碼的語(yǔ)句覆蓋、塊覆蓋、路徑覆蓋、決策覆蓋均達(dá)到了100%。
3.3 生成測(cè)試報(bào)告
C++Test的測(cè)試報(bào)告可以生成文本,以及自定義的HTML報(bào)告。這些報(bào)告將促使測(cè)試人員對(duì)軟件測(cè)試的進(jìn)度進(jìn)行控制,以及判斷軟件執(zhí)行的對(duì)錯(cuò)。
4 結(jié)論
單元測(cè)試是軟件測(cè)試的基礎(chǔ),其重要性得到了廣泛的認(rèn)可。C++Test是當(dāng)前較為實(shí)用的單元測(cè)試軟件。本文通過(guò)運(yùn)行C++Test測(cè)試工具對(duì)核電數(shù)據(jù)庫(kù)軟件進(jìn)行單元測(cè)試,重點(diǎn)闡述了測(cè)試方法及測(cè)試流程。運(yùn)用C++Test測(cè)試工具,提高了工作效率,完備了單元測(cè)試的完整性,有效地保證了核電數(shù)據(jù)庫(kù)軟件開(kāi)發(fā)的代碼質(zhì)量。
參考文獻(xiàn):
[1] 劉樂(lè),張奇.核電廠安全系統(tǒng)軟件單元測(cè)試的安全審評(píng)[J].核安全,2013:74-78.
[2] 張巍,尹海波.軟件的單元測(cè)試方法[J].光電技術(shù)應(yīng)用,2006,21(2):36238.
[3] IEEE Std 610.12-1990“IEEE Standard Glossary of Software Engineering Terminology”.
[4] 朱少民.軟件測(cè)試方法和技術(shù)[M].清華大學(xué)出版社,2010:30-62.
[5] 徐宏革,郭慶,雷濤,等.白盒測(cè)試之道—C++test[M].北京航空航天大學(xué)出版社,2011:63-64.
[6] 張志成.數(shù)字化安全系統(tǒng)軟件單元測(cè)試中的測(cè)試用例設(shè)計(jì)策略[J].第一屆中國(guó)(國(guó)際)核電儀控技術(shù)大會(huì),2011.
[7] 李鐸,張良駒,馮俊婷.安全軟件驗(yàn)證與確認(rèn)中的單元模塊測(cè)試技術(shù)[J].原子能科學(xué)技術(shù),2008,42(6).
【通聯(lián)編輯:梁書】