零基础学习CMake--第六章:测试与调试——用CTest让项目更可靠6.3 测试报告生成:HTML/XML格式输出与持续集成(CI) - 指南
第六章:测试与调试——用CTest让项目更可靠
6.3 测试报告生成:HTML/XML格式输出与持续集成(CI)
从“命令行输出”到“可视化报告”:测试结果的“最后一公里”
在前面的章节中,我们用ctest运行测试,只能看到命令行的“Passed/Failed”输出。但在实际项目中,我们需要:
可视化报告:HTML格式的报告,直观展示每个测试用例的执行情况、耗时、错误信息;
持续集成:每次代码提交自动运行测试,生成报告并通知团队;
结果归档:XML格式的报告,便于CI系统解析、存储和追溯。
这一节,我们将学习如何用CTest生成HTML/XML报告,并将测试集成到GitHub Actions(主流CI工具)中,实现“代码提交→自动测试→报告生成”的全流程自动化。
一、CTest测试报告格式介绍
CTest支持多种报告格式,最常用的是:
JUnit XML:行业标准格式,几乎所有CI系统(GitHub Actions、Jenkins、GitLab CI)都支持解析;
HTML:可视化界面,适合本地查看或嵌入项目文档;
Plain Text:纯文本输出,适合日志归档。
二、生成JUnit XML报告(用于CI集成)
2.1 命令行生成XML报告
CTest提供了--output-junit参数,直接生成JUnit格式的XML报告:
# 在项目build目录中运行
ctest --test-dir tests \ # 指定测试目录
--output-junit report.xml \ # 输出XML报告文件名
--verbose # 可选:显示详细执行过程
运行后,会在build目录生成report.xml,内容如下(简化):
2.2 配置CMake自动生成XML报告
可以在CMakeLists.txt中添加自定义目标,一键生成XML报告:
# 在父CMakeLists.txt中添加
add_custom_target(generate_test_report
COMMAND ctest --test-dir tests --output-junit ${CMAKE_BINARY_DIR}/report.xml
COMMENT "Generating JUnit XML test report..."
)
运行cmake --build . --target generate_test_report,即可生成报告。
三、生成HTML报告(本地可视化)
CTest自带HTML报告生成器,通过--output-html参数生成:
ctest --test-dir tests \
--output-html report.html \
--title "FileEncryptor Test Report" # 报告标题
生成的report.html是完整的网页文件,包含:
测试套件的整体统计(通过/失败数量、耗时);
每个测试用例的详细信息(名称、状态、耗时、错误日志);
可展开/折叠的测试树结构。
示例HTML报告截图(简化):
https://cmake.org/cmake/help/latest/_images/CTestTestReport.png
四、集成到GitHub Actions(持续集成)
GitHub Actions是免费的CI/CD服务,能自动运行测试并生成报告。我们以文件加密工具项目为例,配置CI流程:
4.1 准备GitHub仓库
将项目上传到GitHub,并启用GitHub Actions(默认已启用)。
4.2 创建Workflow文件
在项目根目录创建.github/workflows/ci.yml,内容如下:
name: FileEncryptor CI
on: [push, pull_request] # 触发条件:push或PR
jobs:
test:
runs-on: ubuntu-latest # 运行环境:Ubuntu最新版
steps:
# 1. 检出代码
- name: Checkout code
uses: actions/checkout@v4
# 2. 安装依赖(OpenSSL、Boost)
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y libssl-dev libboost-filesystem-dev libboost-system-dev
# 3. 配置CMake
- name: Configure CMake
run: |
mkdir build
cd build
cmake .. -DBUILD_TESTS=ON # 启用测试
# 4. 构建项目
- name: Build project
run: |
cd build
cmake --build .
# 5. 运行测试并生成XML报告
- name: Run tests and generate report
run: |
cd build
ctest --test-dir tests --output-junit report.xml --verbose
# 6. 上传报告作为Artifact(可在PR中查看)
- name: Upload test report
uses: actions/upload-artifact@v4
with:
name: Test Report
path: build/report.xml
retention-days: 7 # 保留7天
4.3 效果演示
推送代码到GitHub:触发CI workflow;
查看CI状态:在GitHub仓库的“Actions” tab中,能看到测试是否通过;
查看测试报告:点击“Artifacts”→“Test Report”→“report.xml”,GitHub会自动渲染JUnit报告:
https://docs.github.com/assets/cb-138303/images/help/repository/manual-check-run-test-report.png
五、高级技巧:自定义CI报告
5.1 过滤测试用例
如果只想运行特定标签的测试(比如“fast”),可以在ctest命令中添加-L参数:
- name: Run fast tests
run: |
cd build
ctest --test-dir tests -L fast --output-junit report.xml
5.2 显示详细错误日志
在ctest中添加-V参数,输出详细日志(包括测试失败的原因):
- name: Run tests with verbose output
run: |
cd build
ctest --test-dir tests -V --output-junit report.xml
5.3 集成CDash(可选)
CDash是一个开源的测试仪表盘工具,可以收集多个项目的测试报告,生成可视化面板。配置步骤:
安装CDash:
sudo apt install cdash;启动CDash服务:
cdash-configure;修改CTest配置,指向CDash服务器:
set(CTEST_DROP_METHOD "http") set(CTEST_DROP_SITE "your-cdash-server.com") set(CTEST_DROP_LOCATION "/submit.php?project=FileEncryptor")
六、总结:测试报告与CI的价值
可视化:HTML报告让测试结果一目了然;
自动化:CI集成实现“代码提交→自动测试→报告生成”;
追溯性:XML报告便于存储和排查问题;
团队协作:PR中的测试报告让评审更高效。
下一章预告:调试技巧——GDB与LLDB高级用法,解决加密算法中的棘手问题!
(配套资源:GitHub Actions配置示例,CTest报告生成脚本)
本节要点:
用
--output-junit生成JUnit XML报告,用于CI解析;用
--output-html生成可视化HTML报告;配置GitHub Actions自动运行测试并上传报告;
测试报告的核心价值:可视化、自动化、追溯性。
浙公网安备 33010602011771号