GoogleTest Unit test C++单元测试,简单使用及生成覆盖率html,branches未产生解决

本文详细介绍了在Ubuntu系统下安装和配置Google Test(gtest)框架的过程,包括下载、编译、链接库以及编写和运行第一个测试案例的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Step1.首先下载安装google test
对于ubuntu系统,可直接从软件源里下载更新libgtest-dev
或者 sudo apt-get install libgtest-dev
这样会自动把googtest的头文件安装到/usr/include/gtest目录下,而源文件在/usr/src/gtest目录下


也可以自己从https://googletest.googlecode.com上下载gtest的最新版本,不过google code网站经常被墙,到时候可以考虑从别的地方下载。
比如对于1.6.0版本,wget gtest-1.6.0.zip https://googletest.googlecode.com/files/gtest-1.6.0.zip
然后解压:
假定下载到根目录下,直接:
user@linux-name:~$ unzip gtest-1.6.0.zip
user@linux-name:~$ cd gtest-1.6.0


另外,把下载的gtest源代码下面的include/gtest目录拷贝到全局头文件目录,如:


user@linux-name:~/gtest-1.6.0$ cp -r include/gtest/ /usr/local/include/

user@linux-name:~/gtest-1.6.0$ cp -r include/gtest/ /usr/include/
然后在用到gtest的文件中,用#include <gtest/gtest.h>指令就可以让编译器找到gtest的头文件了。


Step2.编译gtest的链接库,因为原则上这个链接库是不能下载的,最好本地编译一份用:


执行
user@linux-name:~/gtest-1.6.0$ g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ./src/gtest-all.cc
会在当前目录产生gtest-all.o


${GTEST_DIR}表示Gtest源文件路径,这里如果当前目录就是源文件路径,${GTEST_DIR}用"./"
-I指定的两个搜索路径可以去掉,因为所需要的头文件都已经放到系统的include下和当前路径下了。 (g++ ./src/gtest-all.cc )


然后


~/gtest-1.6.0$ g++ -I./include -I./ -c ./src/gtest_main.cc


会在当前目录产生gtest_main.o,这个不是必须的,这里面包含了gtest代码里提供的一个默认的main函数(执行RUN_ALL_TESTS()),所以链接到自己写的测试函数里,可以不用在test文件里写main函数,如有特殊需要,还是得自己写main函数。


然后把两个编译输出文件合并成一个静态库libgtest.a,可以拿出来,便于放到以后的gtest工程下链接用。
~/gtest-1.6.0$ ar -rv libgtest.a gtest-all.o gtest_main.o


 

然后开始尝试写第一个测试,这里就是和普通的linux C++开发步骤一样。我们可以用gtest里提供的sample来实验,也可以自己写一个很简单的测试。

 

sample.h

  1. //sample.h
  2. #pragma once
  3. int fun(int a, int b);

 

sample.cpp

  1. #include"sample.h"
  2. int fun(int a, int b) 
  3.     return (a-b); 

 

test.cpp这里我们用了四种ASSERTION(断言)方法,给初学者一个印象,具体gtest的各种断言用法还要参考gtest文档
 

  1. #include "gtest\gtest.h" 
  2. #include "sample.h"
  3.   
  4.  //TEST (gtest macro),fun:function name to test, "case1" test case name
  5. TEST(fun, case1) 
  6.         EXPECT_LT(-2, fun(1, 2));
  7.        EXPECT_EQ(-1, fun(1, 2)); 
  8.        ASSERT_LT(-2, fun(1, 2));
  9.        ASSERT_EQ(-1, fun(1, 2)); 
  10.   
  11. /*
  12. int _tmain(int argc, _TCHAR* argv[]) 
  13.     testing::InitGoogleTest(&argc, argv); 
  14.     return RUN_ALL_TESTS(); 
  15. }
  16. */





Step3. 编译要测试的代码(假设文件名为sample.cpp)


g++ -c sample.cpp


 
Step4. 编译单元测试的代码(假设文件名为test.cpp)


g++ -c test.cpp


 
Step5.
libgtest.a或其他需要的库链接、生成可执行程序


g++ test.o sample.o libgtest.a -o test -lpthread


