簡體   English   中英

檢查是否在C ++ CppUTest中調用了C函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM