sticky
Windows 单元测试入门二:VS2017上使用Google Test RRS feed

  • 常规讨论

  • 一、Google Test简介

    Google test 是基于 xunit 体系结构的 c++ 编程语言的单元测试库,该库是依据BSD 开源协议许可发布的, 它可以在各种POSIX和 Windows平台上编译。只需修改最少的源代码,就可以对C和C ++源代码进行单元测试。 测试本身可以一次运行单个测试模块,也可以一次运行所有测试模块。 这使得调试过程非常灵活,满足了许多程序员和编码人员的需要。

    二、在VS2017上使用Google Test 

    在VS2017 15.5以及以后的版本,Google Test 已经被集成在VS IDE中,成为VC++开发的默认组件之一,这让我们在使用Google Test 时更加方便。这里主要介绍在VS2017 15.5版本中如何使用Google Test。详细步骤如下:

    1. 在一个既有Solution中,右击 选择New Project,选中Test 就可以看到有一个Google Test 的选项,  然后对工程进行命名即可。

       

       如果没有Google Test这个选项的的话,说明你的VS2017里面并没有安装,打开Visual Studio Installer,选择Modify,在左侧Individual components> Debugging and testing  或者 右侧 Desktop development with C++ 里面 选中 Test Adapter for Google Test,然后安装即可。

       2. 当完成Google Test 工程命名点击OK后,你会看到下面这个窗口,这里的Select Project to Test(Optional) 实际上就是建立一个工程关联,以我自己创建的DemoCode 工程为例,如果新建的Google Test 工程在 Demo Code文件夹内,选择 No Project 即可,否则建议选择相应的工程。这里我们选择了DemoCode。  

         那么右击Google Test工程的Reference> Add Reference 你可以看到已经添加了相关关联。

         如果Google Test工程在DemoCode工程文件夹内的话,这里我建立了一个TestTwo工程,使用 #include”../***”即可加DemoCode工程中的某个文件。如果Google Test工程不在DemoCode工程文件夹内的话, 如Test 工程,假设DemoCode文件夹和Test文件夹都在同一路径里,这个时候就也可以使用#include “../DemoCode/***” 去访问Demo Code工程内的文件,这里最好建立关联,也就是前面所说的步骤,否则可能会出现不可预知的错误。

        3. 当然Google Test 有很多自己的设置,我们可以进入Tools > Options > Test Adapter for Google Test对Google Test添加一些额外的选项。更多详细信息访问Google Test官方文档。

    到这里基本上已经完成了创建Google Test工程的步骤了。
    这里分享一下个人在使用时遇到的问题,比如说Google Test一个优点是可以实现多次测试,这个次数,是可以在Test Adapter for Google Test > Google Test > Test execution > Number of test repetition里面进行设置的。 这里我设置为3次。然而当我们点击Local Windows Debugger运行了之后发现弹出了Console窗口只显示了一次测试结果。如下图所示:

          我以为是VS2017的问题或者是我有什么设置没有调好。研究了一会发现并非我设置的问题。事实上,你点击 TEST上面的绿色的勾,你就会发现已经测试了三次了。

          同样,你也可以重新设置其他的值,然后点击Run或者点击 Test>Run>All Test 也可以完成运行工作。那么如何让Console 窗口也显示多次测试呢? 我们可以在Configuration Properties>Debugging>Command Arguments 输入:--gtest_repeat=2, 这里的2指的是重复测试2次,你也可以设置为10,100等。

    当我们编译运行时,就可以发现执行了两次测试。

    三、简单示例

    前面基本上简单介绍了如何在VS2017 15.5 以后版本上如何使用Google Test,有关Google Test 的基本使用方法,网上的各式各样的教程太多了。这里举一个示例,这个例子起源于之前有人问过我如何用 微软C++单元测试框架去完成 同一个方法多次使用不同参数来测试而不用重写这个方法。但是发现微软C++单元测试框架并没办法实现 ,经过查找发现Google Test的值参数化测试(Value-parameterized tests)可以满足这个要求。示例如下:

    // DemoCode\DemoOne.h
    //判断一个数是否为斐波那契数列中的数值
    bool IsFibonacciNum(int num)
    {
    	int x = 1, y = 1, temp = 2;
    	while (temp < num)
    	{
    		x = y;
    		y = temp;
    		temp = x + y;
    	}
    	if ((num == y) || (num == temp))
    		return true;
    	return false;
    }
    
    // Test.cpp
    #include "pch.h"
    #include "../DemoCode/DemoOne.h"
    
    using ::testing::InitGoogleTest;
    using ::testing::TestWithParam;
    using ::testing::Range;
    using ::testing::Values;
    
    TEST(TestCaseName, TestName) {
      EXPECT_EQ(1, 1);
      EXPECT_TRUE(true);
    }
    
    class TestDemoOne : public TestWithParam<int> {
    };
    
    TEST_P(TestDemoOne, TestParam)
    {
    	int num = GetParam();
    	EXPECT_TRUE(IsFibonacciNum(num));
    }
    
    INSTANTIATE_TEST_CASE_P(TestPrimeParam, TestDemoOne, Range(1, 10, 1));
    //INSTANTIATE_TEST_CASE_P(TestPrimeParam, TestDemoOne, Values(1,2,3,4,5,6,7,8,9,10));
    
    /*
    int main(int argc, char* argv[])
    {
    	InitGoogleTest(&argc, argv);
    	return RUN_ALL_TESTS();
    }
    */

    很简单的代码,关于TEST_P以及INSTANTIATE_TEST_CASE_P就不多做解释了,网上有详细的说明。 Range(1,10,1) 指的是范围从1到10,中间每次加1,如果用Values() 函数的话,那就把所有的值全部列出来就好。
    有关Value-parameterized tests可以参考官方链接中的sample 6,sample 7,sample 8 这三个示例。

    另外,值得注意的是,之前提到过有关在Tools 里面设置重复测试次数的问题,在VS2017使用过程中没有发现INSTANTIATE_TEST_CASE_P,TEST_P上有那个绿色的图标,也就没办法用Tool设置次数的方式进行重复多次测试了,没有具体研究过到底有哪些宏可以使用,个人测试除了TEST宏之外,TEST_F也会有那个图标。不论如何,使用 Command Arguments 传入重复次数的话依然可以实现重复多次测试的功能。
     

    主要参考链接:

    https://en.wikipedia.org/wiki/Google_Test
    https://docs.microsoft.com/en-us/visualstudio/test/how-to-use-google-test-for-cpp?view=vs-2017
    https://github.com/google/googletest/tree/eb9225ce361affe561592e0912320b9db84985d0/googletest/samples



    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.




    2019年2月28日 9:20
    版主

全部回复

  •   您好,按照您的步骤,使用vs2017 测试gtest,

    无法成功,

    提示错误如下,

    严重性 代码 说明 项目 文件 禁止显示状态
    错误 LNK2019 无法解析的外部符号 "int __cdecl Myadd(int,int)" (?Myadd@@YAHHH@Z),该符号在函数 "private: virtual void __thiscall GTestAdd_ErrorAdd_Test::TestBody(void)" (?TestBody@GTestAdd_ErrorAdd_Test@@EAEXXZ) 中被引用 GTest-AddFunc F:\google_test\gtestSolution\GTest-AddFunc\test.obj 1

    2019年7月24日 2:37