windows环境下,使用docker实现gtest+lcov单元测试和覆盖率统计
一。创建docker容器
1.参考菜鸟教程https://www.runoob.com/docker/windows-docker-install.html ,完成dockers在win10上的环境安装;
2.拉取指定版本的 CentOS 镜像:docker pull centos:centos7
3.查看本地镜像:docker images
4.运行容器:docker run -itd --name centos-test centos:centos7
5.查看容器的运行信息:docker ps
6.进入容器:docker exec -it centos-test /bin/bash
二。进入到Centos docker中,就相当于在虚拟机中玩了
1.安装git:yum install -y git
本来安装git是想从github上直接拉gtest的安装包(git clone https://github.com/google/googletest),奈何网速实在不给力,就从页面直接下载到本地,然后从本地拷贝的docker容器中
从windows本地拷贝到容器,先进入到本地放压缩包的目录,然后打开cmd窗口,执行命令将压缩包拷贝到centos根目录
docker cp release-1.8.0.zip centos-test:/
2.安装zip unzip工具,用于解压gtest包
yum install -y zip unzip
unzip release-1.8.0.zip
cd /googletest-release-1.8.0 进入解压的包内
3.下来要编译生成gtest的静态库,需要在centos中装Cmake,这块参考网上的博客即可,下面贴出来:
步骤一、安装gcc等必备程序包(已安装则略过此步)
yum install -y gcc gcc-c++ make automake
步骤二、安装wget (已安装则略过此步)
yum install -y wget
步骤三、获取CMake源码包(如果获取不到,依旧从网页下载下来,然后再拷贝的docker容器中)
wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz
步骤四、解压CMake源码包
tar -zxvf cmake-2.8.10.2.tar.gz
步骤五、进入目录
cd cmake-2.8.10.2
步骤六
./bootstrap
步骤七
gmake
步骤八
gmake install
4.生成gtest静态库
cd googletest
cmake CMakeLists.txt (生成Makefile)
make (生成两个静态库:libgtest.a libgtest_main.a)
拷贝到系统目录,注意,如果下诉目录位置在不同版本位置有变动,用find . -name "libgtest*.a" 找到位置
cp libgtest*.a /usr/lib
cp –a include/gtest /usr/include
三 验证gtest是否安装成功。
自己创建个目录,在里面用vim创建一个c++文件,比如:test.cc,内容如下:
#include<gtest/gtest.h>
int add(int a,int b){
return a+b;
}
TEST(testCase,test0){
EXPECT_EQ(add(2,3),5);
}
int main(int argc,char **argv){
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
然后在该目录下执行
g++ test.cc -lgtest -lpthread
./a.out
出现下面结果即证明gtest可以用了
四。安装lcov覆盖率测试工具
1.依旧是下载lcov-1.14.tar.gz安装包拷贝到docker容器中
解压并进入lcov-1.14目录:make install 安装
2.安装成功后,重新编译test.cc那个文件,但是编译的时候要加上两个参数:-fprofile-arcs -ftest-coverage
进入到源码目录,执行 g++ -fprofile-arcs -ftest-coverage test.cc -lgtest -lpthread (会为每个源文件生成.gcno结尾的文件。)
3.执行编译后的文件:./a.out (这里会为每个源文件生成gcda结尾的文件)
4.收集测试文件运行后产生的覆盖率文件:lcov --rc lcov_branch_coverage=1 -c -d ./ -o cover.info
执行上述指令若出现Can't locate Digest/MD5.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /us错误的解决办法:
yum -y install perl-Digest-MD5
5.某些情况下,需要屏蔽第三方库的覆盖率计算或者只统计某个文件夹下的覆盖率计算,就需要用到lcov的文件过滤功能。
分为两种情况,
- 移除指定的目录,加参数--remove
lcov --remove cover.info '*/include/*' '' -o result.info
- 筛选固定目录 加参数--extract
lcov --extract cover.info '*/include/*' '' -o result.info
这里,我只想统计我创建的目录下源文件的覆盖率,那么
lcov --extract cover.info '*/suchao/*' -o result.info
6 使用genhtml生成覆盖率报表
genhtml --branch-coverage -o result result.info
得到覆盖率
在docker环境下 我们看不到html统计报表,我们可以把测试目录从容器拷贝到本地查看
docker cp centos-test:/suchao D:/
用浏览器打开index.html即可看到覆盖率统计情况