-lpthread是必须要有的,否则链接时会出错gtest-all.cc:(.text._ZNK7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE16GetOrCreateValueEv[_ZNK7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE16GetOrCreateValueEv]+0x7a): undefined reference to `pthread_setspecific'


Step6. 运行生成的test文件,可输出测试结果。
 

goldwyn@goldwyn-VirtualBox:~/unittest/gtest_example2$ ./test

Running main() from ./src/gtest_main.cc

[==========] Running 1 test from 1 test case.

[----------] Global test environment set-up.

[----------] 1 test from fun

[ RUN      ] fun.case1

[       OK ] fun.case1 (0 ms)

[----------] 1 test from fun (0 ms total)

 

[----------] Global test environment tear-down

[==========] 1 test from 1 test case ran. (1 ms total)

[  PASSED  ] 1 test.

goldwyn@goldwyn-VirtualBox:~/unittest/gtest_example2$

 

 

step7生成覆盖率html文件

  g++ -fprofile-arcs -ftest-coverage -c sample.cpp       ----产生中间文件sample.gcno

  g++ -fprofile-arcs -ftest-coverage test.o sample.o libgtest.a -o test -lpthread   ----重新生成test

  ./test   -----运行test ,产生sample.gcda文件

lcov --directory . --capture --output-file app.info   ----产生中间html中间文件app.info

genhtml -o results app.info   -----生成result文件夹,index.html打开可以看到覆盖率统计

 

注意:一开始的时候,生成的报告,只有 line和functions的统计,没有branches的统计。

修改:/etc/lcovrc文件

lcov_branch_coverage=1

genhtml_branch_coverage=1

<think>我们正在讨论的是如何在代码仓库中配置以触发Jenkins执行Google Test自动化单元测试。根据之前的上下文,我们知道Gerrit和Jenkins的集成是通过Gerrit Trigger插件实现的,而代码仓库本身需要包含单元测试代码和构建脚本。但是,用户现在问的是在代码仓库中需要添加哪些具体的配置或文件。 关键点: 1. 代码仓库中需要包含Google Test单元测试代码(通常是以_test.cc或类似的命名约定的C++文件)。 2. 需要有一个构建脚本(如Makefile、CMakeLists.txt)来编译代码和测试程序。 3. 为了触发Jenkins,实际上代码仓库中并不需要特殊的配置文件(因为触发是由Gerrit服务器的事件触发Jenkins的Gerrit Trigger插件)。但是,为了在Jenkins中正确构建和测试,我们通常会在代码仓库中放置一个Jenkinsfile(用于Pipeline任务)或者确保Jenkins任务的配置能够正确构建仓库中的代码。 但是,如果使用Jenkins Pipeline(推荐),则需要在代码仓库的根目录添加一个Jenkinsfile,该文件定义了构建、测试和报告的步骤。这样,当Jenkins被触发时,它会从仓库中获取这个Jenkinsfile并执行其中定义的流水线。 因此,在代码仓库中需要添加的文件主要是: - Jenkinsfile(用于定义Pipeline) - 单元测试代码(已经存在) - 构建脚本(如CMakeLists.txt,已经存在) 另外,为了生成测试报告供Jenkins解析,还需要在运行测试时输出JUnit格式的报告(Google Test支持此功能)。 所以,具体步骤: 1. 在代码仓库根目录创建Jenkinsfile,内容示例: ```groovy pipeline { agent any triggers { gerrit(events: [patchsetCreated()], project: 'your-project-name', branches: '**') } stages { stage('Build') { steps { sh 'mkdir build' dir('build') { sh 'cmake ..' sh 'make' } } } stage('Test') { steps { dir('build') { // 运行测试并生成JUnit格式的报告 sh './run_tests --gtest_output="xml:test_results.xml"' } } } } post { always { // 发布测试报告 junit 'build/test_results.xml' // 将结果反馈给Gerrit gerritReview verified: currentBuild.result == 'SUCCESS' ? 1 : -1 } } } ``` 2. 确保单元测试可执行文件(示例中的run_tests)在构建后生成,并且支持生成JUnit格式的报告(通过--gtest_output参数)。 3. 在Jenkins中创建一个Pipeline任务,并配置从Gerrit仓库获取代码,并指定Jenkinsfile路径(默认为根目录的Jenkinsfile)。 4. 在Gerrit Trigger插件中配置触发条件(如之前所述),但注意在Pipeline中我们也在Jenkinsfile中定义了triggers,这样Jenkins就会监听Gerrit事件。 注意:如果使用Freestyle任务,则不需要Jenkinsfile,但是需要在Jenkins任务中配置构建步骤和Gerrit触发。不过,为了将配置也纳入版本控制,推荐使用Jenkinsfile。 因此,在代码仓库中需要添加的文件就是Jenkinsfile(如果使用Pipeline)以及确保构建脚本和测试代码存在。同时,确保测试命令能够生成JUnit报告。 引用说明: [^1]提到Jenkins是一个开源的持续集成工具,支持自动化构建、测试和部署。 [^3]描述了开发人员提交代码到Git仓库,然后Jenkins拉取代码并完成编译、测试等步骤的流程。 因此,我们通过将Jenkinsfile放入代码仓库,实现了持续集成流程的版本控制,使得每次代码推送(通过Gerrit事件)都能触发定义好的Pipeline,从而运行Google Test单元测试。 相关问题: 1. Jenkinsfile中如何定义多个构建阶段? 2. Google Test如何生成JUnit格式的测试报告? 3. 如何配置Jenkins Pipeline任务从Gerrit仓库获取代码?</think>在代码仓库中配置触发 Jenkins 执行 Google Test 自动化单元测试,主要需要添加以下关键文件和配置: --- ### 1. **测试脚本和构建文件** 在代码仓库中添加以下文件,用于编译和运行 Google Test: ```bash your-repo/ ├── CMakeLists.txt # 项目构建文件 ├── src/ # 源码目录 ├── tests/ # 单元测试目录 │ ├── CMakeLists.txt # 测试专用构建文件 │ └── sample_test.cpp # Google Test 测试用例 └── scripts/ └── run_tests.sh # 测试执行脚本 ``` #### **关键文件说明**: 1. **测试用例文件** (`tests/sample_test.cpp`) 包含 Google Test 单元测试代码: ```cpp #include <gtest/gtest.h> TEST(MathTest, Addition) { EXPECT_EQ(2 + 2, 4); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ``` 2. **测试专用 CMake 文件** (`tests/CMakeLists.txt`) 配置测试可执行文件并生成 JUnit 格式报告: ```cmake add_executable(run_tests sample_test.cpp) target_link_libraries(run_tests gtest gtest_main) # 添加测试目标(生成XML报告) add_test(NAME GoogleTest COMMAND run_tests --gtest_output=xml:test_results.xml) ``` 3. **测试执行脚本** (`scripts/run_tests.sh`) Jenkins 调用的入口脚本: ```bash #!/bin/bash mkdir -p build && cd build cmake .. -DCMAKE_BUILD_TYPE=Debug make ctest --output-on-failure # 运行测试并生成报告 ``` --- ### 2. **Jenkins 流水线定义文件** 在仓库根目录添加 `Jenkinsfile`,定义自动化流程: ```groovy // Jenkinsfile pipeline { agent any triggers { gerrit(events: [patchsetCreated()], project: 'your-project', branches: '**') } stages { stage('Build & Test') { steps { sh 'scripts/run_tests.sh' // 执行测试脚本 } } } post { always { junit 'build/test_results.xml' // 发布测试报告 gerritReview verified: currentBuild.result == 'SUCCESS' ? 1 : -1 } } } ``` --- ### 3. **Gerrit 触发配置** 在 Gerrit 项目中添加 `.gitreview` 文件(可选),确保推送时触发 Jenkins: ```ini [gerrit] host=your-gerrit-server.com port=29418 project=your-project.git ``` --- ### 4. **配置文件作用说明** | 文件/目录 | 作用 | |---------------------|----------------------------------------------------------------------| | `tests/` | 存放所有单元测试代码 | | `scripts/run_tests.sh` | 统一入口脚本,标准化测试流程 | | `Jenkinsfile` | 定义 CI/CD 流水线,声明 Gerrit 触发条件和测试报告处理逻辑 | | `.gitreview` | 配置 Gerrit 仓库信息(非必需) | | 测试输出 XML 报告 | Google Test 生成的 `test_results.xml`,供 Jenkins 解析和展示结果 [^1] | --- ### 5. **工作流程说明** 1. **开发人员推送代码**到 Gerrit: ```bash git push origin HEAD:refs/for/master ``` 2. Gerrit 通过 `patchsetCreated` 事件触发 Jenkins 任务 [^3] 3. Jenkins 自动执行流程: - 克隆代码仓库 - 运行 `scripts/run_tests.sh` - 编译并执行 Google Test - 生成 XML 测试报告 4. 结果反馈到 Gerrit: - 测试通过 → Verified +1 - 测试失败 → Verified -1(阻止合并) > **注**:需提前在 Jenkins 中配置 Gerrit 服务器地址和凭据 [^2] --- ### 6. **验证配置** 推送代码后检查: 1. 在 Jenkins 控制台查看构建日志和测试输出 2. 在 Gerrit 界面确认 Verified 标签状态 3. 在 Jenkins 测试报告中查看 Google Test 详情 --- ### 优化建议 1. **增量测试**:在 `run_tests.sh` 中实现只编译/测试修改的文件 2. **缓存依赖**:在 Jenkins 中缓存 gtest 库加速构建 3. **并行测试**:添加 `--gtest-parallel` 参数加速测试执行 通过以上配置,代码推送将自动触发 Google Test 单元测试,实现质量门禁 [^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值