7

我正在尝试使用 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

我以前做过这个——解决了链接错误——用谷歌测试写了几个测试——但我看不到任何遗漏。

作为测试,我写了一点

int test(){return 4;} 在头文件中,在类声明中...

然后,将测试替换为 EXPECT_EQ(x.test(), 4);

有效。伟大的。但这意味着将所有经过测试的代码都放在一个文件、一个 cpp 或其他东西中……这简直是不合理的。此应用程序项目中有几个文件。

我该如何解决这个问题?如何使用带有标头和实现文件的类进行 Google 测试链接和测试?当该标头/实现位于“应用程序”类型的不同项目中时?

到目前为止,我发现的唯一类似问题是:C++ linking issue on Visual Studio 2008 when crosslinking different projects on same solution

请帮我找到解决办法。

4

3 回答 3

9

还有另一种解决方案,我更喜欢它,因为这意味着您可以避免更改主项目:

向主项目添加“构建后操作”,以便为完全相同的源文件创建静态库。然后你可以简单地将这个依赖添加到你的 gtest 项目中。

每次编译主项目时,它都会构建应用程序和静态库。

这样您就不必创建第三个项目并保持配置同步。

希望能帮助到你。

于 2013-10-31T14:50:54.923 回答
2

所以我会有一个答案:

我的问题有 2 个解决方案:

1)将应用项目拆分为2个项目,一个会成为一个库,大部分代码;另一个将是一个应用程序,包含一个调用真实代码入口点的微小 main() (如参数解析方法或其他东西)。

然后,我可以添加一个单元测试项目 - 来测试 lib。

2) 不要拆分项目。添加一个 gtest 项目,不要创建任何依赖项。将要测试的文件添加到 gtest 项目中。gtest 项目将是一个单独的可执行文件......所有它都需要快乐。(优点:没有测试依赖)

我更喜欢第一个版本。

于 2013-03-28T16:19:36.033 回答
0

对此还有另一种解决方案。

只需为 Google 测试框架创建一个新项目。(当然,在你现有的应用解决方案下)。

然后,在您确保所有 Google 测试框架设置正确之后。(您可以在新创建的解决方案下测试它)

从您的主项目中手动包含您想要测试的代码(使用 Add -> Existing Item),然后您可以在不生成额外库的情况下测试您的代码。

这样做的好处是,当您测试一些需要 Windows DLL 的应用程序时,它要求应用程序使用多线程调试 DLL。(在您的项目属性设置中,转到 C/C++ -> 代码生成 -> 运行时库,看看你得到了什么)

并且 Google 测试框架使用了一个非常不同的运行时库(多线程调试 (/MTd))。

在链接阶段,编译器会说将应用程序生成的 lib 与多线程 DLL 和谷歌框架的 lib(多线程)链接起来有些困难。

这样就可以避免两个项目的依赖问题。(一个用于 /Mtd,一个用于 /Md)

于 2017-01-17T03:24:36.240 回答