原創(chuàng)|使用教程|編輯:龔雪|2015-12-16 14:11:59.000|閱讀 987 次
概述:關(guān)于Parasoft C / C ++test的嵌入式單元測(cè)試實(shí)踐,本文主要介紹了單元測(cè)試的驅(qū)動(dòng)程序和故障注入。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
當(dāng)提到將調(diào)用原始的方法/函數(shù)替換為調(diào)用不同的,我們使用“存根(stubs)”這個(gè)詞,或“驅(qū)動(dòng)程序(drivers)” (因?yàn)樗梢则?qū)動(dòng)執(zhí)行你想要的地方)。這有利于避免與現(xiàn)實(shí)網(wǎng)絡(luò)、數(shù)據(jù)庫、硬件或強(qiáng)制執(zhí)行進(jìn)入指定的路徑互相影響。C++test 可以使用原來的符號(hào),自動(dòng)生成存根或提供自己的存根。如果您選擇提供自己的存根,它會(huì)生成一個(gè)文件,并以合適的功能命名它。你可以根據(jù)需要修改這個(gè)文件。在用戶存根中,您可以使用C++test API推出給定存根的調(diào)用地址,改變相應(yīng)的行為。你也可以將斷言放入存根,并從存根中調(diào)用原始符號(hào)。在ASR例子中,我們不使用存根驅(qū)動(dòng)執(zhí)行就能夠達(dá)到100%的語句覆蓋率。然而,在多數(shù)情況下,存根是必要的。因此,一個(gè)簡(jiǎn)便的存根機(jī)制是不可或缺的。
盡管存根不要求實(shí)現(xiàn)覆蓋目標(biāo),但在本例中是有用的:沒有在單元測(cè)試中驅(qū)動(dòng)執(zhí)行,而是驅(qū)動(dòng)執(zhí)行整個(gè)應(yīng)用程序。我們可以在工作系統(tǒng)中注入故障,來看看將導(dǎo)致什么后果。試想一下,負(fù)責(zé)測(cè)量車輪轉(zhuǎn)速的光元件突然發(fā)生故障。我們?nèi)绾卧跍y(cè)試過程中模擬系統(tǒng)的這種情況呢?我們當(dāng)然不能直接把元件破壞掉,因?yàn)閮r(jià)格很貴。而且不不必模擬所有可能的缺陷。我們只需模擬該存根功能的錯(cuò)誤行為。在我們現(xiàn)實(shí)中,當(dāng)處理程序中斷時(shí),速度從適當(dāng)?shù)亩丝谧x取。中斷處理程序存根不是特別方便,它需要修改矢量地圖。但有更簡(jiǎn)單的方法,我們可以直接使用已經(jīng)從中斷處理程序獲取的數(shù)據(jù)進(jìn)行存根函數(shù)。本示例中為“update_speed”函數(shù)。它是從主循環(huán)調(diào)用,根據(jù)原始數(shù)據(jù)計(jì)算速度。然后,根據(jù)從正常運(yùn)作的光元件獲得的實(shí)際數(shù)據(jù),我們可以模擬故障行為:回歸 非常高的速度,或者零,或兩者交錯(cuò)。
然后,整個(gè)應(yīng)用程序可以被上傳到電路板,并運(yùn)行常規(guī)功能,物理測(cè)試。接著,測(cè)試人員可以看到模擬系統(tǒng)故障下的行為方式。自動(dòng)生成代碼覆蓋率報(bào)告。
這是一個(gè)很常見的場(chǎng)景,代碼應(yīng)與輸入的參數(shù)進(jìn)行多種組合測(cè)試。他們可能是數(shù),字節(jié)流,字符緩沖區(qū)等。這樣就無需準(zhǔn)備很多測(cè)試用例了(每一種組合相當(dāng)于一個(gè)測(cè)試用例)。這樣從外部數(shù)據(jù)源賦值會(huì)簡(jiǎn)便的多。這對(duì)于可維護(hù)性來說有巨大的好處。C++test 支持多種類型的數(shù)據(jù)源:內(nèi)置表,CSV文件,Excel電子表格,數(shù)據(jù)庫連接或者幾種組合。你只需要配置所選擇的的數(shù)據(jù)源,然后使用測(cè)試用例向?qū)?chuàng)建測(cè)試用例。或者,你可以直接調(diào)用C++test API,從數(shù)據(jù)源中獲取值。本示例中,我們需要額外添加兩個(gè)測(cè)試用例,來達(dá)到100%的語句覆蓋率。但如果我們需要測(cè)試更多的組合,所需測(cè)試用例的數(shù)量將開始增長(zhǎng)。對(duì)于路徑覆蓋或
MC / DC覆蓋,需要多引入一些測(cè)試案例。因此,使用數(shù)據(jù)源的值設(shè)計(jì)測(cè)試用例和參數(shù)是更好的選擇。測(cè)試用例如下所示:
CPPTEST_TEST_SUITE(TestSuite_proc_c_1b9a6284); (…) CPPTEST_TEST_DS(TestSuite_proc_c_1b9a6284_test_brake_control_ds, CPPTEST_DS(“brake_control_data”)); CPPTEST_TEST_SUITE_END(); (…) /* CPPTEST_TEST_CASE_BEGIN test_brake_control_ds */ /* CPPTEST_TEST_CASE_CONTEXT void brake_control(s32 *, s32 *, s32) */ void TestSuite_proc_c_1b9a6284_test_brake_control_ds() { /* Pre-condition initialization */ /* Initializing argument 1 (brk1_sig_ptr) */ s32 _brk1_sig_ptr_6 = CPPTEST_DS_GET_INTEGER(“brk1_sig”); s32 * _brk1_sig_ptr = & _brk1_sig_ptr_6; /* Initializing argument 2 (brk2_sig_ptr) */ s32 _brk2_sig_ptr_7 = CPPTEST_DS_GET_INTEGER(“brk2_sig”); s32 * _brk2_sig_ptr = & _brk2_sig_ptr_7; /* Initializing argument 3 (spd_diff) */ s32 _spd_diff = CPPTEST_DS_GET_INTEGER(“speed_diff”); /* Initializing global variable Speed_Diff_Threshold */ { Speed_Diff_Threshold = 10; } /* Initializing global variable Brake_Signal_Coeff */ { Brake_Signal_Coeff = 10; } { /* Tested function call */ brake_control(_brk1_sig_ptr, _brk2_sig_ptr, _spd_diff); /* Post-condition check */ CPPTEST_ASSERT_INTEGER_EQUAL(CPPTEST_DS_GET_INTEGER(“brk1_sig_out”), *_brk1_sig_ptr ); CPPTEST_ASSERT_INTEGER_EQUAL(CPPTEST_DS_GET_INTEGER(„brk2_sig_out”), *_brk2_sig_ptr); } } /* CPPTEST_TEST_CASE_END test_brake_control_ds */
上面示例中,C++test遍歷行從:“brake _control_data” 數(shù)據(jù)源;調(diào)用“brake_ control”功能的值(來自“brk1_sig_out” 和“brk2_sig_out”)。為數(shù)據(jù)源填充正確的值需要花費(fèi)一段時(shí)間。若你不能當(dāng)即確定正確的值,你需要執(zhí)行測(cè)試用例,觀察和驗(yàn)證結(jié)果,然后復(fù)制到數(shù)據(jù)源中。
<Parasoft C / C ++test產(chǎn)品詳情>
購買最新正版授權(quán)Parasoft贈(zèng)送Macbook!""
慧都年終盛典火爆開啟,一年僅一次的最強(qiáng)促銷,破冰鉅惠不容錯(cuò)過(12.01~12.31)!!優(yōu)惠詳情點(diǎn)擊查看>>
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn