如何计算使用 C 中的模拟框架调用实际函数的次数

How to count the number of times the real function has been called using a mocking framework in C

我开始使用 TDD 编写嵌入式 C 软件,并且我正在使用 Google Test 作为我的测试框架。我刚刚意识到任何模拟教程似乎都没有涵盖的情况:我想计算给定的 REAL 函数被调用了多少次。

所以,假设我正在开发一些使用名为 LIB_A 的库的代码,该库又使用另一个名为 LIB_B.

的库

通常,我会模拟 LIB_B 并进行如下测试:

TEST(MyCodeTest, CanDoSomething) {
  Mock_LIB_B_Class mock_object;
  MyClass my_obj;

  // We expect that doSomething will call SomeMethod at least once
  EXPECT_CALL(mock_class, SomeMethod()).Times(AtLeast(1));

  // Checks for the expected return
  EXPECT_EQ(0, my_obj.doSomething());
}

好的,这一切都很好。现在这是我的问题:如果我不必模拟 LIB_A,而是模拟 LIB_B 怎么办?如何计算 SomeMethod 被调用的次数?因为模拟框架可以很容易地创建实际上没有真正实现的模拟函数。

我在想我可以为 LIB_A 使用一个假的,所以调用是可数的。我正在考虑使用 Google Mock 或 Fake Function Framework。

谢谢!

您不需要任何模拟框架即可完成此操作。您可以使用 gcov/lcov/genhtml.

通过包含 gcc 标志 -fprofile-arcs-ftest-coverage,以及链接器标志 -lgcov,您的可执行文件将生成有关执行了哪些代码行的运行时信息,并使用上述您可以轻松生成一组 html 文件的工具,这些文件将向您显示函数列表,包括它们的调用次数。

执行测试后,执行:

gcov maintest.c
lcov --capture --directory . --output-file maintest.info
genhtml maintest.info --output-directory html

然后打开 index.html,选择一个文件并单击顶部栏中文件名旁边的 functions 按钮。它看起来像这样: