簡體   English   中英

如何測試C中function調用的順序?

[英]How to test the sequence of function calls in C?

我正在使用 Gtest 對 C 模塊執行單元測試。 要求之一是驗證在執行幾個不同的函數后調用名為Supervision_Log()的 function。 C 文件包括以下內容:

void MainFunction (void)
{
    .
    .
    .
    /*Some code*/
    .
    .
    .
    ModeMonitoring();
    RadarStatusMonitoring();
    CameraStatusMonitoring();
    Supervision_Log(ModeManager);
}

我開始知道 CppUTest 中有一個名為mock().strictOrder()的工具可以滿足我的需要。 但是,在 Gtest 中是否有類似的東西? 或者我該怎么辦?

PS:如果有人更改了 function 調用的順序,我們需要放置一個失敗的測試用例。 此測試用例將充當此命令的守護者,以防止未來版本中的任何更改。

對於單元測試,您應該使用gcov代碼覆蓋率實用程序,它告訴您代碼中哪個部分沒有執行,還提供了有關給定函數被調用多少次的報告,但是您需要使用代碼覆蓋率標記來構建代碼

  1. 您必須更改被測代碼,以便注入依賴項。 這可以通過 static 或動態多態來完成(我通常會混合使用,但為簡單起見,讓我們做動態多態):
class IDependency {
public:
    virtual ~IDependency() {}

    virtual void ModeMonitoring() = 0;
    virtual void RadarStatusMonitoring() = 0;
    virtual void CameraStatusMonitoring() = 0;
    virtual void Supervision_Log(const ModeManagerType&) = 0;
};

class ProductionDependency : public IDependency {
public:
    void ModeMonitoring() override {
       ::ModeMonitoring();
    }

    void RadarStatusMonitoring() override {
       ::RadarStatusMonitoring();
    }
    void CameraStatusMonitoring() override {
       ::CameraStatusMonitoring();
    }
    void Supervision_Log(const ModeManagerType& x) override {
       ::Supervision_Log(x);
    }
};

ProductionDependency productionDependency;

void MainFunction(IDependency& dep = productionDependency)
{
    // ....
    dep.ModeMonitoring();
    dep.RadarStatusMonitoring();
    dep.CameraStatusMonitoring();
    dep.Supervision_Log(ModeManager);
}
  1. 然后在測試中為依賴提供一個模擬:
class MockDependency : public IDependency {
public:
    MOCK_METHOD(void, ModeMonitoring, (), (override));
    MOCK_METHOD(void, RadarStatusMonitoring, (), (override));
    MOCK_METHOD(void, CameraStatusMonitoring, (), (override));
    MOCK_METHOD(void, Supervision_Log, (const ModeManagerType&), (override));
};
  1. 最后在測試中表達所需的順序:
TEST(MainFunction, callsInOrder)
{
    MockDependency dep;

    Expectation modeMonitoring = EXPECT_CALL(dep, ModeMonitoring());
    EXPECT_CALL(dep, CameraStatusMonitoring()).After(modeMonitoring); // here order is forced

    EXPECT_CALL(dep, RadarStatusMonitoring());
    EXPECT_CALL(dep, Supervision_Log(_));

    MainFunction(dep);
}

這是關於 After 的文檔

請不要指定嚴格的順序。 確保僅需要的訂單受測試限制,例如外部 API 需要的訂單。 不要根據當前實現指定所有調用的順序,因為這會限制您的重構機會。

這是現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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