gtest单元测试配置+vs 2015+OpenCppCoverage输出测试覆盖率 || cmake命令构建项目以及编译以及命令行测试

it2022-05-05  160

目录

一、仅使用gtest+vs2015

1.下载和编译gtest

2.创建具体的项目 

 3.gtest自带十个例子

二、使用gtest+vs2015,并且输出测试覆盖率

1.使用vs 2015企业版

2.使用OpenCppCoverage +vs 2015(企业版,社区版都可以)

三、使用cmake生成项目,构建+gtest进行单元测试+使用命令行执行opencppcoverage输出测试覆盖率

1.基本的构建和介绍,请看下面这篇文章

2.构建引入gtest的项目

 3.使用opencppcoverage输出测试覆盖率

补充 

Cmakelists配置多级目录的gtest项目(项目代码和测试代码分离)


 

 

 

 

 

 

 

 

 

 

 


前言

首先,关于c++的单元测试的方法偏少(相比java)

其次,在windows环境下的部署方法更少

最后,如果还要输出测试覆盖率,搜索之后发现,几乎没有教程,有也是零星几句,也没有更详细的配置

因此,走过一遍之后打算记录一下过程,方便以后配置也方便有这方面需求的人的查看

声明,文章中涉及到的工具用的是vs2015 enterprise/community+gtest-release-1.7.0+Opencppcoverage+cmake

如何搭配使用见文章详情

一、仅使用gtest+vs2015

1.下载和编译gtest

首先下载vs 2015,网上有社区版(免费)+企业版(收费/破解) 如果只需要vs+gtest,并且不使用cmake命令,而且不需要覆盖率用的话,社区版就够了,如果需求不满足前面的条件,就去下载企业版enterprise

我没放c盘,因为太大了,动不动就10g了

接着下载gtest

https://github.com/google/googletest/tree/release-1.7.0

下载这个版本就够了,解压之后要进行编译

对gtest.sln进行编译

Gtest源码下载之后,在vs中打开msvc文件夹的gtest.sln

打开之后有4个工程

然后重新编译,debug、release两个模式都要编译。编译后,在msvc/gtest/下有debug、release两个文件夹。

  msvc\gtest\Debug - Debug方案下的二进制文件:gtestd.lib、gtest_maind.lib(注意主文件名的d后缀)   msvc\gtest\Release - Release方案下的二进制文件:gtest.lib、gtest_main.lib

说明   编译就是右键-生成/重新生成 

2.创建具体的项目 

创建具体的测试项目,以debug模式为例

在VS2015中,创建WIN32控制台应用右击工程名,点击属性,配置工程属性; 展开配置属性——C/C++——常规,在附加包含目录中添加gtestinclude文件

比如:

D:\Test-my\googletest-release-1.7.0\googletest-release-1.7.0\include;

 

3.展开“C/C++——代码生成,在运行库中修改为多线程调试(/MTd)”

 

4.展开链接器——输入,在附加依赖项中添加第二步生成的gtestd.lib,附加上正确的路径;在这里有个小技巧,.lib是静态库文件,你可以把它们放到一个专门的lib文件夹下

比如

D:\Test-my\googletest-release-1.7.0\googletest-release-1.7.0\lib\gtestd.lib;

 5.测试实例

头文件

 

源文件

测试文件

 结果

 

说明,具体语法的断言写法,网上到处都有。主要是配置过程很容易出错。

如果没有main函数,会调用gtest_main.cc ,配置好gtest_maind.lib

https://www.cnblogs.com/qinwanlin/p/6574573.html

 3.gtest自带十个例子

但是需要编译,因为他没有lsn文件是不能打开执行的

但是这个网上有教程,我就不赘述了

附上链接

 

https://www.cnblogs.com/duxiuxing/p/4272343.html              如何编译gtest自带的十个samples例子,当然不能放在同一个项目里,有些可以放在一个项目里有些不能。我编译的时候分成了两个或者三个项目,一个是自带main函数不需要配置gtest_main,一个是没有main函数,需要配置,放在一起回出错。

并且要注意引入的头文件。

 

 

https://blog.csdn.net/yansmile1/article/details/70256911  gtest的samples的解释说明

 

二、使用gtest+vs2015,并且输出测试覆盖率

1.使用vs 2015企业版

因为企业版功能是比较完善的

所以如果下载的是企业版的话,可以构建项目+测试项目,企业版会展示出你写的所有测试类,并且执行之后会告诉你通过情况,并且给出覆盖率情况

这个需要先新建一个项目(我是控制台32项目),也需要下载一个插件Unit Test Generator

先给出官网给的说明

https://docs.microsoft.com/zh-cn/visualstudio/test/using-code-coverage-to-determine-how-much-code-is-being-tested?view=vs-2015

再给出已经有人写的教程,可能有的是c#,有的是c++,但操作是一样的,选择对应的语言就可以,我觉得他已经写得非常详细了,我就是参考这样配置的

https://www.cnblogs.com/tonyztx/p/5297959.html

编译之后,点击测试-运行-测试项目

然后测试-分析代码覆盖率

 

 

2.使用OpenCppCoverage +vs 2015(企业版,社区版都可以)

下面这篇文章虽然介绍的很简单,但是至少提供了方向

