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