如何计算使用 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
按钮。它看起来像这样:
我开始使用 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
按钮。它看起来像这样: