别再用Google Test了,试试CTest
您好,我是昊天,国内某头部音频公司的C++主程,多年的音视频开发经验,熟悉Qt、FFmpeg、OpenGL。
本文还是读者群内的一个读者朋友,他提出想要了我写一篇文章介绍gtest,能有读者提需求,让我有机会写一些对大家有用的东西,我还是非常开心的。可以通过公众号获取我的微信,拉你进技术交流群
可惜的是,Gtest我只是了解过一点点,但是由于其需要依赖对应的库,对于项目来讲有些重,所以最终选择了CTest——CMake提供的测试工具。
1. CTest是什么
CTest是CMake自带的测试工具,专门用于自动化测试。如果你的项目使用CMake构建,CTest几乎是零成本集成的最佳选择。。CTest具有如下特性:
- 跨平台:CTest支持多种操作系统,包括Windows、Linux、Mac等;
- 简单易用:不需要额外安装,和CMake无缝结合;
- 功能全:支持多种测试类型,如单元测试、集成测试、回归测试等;
- 效率高:其支持并行测试,可以大大提高测试效率;
- 可扩展性强:支持自定义脚本,适应复杂测试场景。
虽然市面上有许多优秀的测试框架,如Google Test、Catch2、Boost Test,但如果你的项目已使用CMake,CTest更为便捷。
2. CTest怎么用
CTest的使用有两个前提,已经安装CMake且项目使用CMake构建。 在满足如上前提得前提下,可以使用如下得步骤使用CTest:
书写测试程序:测试程序可以是任何可执行文件,CTest会运行它并根据返回值判断测试是否通过(0为通过,其他为失败)。;
编写CMakeLists.txt文件:在CMakeLists.txt文件中,需要添加CTest相关得配置,如添加CTest得依赖、添加测试用例等;
代码语言:javascript代码运行次数:0运行复制#other cmake code
# 开启CTest
enable_testing()
add_test(NAME ${PROJECT_NAME} COMMAND ${PROJECT_NAME})
构建项目:如同普通得程序一样,可使用如下得命令构建项目:
代码语言:javascript代码运行次数:0运行复制mkdir build
cd build
cmake ..
cmake --build .
运行CTest:CTest的运行非常简单,只需要在构建目录下运行如下得命令即可:
代码语言:javascript代码运行次数:0运行复制ctest -C Debug
注意:-C 指定构建类型(Debug、Release等),需与cmake中指定的类型一致。
运行完后,便可以在控制台中看到测试结果,CTest也会在build/Testing文件夹下生成一个Test.xml文件,记录了测试结果。
3. CTest的进阶使用
CTest除了上述的基础使用外,还有许多高级功能,包括测试用例的参数、依赖管理、并行执行、超时设置、标签分组等,下面将详细介绍这些功能。
- 设置输入参数:CTest支持为测试用例设置输入参数,可以通过COMMAND参数传递命令行参数:
# 使用set_tests_properties设置命令行参数
add_test(NAME test_with_variable_args COMMAND ${PROJECT_NAME})
set_tests_properties(test_with_variable_args PROPERTIES COMMAND_ARGUMENTS "arg1;arg2")
# 注意:参数之间使用分号分隔,整个参数字符串需要用引号包围
- 定义测试依赖:CTest支持设置测试用例之间的依赖关系,确保测试按正确的顺序执行:
add_test(NAME InitTest COMMAND init)
add_test(NAME MainTest COMMAND main)
set_tests_properties(MainTest PROPERTIES DEPENDS InitTest)
- 并行执行测试:CTest支持并行执行测试用例,可以通过以下方式配置:
# 设置特定测试的并行级别
set_tests_properties(test_name PROPERTIES PROCESSORS 4)
# 运行时使用-j参数指定并行数
# ctest -j 4
- 设置测试超时:为防止测试用例长时间运行,可以设置超时限制:
# 设置测试超时时间(单位:秒)
set_tests_properties(test_name PROPERTIES TIMEOUT 30)
- 标签管理:可以为测试用例添加标签,方便分组管理和选择性执行:
# 添加测试标签
set_tests_properties(test_name PROPERTIES LABELS "UnitTest;FastTest")
# 运行时可以使用标签筛选
# ctest -L UnitTest # 运行带有UnitTest标签的测试
# ctest -LE FastTest # 运行不带FastTest标签的测试
- 设置环境变量:可以为测试设置特定的环境变量:
# 设置测试的环境变量
set_tests_properties(test_name PROPERTIES ENVIRONMENT "PATH=/custom/path;VAR=value")
- 输出比较:CTest支持将测试输出与预期结果进行比较:
# 添加带输出比较的测试
add_test(NAME output_test COMMAND ${PROJECT_NAME}_test)
set_tests_properties(output_test PROPERTIES
PASS_REGULAR_EXPRESSION "Test passed"
FAIL_REGULAR_EXPRESSION "Test failed"
)
4. CTest的注意事项
在使用CTest时,需要注意以下几点:
- 命名清晰:测试用例的命名应该具有描述性,以便于理解和维护;
- 相互独立性:每个测试用例应该尽可能独立运行,避免不必要的依赖关系。(如果确实需要测试用例之间的依赖(比如某些集成测试场景),可以使用DEPENDS属性明确设置依赖关系);
- 正确性:测试用例应该能够正确地测试代码的功能,确保测试结果的准确性;
- 覆盖率:测试用例应该能够覆盖代码的所有分支和路径,确保代码的质量;
- 可维护性:测试用例应该易于维护和修改,以便于后续的测试和维护;
- 效率:测试用例应该尽量高效,避免不必要的等待和资源消耗;
5. 总结
如果你的项目使用CMake,CTest是理想的测试工具,具有以下优点:集成方便,开箱即用;支持并行、依赖、超时等高级特性;自动生成测试报告。对于追求简洁、轻量、与CMake深度结合的项目,推荐优先使用CTest。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-25,如有侵权请联系 cloudcommunity@tencent 删除测试测试工具管理效率google