原創(chuàng)|使用教程|編輯:張莉|2025-09-10 13:40:45.340|閱讀 3 次
概述:在軟件測試工具Parasoft C/C++test中,樁函數(shù)是其實現(xiàn)高覆蓋率單元測試的核心機制之一,是用于模擬被測函數(shù)所依賴的外部組件的測試工具。它的核心作用是接管這些外部調用,并允許測試人員預設其行為,例如強制返回特定值或修改輸出參數(shù)。通過故意改變傳遞給主函數(shù)的參數(shù)值,可以精準控制測試輸入,從而驗證主函數(shù)在不同場景下的邏輯是否正確,確保其能夠妥善處理各種正常與異常情況。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在軟件測試工具Parasoft C/C++test中,樁函數(shù)是其實現(xiàn)高覆蓋率單元測試的核心機制之一,是用于模擬被測函數(shù)所依賴的外部組件的測試工具。它的核心作用是接管這些外部調用,并允許測試人員預設其行為,例如強制返回特定值或修改輸出參數(shù)。通過故意改變傳遞給主函數(shù)的參數(shù)值,可以精準控制測試輸入,從而驗證主函數(shù)在不同場景下的邏輯是否正確,確保其能夠妥善處理各種正常與異常情況。
我們用Parasoft C/C++test通過樁函數(shù)的方式來控制輸入的參數(shù),去實現(xiàn)高覆蓋率的測試,以下是示例代碼:
#include <stdint.h> typedef uint8_t Std_ReturnType; #define RTE_E_OK 0 #define DEM_EVENT_STATUS_PREPASSED 0 #define DEM_EVENT_STATUS_PREFAILED 1 #define RTE_SWC_ADC_ETHDIAG_SWC_INU_LinkUpStatus_u8_Signal 1 typedef struct { uint8_t inu_LinkUpSts; uint8_t ccu_LinkUpSts; } LinkStatus; Std_ReturnType Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal(uint8_t* data) { *data = RTE_SWC_ADC_ETHDIAG_SWC_INU_LinkUpStatus_u8_Signal; return RTE_E_OK; } void Rte_Call_Event_DTC_0xD70188_Event_SetSts(uint8_t status) { // 添加實際的實現(xiàn),根據(jù) DEM 事件設置狀態(tài)的需求 // 此處僅為示例 // ... } void EthLinkupStsDTCMainfunction(void) { uint8_t inu_LinkUpSts, ccu_LinkUpSts; Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal(&inu_LinkUpSts); if (inu_LinkUpSts != 1) { /* 1inuDown */ Rte_Call_Event_DTC_0xD70188_Event_SetSts(DEM_EVENT_STATUS_PREFAILED); } else { Rte_Call_Event_DTC_0xD70188_Event_SetSts(DEM_EVENT_STATUS_PREPASSED); } } int main(void) { /* 空的 main 函數(shù) */ return 0; }
接下來,我們以函數(shù)EthLinkupStsDTCMainfunction為例,用Pasasoft進行測試,在默認未配置函數(shù)打樁的情況下,其測試結果覆蓋情況如下圖:
測試用例設計
對被調函數(shù)Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal打樁,因為Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal的邏輯中,其實就是對inu_LinkUpSts重新賦值了。
Testcase1:對Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal打樁,將inu_LinkUpSts的值修改成不等于1的值,來滿足 line31 的條件。
Testcase2:對Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal打樁,將inu_LinkUpSts的值修改成等于1的值,來滿足 line34 的條件。
樁函數(shù)代碼如下:
#include "cpptest.h" #include <stdint.h> typedef uint8_t Std_ReturnType; /** * This file contains user stub definitions. * * To create a user stub: * 1. Open stub template list: * - Eclipse IDE: type 'stub' and press <Ctrl> <Space> * - Microsoft Visual Studio IDE: use context menu C++test->Insert Snippet... * 2. Choose the stub template from the list. * 3. #include the header file where the function you want to stub is originally * declared as well as any supporting header files as necessary. * 4. Fill out the stub signature to match that of the original function, * while keeping the CppTest_Stub prefix when it applies. * Note: for C++ operators, use appropriate stub names - e.g.: * CppTest_Stub_operator_new for operator new * CppTest_Stub_operator_delete for operator delete * CppTest_Stub_operator_plus for operator + * Refer to C++test User's Guide for a complete list of stub names for operators. * 5. Fill out the body of the stub according to intent. * * Available C++test API functions (see C++test Users Guide for details): * void CppTest_Assert(bool test, const char * message) * void CppTest_Break() * const char* CppTest_GetCurrentTestCaseName() * const char* CppTest_GetCurrentTestSuiteName() * bool CppTest_IsCurrentTestCase(const char* testCaseName) */ /** * Header files where the stubbed functions are originally declared. * Verify #include directives and add any additional header files as necessary. */ /** User stub definition for function: Std_ReturnType Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal(uint8_t *) */ EXTERN_C_LINKAGE Std_ReturnType Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal (uint8_t * data) ; EXTERN_C_LINKAGE Std_ReturnType CppTest_Stub_Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal (uint8_t * data) { CPPTEST_STUB_CALLED("Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal"); Std_ReturnType __return = (unsigned char)0; /** * This section enables Dynamic Stub Configuration with Stub Callbacks. * * IMPORTANT: THIS COMMENT BLOCK SHOULD NOT BE DELETED OR MODIFIED * * 1. Define stub callback function in test suite file - use the following signature: * void CppTest_StubCallback_SomeName(CppTest_StubCallInfo* stubCallInfo, Std_ReturnType* __return, uint8_t * data) * * 2. Register stub callback in test case function - use the following code: * CPPTEST_REGISTER_STUB_CALLBACK("Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal", &CppTest_StubCallback_SomeName); * * 3. Fill out the body of the stub callback function according to intent. * The following line may be used to call original function inside stub callback: * *__return = Rte_Read_SWC_ADC_FM_SWC_INU_LinkUpStatus_u8_Signal(data); */ if (CPPTEST_STUB_HAS_CALLBACK()) { CPPTEST_STUB_CALLBACK_PARAMS(Std_ReturnType* __return, uint8_t * data); CPPTEST_STUB_INVOKE_CALLBACK(&__return, data); } else { if(CppTest_IsCurrentTestCase("TestSuite_main_c_136bf872_test_EthLinkupStsDTCMainfunction_1")) { *data = 1; } else { *data = 2; } } return __return; }
運行用例后,我們可以在Parasoft C/C++test清楚的看到我們使用樁函數(shù)的方式,來控制輸入?yún)?shù)后覆蓋率結果,和未使用的相比,有大幅度的提升。
Parasoft 通過其強大的樁函數(shù)功能,使開發(fā)人員能夠輕松模擬外部依賴并精準控制輸入?yún)?shù),從而高效完成對主函數(shù)各條件分支的全面測試,將難以觸發(fā)的測試場景變得完全可控。這不僅顯著提升了單元測試的效率和代碼可靠性,更是實現(xiàn)高覆蓋率目標的關鍵技術。Parasoft 提供了一整套貫穿軟件開發(fā)生命周期的自動化測試解決方案,致力于在代碼質量、功能安全及行業(yè)合規(guī)性方面為客戶提供全面保障,幫助團隊應對復雜交互場景的測試挑戰(zhàn),最終確保軟件產品符合高質量標準與嚴格的安全規(guī)范。
關于慧都
慧都是一家行業(yè)數(shù)字化解決方案公司,專注于軟件、石油與工業(yè)領域,以深入的業(yè)務理解和行業(yè)經驗,幫助企業(yè)實現(xiàn)智能化轉型與持續(xù)競爭優(yōu)勢。在軟件工程領域,我們提供開發(fā)控件、研發(fā)管理、代碼開發(fā)、部署運維等軟件開發(fā)全鏈路所需的產品,提供正版授權采購、技術選型、個性化維保等服務,幫助客戶實現(xiàn)技術合規(guī)、降本增效與風險可控。
慧都科技是 Parasoft 公司在中國區(qū)的官方授權合作伙伴。為國內企業(yè)提供 Parasoft 軟件測試工具的正版授權銷售、技術支持、定制化部署及實施服務,旨在幫助國內企業(yè)提升軟件質量與測試效率。
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn