[英]Check that a C function is called in a C++ CppUTest
我有一個嵌入式C / C ++項目,我想用CppUTest編寫單元測試。 我要執行的一個簡單測試是確保在測試期間調用特定的C函數。
假設我在function.h中定義了兩個C function.h
:
void success(void)
{
// ... Do Something on success
}
void bid_process(void)
{
bool happy = false;
// ... processing modifiying 'happy' and setting it to 'true'
if (happy)
success(); // Call to success
}
我想測試函數big_process
並且如果未調用success
則希望測試失敗。
為此,我在單獨的測試文件test.cpp中編寫了一些CppUTests :
#include <CppUTest/CommandLineTestRunner.h>
#include "CppUTest/TestHarness.h"
#include "CppUTestExt/MockSupport.h"
#ifdef __cplusplus
extern "C"
{
#include "function.h"
}
#endif
TEST_GROUP(TestGroup)
{
void teardown()
{
mock().clear();
}
};
TEST(TestGroup, Test_big_process)
{
mock().expectOneCall("success"); // success should be called by the call to big process
big_process();
mock().checkExpectations();
}
我手動檢查了big_process
是否工作正常並且正在調用success
但是現在我希望我的測試能夠完成。 但是測試失敗,並告訴我:
Mock Failure: Expected call did not happen.
EXPECTED calls that did NOT happen:
success -> no parameters
所以我的問題很簡單:如何確保在big_process
期間big_process
success
?
我相信CppUTest中的模擬支持是侵入性的,即您還需要向生產代碼中添加模擬支持。 例:
void success(void)
{
mock().actualCall("success");
....
}
對於普通C代碼的非侵入式單元測試,您可以使用預處理器或鏈接縫。 看看邁克爾羽毛偉大的書工作有效地與遺留代碼的詳細信息。
實際上,可以在這里找到那本書的摘錄,其中涵蓋了這些接縫類型。 我仍然建議任何C程序員閱讀該書-這是無價的。
您正在正確設置模擬期望,但未將模擬連接到success()函數。
這解釋了一個類似的問題: https : //github.com/cpputest/cpputest/issues/1054
代替cpputest模擬庫,您可以使用其他模擬框架,例如,偽函數框架。 參見https://github.com/meekrosoft/fff/blob/master/README.md
這使您可以編寫輕量級的樁函數,這些函數可以用測試倍數代替實際的實現。 這可以在鏈接階段完成。 在實際實現之前鏈接fff填充,以便鏈接器提取偽造的實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.