如何在Visual Studio 2005上设置Google C++测试框架(gtest)

kna*_*ser 81 c++ unit-testing visual-studio-2005 googletest visual-studio

它没有记录在网站上,人们似乎在设置框架时遇到了问题.有人可以逐步介绍示例项目设置.

mtl*_*nch 103

(这些指令使测试框架适用于Debug配置.将相同的进程应用于Release配置应该是非常简单的.)

获取Google C++测试框架

  1. 下载最新的gtest框架
  2. 解压缩到 C:\gtest

构建框架库

  1. C:\gtest\msvc\gtest.sln在Visual Studio中打开
  2. 将配置设置为"调试"
  3. 构建解决方案

创建和配置您的测试项目

  1. 创建一个新的解决方案,然后选择模板Visual C++> Win32> Win32控制台应用程序
  2. 右键单击新创建的项目,然后选择"属性"
  3. 将配置更改为调试.
  4. 配置属性> C/C++>常规>其他包含目录:添加 C:\gtest\include
  5. 配置属性> C/C++>代码生成>运行时库:如果您的代码链接到运行时DLL,请选择多线程调试DLL(/ MDd).如果没有,请选择多线程调试(/ MTd).
  6. 配置属性>链接器>常规>其他库目录:添加C:\gtest\msvc\gtest\DebugC:\gtest\msvc\gtest-md\Debug,取决于gtestd.lib的位置
  7. 配置属性>链接器>输入>附加依赖项:添加 gtestd.lib

验证一切正常

  1. 在包含该main()功能的Test Project中打开cpp .
  2. 粘贴以下代码:

    #include "stdafx.h"  
    #include <iostream>
    
    #include "gtest/gtest.h"
    
    TEST(sample_test_case, sample_test)
    {
        EXPECT_EQ(1, 1);
    }
    
    int main(int argc, char** argv) 
    { 
        testing::InitGoogleTest(&argc, argv); 
        RUN_ALL_TESTS(); 
        std::getchar(); // keep console window open until Return keystroke
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 调试>开始调试

如果一切正常,您应该会看到控制台窗口出现并显示单元测试结果.

  • 那是一个很棒的指南!我能够让球滚动,但我会在那里添加一个注释:测试项目和gtest库必须使用相同的代码生成选项构建,两者都是/ MDd或两者都是/ MTd,否则会是一堆链接错误. (9认同)

Nik*_*man 43

Arlaharen说的基本上是正确的,除了他遗漏了解释你的链接器错误的部分.首先,您需要在没有 CRT作为运行时库的情况下构建应用程序.无论如何,您应该始终这样做,因为它确实简化了应用程序的分发.如果你不这样做,那么你的所有用户都需要安装Visual C++运行时库,那些不需要的人会抱怨他们的系统中缺少神秘的DLL ...需要额外的几百千字节来链接CRT静态地,你以后在支持中省去了很多头痛(相信我这一点 - 我已经很难学到了!).

无论如何,要执行此操作,您将转到目标的属性 - > C/C++ - >代码生成 - >运行时库,并且需要将其设置为"多线程"以用于发布版本和"多线程调试"你的Debug构建.

由于gtest库是以相同的方式构建的,因此您需要确保链接到的正确版本,否则链接器将引入运行时库的另一个副本,这是您看到的错误(顺便说一下,这个如果你使用MFC,不应该有所作为).您需要将gtest构建为Debug和Release模式并保留两个副本.然后,在Release版本中链接gtest.lib/gtest_main.lib,在Debug版本中链接gtestd.lib/gtest_maind.lib.

此外,您需要确保您的应用程序指向存储gtest头文件的目录(在属性 - > C/C++ - >常规 - >其他包含目录中),但如果您遇到链接器错误,我假设您已经设法使这部分正确,否则您将有更多的编译器错误首先处理.


Arm*_*ndo 6

我做了一个关于设置的视频教程:http: //www.youtube.com/watch?v = mzSzwQOmMRs


Arl*_*ren 5

构建 gtest 后,这就是我所做的:

  1. 将 \mypath\gtest-1.0.1\Debug(或 Release)添加到 Common Properties->Linker->General->Additional Library Directories
  2. 将 gtest.lib 和 gtest_main.lib 添加到 Common Properties->Linker->Input->Additional Dependencies

之后,我只是根据需要使用 TEST 或 TEST_F 编写我的测试,并将它们与我的主函数一起编译:

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
Run Code Online (Sandbox Code Playgroud)

  • 我收到很多链接器错误:gtest.lib 中已经定义...例如:1&gt;LIBCMT.lib(tidtable.obj) :error LNK2005: __encode_pointer already defined in msvcrt.lib(MSVCR80.dll) 哦,顺便说一句,我正在尝试为 MFC 代码编写测试。 (5认同)

phi*_*per 5

如果您不想为测试编写自己的main(),可以使用gtest_main.lib中定义的main()函数,但是在VS2012中会出现链接器错误"必须定义入口点".在您的测试项目中将ProjectProperties-> Linker-> System-> SubSystem设置为"Console",因为这会强制VS2012查找名为"main()"的入口点,并在gtest_main.lib中找到它(如果已链接)它正确).