我有一段代码,如果进行单元测试,我不想运行。我希望找到一些由我可以检查的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
}
这似乎不起作用,因为所有代码都运行。还有另一个我可以检查的标志可能有效吗?
答案 0 :(得分:5)
Google Test不需要或提供自己的构建包装器。您甚至不必有时重新编译源文件。您可以将它们与测试代码一起链接。您的测试代码调用已编译的库代码。您的库代码可能甚至不包含Gtest标题。
如果您希望库代码在测试中以不同方式运行,那么首先需要确保您的库代码在测试时以不同方式编译。你需要另一个构建目标。在为该构建目标进行编译时,您可以定义一个符号,该符号向您的代码指示它处于测试模式。我会避免使用该符号的GTEST
前缀;请使用Google自己的代码。
实现所需内容的另一种方法是使用依赖注入。将您的特殊代码移动到另一个例程中,可能在它自己的类中。将指向该函数或类的指针传递到SomeFunctionImUnitTesting
函数并调用它。当您测试该代码时,您可以让测试工具将不同的函数或类传递给该代码,从而避免有问题的代码而无需多次编译代码。
答案 1 :(得分:1)
在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
{
}