原創(chuàng)|使用教程|編輯:張莉|2025-09-24 11:35:18.763|閱讀 50 次
概述:在單元測試中,一個常見的挑戰(zhàn)是如何對依賴于標(biāo)準(zhǔn)輸入、輸出和錯誤流的函數(shù)進行有效測試。一個函數(shù)可能通過printf向控制臺打印信息,或通過scanf從用戶獲取輸入。在自動化測試環(huán)境中,我們無法進行人工交互,因此需要一種方法來模擬這些輸入并捕獲輸出,以便進行驗證。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在單元測試中,一個常見的挑戰(zhàn)是如何對依賴于標(biāo)準(zhǔn)輸入、輸出和錯誤流的函數(shù)進行有效測試。例如,一個函數(shù)可能通過printf向控制臺打印信息,或通過scanf從用戶獲取輸入。在自動化測試環(huán)境中,我們無法進行人工交互,因此需要一種方法來模擬這些輸入并捕獲輸出,以便進行驗證。
Parasoft C/C++test提供了強大的流重定向API,專門用于解決這一難題。這些API允許測試用例在運行時動態(tài)地重定向標(biāo)準(zhǔn)流,將預(yù)設(shè)的字符串作為“模擬輸入”提供給stdin,并捕獲寫入stdout或stderr的“實際輸出”。這樣,測試人員就可以像與程序交互一樣,全面、自動化地驗證那些涉及控制臺輸入輸出的函數(shù)行為。
C/C++test提供的流API
宏 | 定義 |
CppTest_StreamRedirect CppTest_RedirectStdInput(const
char value); |
將當(dāng)前測試用例的
stdin 流的值設(shè)置為提供的字符串的值。 |
CppTest_StreamRedirect CppTest_RedirectNStdInput(const
char value, unsigned int size) |
將當(dāng)前測試用例的
stdin 流的值設(shè)置為所提供字符串的第一個
'size' 字符的值。 |
CppTest_StreamRedirect*
CppTest_RedirectStdOutput() |
重定向當(dāng)前執(zhí)行的測試用例的
stdout 流。返回的
CppTest_StreamRedirect 對象可用于驗證測試用例后置條件部分中的流內(nèi)容。在當(dāng)前測試用例執(zhí)行結(jié)束時自動恢復(fù)標(biāo)準(zhǔn)輸出流的先前值。 |
CppTest_StreamRedirect*
CppTest_RedirectStdError() |
為當(dāng)前執(zhí)行的測試用例重定向
stderr 流。返回的
CppTest_StreamRedirect 對象可用于驗證測試用例后置條件部分中的流內(nèi)容。在當(dāng)前測試用例執(zhí)行結(jié)束時自動恢復(fù)
stderr 流的先前值。 |
CppTest_StreamCompare(CppTest_StreamRedirect redirect, const char value) |
用于驗證重定向的
stdout/stderr 流的內(nèi)容。如果“值”與流值匹配,則返回
0;如果“值”小于流值,則返回小于零的整數(shù);如果“值”大于流值,則返回大于零的整數(shù)。 |
CppTest_StreamNCompare(CppTest_StreamRedirect redirect,
const char value, unsigned int size) |
用于驗證重定向的
stdout/stderr 流的內(nèi)容。如果“值”與流值匹配,則返回
0;如果“值”小于流值,則返回小于零的整數(shù);如果“值”大于流值,則返回大于零的整數(shù)。僅比較流的第一個
'size’字符。 |
int CppTest_StreamSearch(CppTest_StreamRedirect,
redirect, const char* pattern) |
用于驗證重定向的
stdout/stderr 流的內(nèi)容。在重定向流中搜索給定模式。返回在流中找到的模式的索引,如果未找到模式,則返回
-1。 |
int
CppTest_StreamNSearch(CppTest_StreamRedirect redirect, const char pattern,
unsigned int size) |
用于驗證重定向的
stdout/stderr 流的內(nèi)容。在重定向流中搜索給定模式的第一個
'size’字符。返回在流中找到的模式的索引,如果未找到模式,則返回
-1。 |
char CppTest_StreamReadData(CppTest_StreamRedirect redirect,
unsigned int* len) |
返回一個指向緩沖區(qū)的指針,其中包含從重定向流中讀取的數(shù)據(jù)。緩沖區(qū)的大小將在
'len' 參數(shù)中傳回(如果將非空值傳遞給函數(shù))。緩沖區(qū)由
cpptestMalloc()函數(shù)分配。應(yīng)該使用
cpptestFree() 函數(shù)釋放返回的緩沖區(qū)。 |
void
CppTest_StreamReset(CppTest_StreamRedirect* redirect) |
將
C++test 內(nèi)部流重置為默認(rèn)狀態(tài)。它在測試用例執(zhí)行結(jié)束時為每個重定向流自動完成。 |
示例
有如下被測函數(shù)
int foo() { int number; // 從用戶獲取輸入 printf("Please enter an integer: \n"); scanf("%d", &number); // 使用if-else語句判斷輸入的數(shù)字是否為正數(shù) if (number > 0) { printf("%d is a positive number.\n", number); } else if (number < 0) { printf("%d is a negative number.\n",number); } else { printf("This is zero.\n"); } return number; }示例測試用例如下:
/* CPPTEST_TEST_CASE_BEGIN test_foo_m1 */ /* CPPTEST_TEST_CASE_CONTEXT int foo(void) */ void TestSuite_sensor_c_61678bb2_test_foo_m1() { /* Pre-condition initialization */ CppTest_StreamRedirect* _stdinStreamRedirect = CppTest_RedirectStdInput("-1\n"); CppTest_StreamRedirect* output_stream = CppTest_RedirectStdOutput(); /* Pre-condition report */ { /* Tested function call */ int _return = foo(); int len; CppTest_StreamReset(_stdinStreamRedirect); /* Post-condition report */ CPPTEST_REPORT_INTEGER("Output: int _return", ( _return )); /* Post-condition check */ CPPTEST_POST_CONDITION_INTEGER("int _return", ( _return )); CPPTEST_POST_CONDITION_CSTR("messages",CppTest_StreamReadData(output_stream, &len)); /* Post-condition check */ CPPTEST_ASSERT_CSTR_EQUAL("Please enter an integer: \n-1 is a negative number.\n",CppTest_StreamReadData(output_stream, &len)); CPPTEST_ASSERT(0 == CppTest_StreamCompare(output_stream, "Please enter an integer: \n-1 is a negative number.\n")); CPPTEST_ASSERT_INTEGER_EQUAL(-1, ( _return ) ); } } /* CPPTEST_TEST_CASE_END test_foo_m1 */
下面是這條測試用例的執(zhí)行結(jié)果:
通過測試結(jié)果可以看到Parasoft C/C++test成功通過流重定向API自動化完成了對交互式函數(shù)的測試:它精準(zhǔn)地模擬了標(biāo)準(zhǔn)輸入,捕獲并驗證了完整的輸出信息及返回值,證明了Parasoft C/C++test在替代人工進行I/O操作測試方面的可靠性。
Parasoft C/C++test提供的流API不僅解決了標(biāo)準(zhǔn)輸入輸出模擬這一具體測試難題,更體現(xiàn)了其作為全面測試平臺的核心理念——通過集成靜態(tài)分析、單元測試、合規(guī)驗證等多種能力,為客戶構(gòu)建端到端的代碼質(zhì)量保障體系,最終確保關(guān)鍵系統(tǒng)滿足最高的安全與可靠性要求。
關(guān)于慧都
慧都是一家行業(yè)數(shù)字化解決方案公司,專注于軟件、石油與工業(yè)領(lǐng)域,以深入的業(yè)務(wù)理解和行業(yè)經(jīng)驗,幫助企業(yè)實現(xiàn)智能化轉(zhuǎn)型與持續(xù)競爭優(yōu)勢。在軟件工程領(lǐng)域,我們提供開發(fā)控件、研發(fā)管理、代碼開發(fā)、部署運維等軟件開發(fā)全鏈路所需的產(chǎn)品,提供正版授權(quán)采購、技術(shù)選型、個性化維保等服務(wù),幫助客戶實現(xiàn)技術(shù)合規(guī)、降本增效與風(fēng)險可控。
慧都科技作為Parasoft公司在中國區(qū)的官方授權(quán)合作伙伴,為國內(nèi)企業(yè)提供Parasoft C/C++test產(chǎn)品的正版授權(quán)、定制化部署與全生命周期技術(shù)支持與服務(wù)。我們致力于助力客戶精準(zhǔn)貫徹功能安全標(biāo)準(zhǔn)、全面提升軟件開發(fā)效率、有效管控項目風(fēng)險,最終構(gòu)建符合國際標(biāo)準(zhǔn)的高質(zhì)量軟件體系。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn