我正在尝试使用Google Test测试功能。
似乎一切都设置正确,并且它构建并执行正常而没有gtest ......(代码中有一点复杂,所以我不能在这里列出所有的源文件,但是没有添加gtest,文件正确链接,并按照应有的方式运行。
这是一个应用程序类型项目。它有许多库依赖...不相关。
测试项目作为单独的项目添加到解决方案中。它将测试项目作为依赖项。测试项目的.h文件只指向gtest ... .cpp(不是main,这是标准的InitGoogleTest main)添加了自己的头文件,测试项目的头文件,并且测试如下所示
当项目构建时,即使它是一个应用程序,也会自动创建一个TestedProject.lib。我已将TestedProject.lib作为库依赖项添加到TestProject(在链接中)。
Class x
{
public:
x(){} // I didn't really need this, I only added the class so I have access to
~x(){}; // non-class methods with gtest - but it still doesn't work
bool myFunction(std::string a, double b, bool c);
};
实现:
bool x::myFunction(std::string a, double b, bool c)
{
// implementation
return false;
}
somewhere_else
{
x x_instance;
y = x_instance.myFunction("a", 1, false); // works, all builds, executes, life is great
}
添加单元测试:
class TheTest : public ::testing::Test
{
protected:
x x_instance;
};
TEST_F(TheTest, Fail)
{
EXPECT_FALSE(x_instance.myFunction("a", 1, false));
}
不构建。链接错误(修改后,如上面的示例代码,简化名称,我希望我没有搞乱内容)
Error 2 error LNK2019: unresolved external symbol
"public: bool __thiscall x::myFunction(class std::basic_string<char,struct std::char_traits<char>,double,bool)"
(?myFunction@x@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00000NNNN_N1@Z)
referenced in function "private: virtual void __thiscall TheTest_Fail_Test::TestBody(void)"
(?TestBody@TheTest_Fail_Test@@EAEXXZ) C:\path\file.obj
之前我已经完成了这个 - 解决了链接错误 - 用Google测试写了几个测试 - 但我看不到任何遗漏。
作为测试,我写了一点
int test(){return 4;} 在头文件中,在类声明中......
然后,用。替换测试 EXPECT_EQ(x.test(),4);
有效。大。但这意味着将所有经过测试的代码放在一个文件中,一个cpp或者其他东西......这简直是不合理的。此Application项目中有一些文件。
如何解决此问题?如何使用带有标题和实现文件的类进行Google Test链接和测试?当该标题/实现位于不同的项目中时,“应用程序”类型是什么?
到目前为止我发现的唯一类似问题:C++ linking issue on Visual Studio 2008 when crosslinking different projects on same solution
请帮我找一个解决方案。
答案 0 :(得分:2)
还有另一个解决方案,我更喜欢,因为这意味着您可以避免更改主项目:
向主项目添加“post build action”,以便为完全相同的源文件创建静态库。 然后你可以简单地将这个依赖项添加到你的gtest项目。
每次编译主项目时,它都会构建应用程序和静态库。
这样您就不必创建第三个项目并保持配置同步。
希望它有所帮助。
答案 1 :(得分:1)
所以我会得到答案:
我的问题有2个解决方案:
1)在2个项目中分解应用程序项目,一个将成为一个库,包含大部分代码;另一个是一个应用程序,包含一个微小的main(),它调用实际代码的入口点(比如参数解析方法或其他东西)。
然后,我可以添加一个单元测试项目 - 来测试lib。
2)不要破坏项目。添加gtest项目,不要创建任何依赖项。将文件添加到gtest项目中进行测试。 gtest项目将是一个单独的可执行文件......所有它都需要快乐。 (优点:没有测试依赖性)
我更喜欢第一个版本。
答案 2 :(得分:0)
还有另一种解决办法。
只需为Google Test Framework创建一个新项目。 (当然,根据您现有的应用程序解决方案)。
然后,确保所有Google Test Framework设置正确无误后。 (您可以在新创建的解决方案下测试它)
从主项目中手动包含您想要测试的代码(使用Add - &gt; Existing Item),然后您可以测试代码而无需生成额外的lib。
这很好的部分是当你从windows测试一些需要DLL的应用程序时,它需要应用程序使用多线程调试DLL。 (在你的项目属性设置中,转到C / C ++ - &gt;代码生成 - &gt;运行时库,看看你得到了什么)
Google Test Framework使用了一个非常不同的RunTime库(多线程调试(/ MTd))。
在链接阶段,编译器会因为使用Multi-Thread DLL和google framework的lib(多线程)将应用程序生成的lib链接起来有些困难。
通过这种方式,您可以避免两个项目的依赖性问题。 (一个用于/ Mtd,一个用于/ Md)