6

如果正在对它进行单元测试,我有一段代码我不想运行。我希望找到一些我可以检查的由 gtest 库设置的#defined 标志。我找不到用于此目的的一个,但是在查看了 gtest 标头后,我找到了一个我认为可以像这样使用的:

SomeClass::SomeFunctionImUnitTesting() {
    // some code here
    #ifndef GTEST_NAME
    // some code I don't want to be tested here
    #endif
    // more code here
}

这似乎不起作用,因为无论如何所有代码都运行。我可以检查另一个可能有用的标志吗?

4

2 回答 2

6

Google Test 不需要或提供自己的构建包装器。有时您甚至不必重新编译源文件。您可以将它们与您的测试代码链接起来。您的测试代码调用您已经编译的库代码。您的库代码可能甚至不包含和 Gtest 标头。

如果您希望您的库代码在测试下以不同方式运行,那么您首先需要确保您的库代码在测试下以不同方式编译。您将需要另一个构建目标。在为该构建目标进行编译时,您可以定义一个符号,向您的代码指示它处于测试模式。我会避免使用GTEST该符号的前缀;留给谷歌自己的代码使用。


实现您正在寻找的另一种方法是使用依赖注入。将您的特殊代码移动到另一个例程中,可能在它自己的类中。将指向该函数或类的指针传递给您的SomeFunctionImUnitTesting函数并调用它。当您测试该代码时,您可以让您的测试工具将不同的函数或类传递给该代码,从而避免出现问题的代码,而无需多次编译您的代码。

于 2011-05-20T21:46:43.683 回答
3

main()

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    setenv("GTEST_RUNNING", "1", true);
    ros::init(argc, argv, "tester");
    return RUN_ALL_TESTS();
}

别的地方:

bool gtestRunning = strcmp(getenv("GTEST_RUNNING"), "1") == 0;
if (gtestRunning)
{
}
else
{
}
于 2021-04-22T06:04:06.017 回答