https://blog.csdn.net/quiet_girl/article/details/78075070

如果不使用命令行的话,第二种做法就够了,直接通过插件安装

 

 然后选择工具,run opencpp就可以了

出现红色绿色的阴影

红色是未覆盖,绿色是覆盖

 

三、使用cmake生成项目,构建+gtest进行单元测试+使用命令行执行opencppcoverage输出测试覆盖率

 

CMake是一个工程构建工具,能够自动生产makefile文件,方便构建编译文件,链接库,安装文件等。

每个需要编译的目录(子目录)都要有一个CMakeLists.txt文件

1.基本的构建和介绍,请看下面这篇文章

https://blog.csdn.net/yaoyuanyylyy/article/details/79024962

上面介绍了怎么使用cmake构建一个项目并且执行

2.构建引入gtest的项目

下面这篇文章简单的介绍了,但执行过程出现各种问题

http://www.sohu.com/a/251930931_216613

下面详细介绍我的实现步骤

 

首先建两个文件(仅供参考)

文件内容如下 

test.cpp

#include <gtest/gtest.h> #include <string> #include <map> using namespace std; class TestMap :public testing::Test { public: //添加日志 static void SetUpTestCase() { cout << "SetUpTestCase" << endl; } static void TearDownTestCase() { cout << "TearDownTestCase" << endl; } virtual void SetUp() //TEST跑之前会执行SetUp { cout << "SetUp" << endl; test_map.insert(make_pair(1, 0)); test_map.insert(make_pair(2, 1)); test_map.insert(make_pair(3, 2)); test_map.insert(make_pair(4, 3)); test_map.insert(make_pair(5, 4)); } virtual void TearDown() //TEST跑完之后会执行TearDown { cout << "TearDown" << endl; test_map.clear(); } map<int, int> test_map; }; TEST_F(TestMap, Find) //此时使用的是TEST_F宏 { map<int, int>::iterator it = test_map.find(1); ASSERT_NE(it, test_map.end()); } TEST_F(TestMap, Size) { ASSERT_EQ(test_map.size(), 5); }

CMakelists.txt

 

cmake_minimum_required(VERSION 3.6) include_directories(D:/Test-my/gtest/demo3/googletest-release-1.7.0/googletest-release-1.7.0/include) #关闭gmock,根据您的情况打开 set(BUILD_GMOCK OFF) #编译库的例子 add_subdirectory(D:/Test-my/gtest/demo3/googletest-release-1.7.0/googletest-release-1.7.0) #新建一个测试工程 project(learnGoogleTest) link_directories(D:/Test-my/gtest/demo3/googletest-release-1.7.0/googletest-release-1.7.0/lib) add_executable(learnGoogleTest test.cpp) target_link_libraries(learnGoogleTest gtest gtest_main) #这个必须放在project的后面 IF(MSVC) message("run here") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") endif()

具体设置不再描述,看一下就明白了,中间比如路径设置什么的,为了简单和整体性的话可以前面进行一个set,方便后面 进行使用,在这里我全部用的是绝对路径

 接下来通过cmake指令构建一个项目

如果没有下载cmake和配置环境,需要先下载配置环境变量,下面这篇文章讲的还是比较清晰的,他描述了如何使用cmake命令的gui去生成项目,使用vs打开项目进行编译,或者使用vs自带的命令行执行msbuild进行构建

https://blog.csdn.net/yaoyuanyylyy/article/details/79024962

 

但是如果全程都要用命令行呢(方便跨平台)

通过当前目录的cmd就可以直接进入命令行

或者使用cd /d d:进入盘

下面的指令写的很清晰了 ,构建build目录,然后cmake ..

然后执行cmake - build . 

发现在build目录下面有.sln 这是你cmakelists.txt里面写的项目名称,出现.sln说明项目生成成功

接下来是编译生成debug目录,最最关键的一个步骤 

完了,此时我发现我生成项目可以用cmd命令行的cmake,也可以使用可视化界面

但是编译项目,貌似只能用vs自带的一个命令行工具(linux可以直接编译)

执行msbuild命令

 

此时生成debug目录,目录里面就有可执行文件

 

 双击执行

好了,使用cmakelists构建以及编译项目到此结束了

默认是生成vs项目,可以使用命令行参数生成其他项目,也可以使用可视化界面选择生成的项目类型 

 

 3.使用opencppcoverage输出测试覆盖率

下面这个网页给出了简单的命令

但是也是有一些问题的

所以给出对应的我的测试项目的命令

在debug目录下面进入cmd命令窗口

D:\Test-my\gtest\demo3\build\Debug>OpenCppCoverage.exe --sources D:\Test-my\gtest\demo3 --export_type=html -- D:\Test-my\gtest\demo3\build\Debug\learnGoogleTest.exe

执行成功

需要注意的是,opencpp输出的覆盖率是代码行覆盖率

 而且opencpp的作者也说了是line coverage

目前也没有找到windows下其他更好的测试覆盖率的输出了

以上,希望对大家能够有所帮助。 

补充 

Cmakelists配置多级目录的gtest项目(项目代码和测试代码分离)

另外,在我的另一篇博客里补充了,多级目录下gtest项目的配置

https://blog.csdn.net/yysave/article/details/96996123

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


最新回复(0)