上官霞南 蔣劍 沈昕

摘 要:結合目前軟件單元測試技術的研究現狀,本文對提高軟件單元測試質量和效率的測試模式及方法進行了深入的分析和研究,提出了包括如何命名單元測試用例以便交流出其測試意圖、如何更有效地進行單元測試組件之間的依賴隔離及如何驗證被測單元的間接輸出以提高代碼行為覆蓋率等測試碼重構方法,并給出了相應的技術措施和具體應用。
關鍵詞:模塊依賴;代碼行為覆蓋率;硬編碼測試替身;可配置的測試替身
一、緒論
軟件代碼行為的自動驗證是最近幾十年開發方法方面最大的進展之一,單元測試是軟件測試過程中最基本的測試,其能夠盡早暴露大量軟件缺陷,降低軟件工程整體開發成本,是前期測試中公認的、最有效的保證軟件質量的活動之一。
測試不光只能運行,還需要對其進行后期維護。然而目前很多公司級軟件測試項目中的測試壞味道包括模糊測試、緩慢測試、脆弱測試、甚至在產品代碼中包含測試邏輯等,[1]由此問題導致的高維護成本表明如果缺少正確的方法,引入單元測試不一定能提高生產力,因此如何識別及排除這些壞味道并重構測試,讓測試變得更易理解和維護、更健壯及可復用成為目前亟待解決的問題。
二、測試碼重構方法
本文我們將以嵌入式C語言為例,測試工具使用C++Test,闡述下面提出的幾種測試碼重構方法是如何在安全相關軟件的單元測試實踐中運用的。
(一)測試用例命名應該能交流出其測試的意圖
一個好的用例名稱至少需要傳達以下幾方面信息,包含被測代碼函數/方法名、與被測代碼執行相關的所有輸入值的重要特征及本用例預期輸出的抽象描述。這樣我們通過測試工具IDE的用例瀏覽器中可以很清楚的看到每個用例測試的不同場景,達到良好交流其測試的意圖的目的,比較好的命名方案如下:
test_
其中:
(二)測試中應盡可能設計可配置的測試替身,而不是硬編碼的測試替身
測試替身是出于運行測試這一明確目的而安裝代替實際組件的任何對象或組件,對依賴組件DOC的調用通常返回某個值、更新其它參數或拋出異常。[2]
硬編碼的測試替身由測試人員將依賴組件每個用例的返回值直接編碼進替身組件中,而可配置的測試替身它將返回值或異常在用例運行時實時傳遞,這樣我們可以以更簡單的方式控制被測代碼的間接輸入,并使測試核心邏輯在用例體可見從而避免出現“神秘訪客”,下面為可配置的測試替身的實現。
staticE_SysBool s_IsReceived = e_FALSE;
/*可配置的測試替身 */
void SetReceiveMsgDataStatus(E_SysBool inReciveStatus)
{
s_IsReceived = inReciveStatus;
}
E_SysBool IsReceiveMsgData(void)
{
retrun IsReceived;
}
(三)應能驗證被測代碼的間接輸出以減少未測試的代碼行為
很多時候,被測代碼SUT產生的行為在其自身組件中存儲,通過直接訪問組件狀態可以驗證該行為,但是有時也會產生一些預期的副作用,比如有一個組件里有一個函數,該函數什么也沒返回,或者至少沒有什么可以用來確定它是否正確實現了其功能,在這種情況下,我們別無選擇,只能從“后門測試”,通常程序對記錄故障代碼的調用沒有返回表示正確完成的信息,確定其是否正常運行的唯一方法是,通過其它某個接口(一個允許檢索故障類型的接口)與它交互。
static UINT32 s_FaultCode = 0UL;
/*一個允許檢索故障代碼的接口 */
UINT32GetFaultCode(void)
{
return s_FaultCode;
}
/*記錄故障代碼接口實現 */
UINT32RecordFalutCode(UINT32 inFaultCode)
{
s_FaultCode = inFaultCode;
}
/*測試用例中驗證了記錄故障代碼的行為 */
voidtest_CheckLinkStatus_NotReceivedCycleOverMaxNum_LinkFalut(void)
{
/* Pre-condition initialization */
SetReceiveMsgDataStatus(e_FAlSE);
s_CommErrorCount =c_MaxCommErrorNum;
{
/* Tested function call */
E_SysBool IsLinkNormal = CheckLinkStatus();
UINT32 vFaultCode = GetFaultCode();
/* Post-condition check */
CPPTEST_ASSERT_EQUAL(e_FAlSE,IsLinkNormal);
CPPTEST_ASSERT_EQUAL(c_CommFalut,vFaultCode);
}
}
三、結語
本文選擇的幾種測試碼重構方法經公司LKJ-15C安全認證項目中應用,證明其可以幫組開發人員在進行自動化單元測試實踐時在幾種可選項之間做出正確的選擇,最終使我們設計的測試用例能夠達到幫助理解被測代碼、提高設計質量及降低代碼缺陷引入風險等目標。
參考文獻:
[1]Gerard Meszaros.xUnit Test Patterns:Refactoring Test Code.Addison-Wesley,Reading,MA,2007.
[2]James W.Grenning.Test Driven Development for Embedded C.Pragmatic Programmers.2011.
作者簡介:上官霞南(1982-),男,漢族,江西吉水人,碩士,中級職稱,研究方向:安全相關軟件自動化測試。