[英]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代碼覆蓋率實用程序,它告訴您代碼中哪個部分沒有執行,還提供了有關給定函數被調用多少次的報告,但是您需要使用代碼覆蓋率標記來構建代碼
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);
}
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));
};
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.