前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >别再用Google Test了,试试CTest

别再用Google Test了,试试CTest

作者头像
程序员的园
发布2025-03-27 18:12:09
发布2025-03-27 18:12:09
4300
代码可运行
举报
运行总次数:0
代码可运行

您好,我是昊天,国内某头部音频公司的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参数传递命令行参数:
代码语言:javascript
代码运行次数:0
运行
复制
# 使用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支持设置测试用例之间的依赖关系,确保测试按正确的顺序执行:
代码语言:javascript
代码运行次数:0
运行
复制
add_test(NAME InitTest COMMAND init)
add_test(NAME MainTest COMMAND main)
set_tests_properties(MainTest PROPERTIES DEPENDS InitTest)
  • 并行执行测试:CTest支持并行执行测试用例,可以通过以下方式配置:
代码语言:javascript
代码运行次数:0
运行
复制
# 设置特定测试的并行级别
set_tests_properties(test_name PROPERTIES PROCESSORS 4)

# 运行时使用-j参数指定并行数
# ctest -j 4
  • 设置测试超时:为防止测试用例长时间运行,可以设置超时限制:
代码语言:javascript
代码运行次数:0
运行
复制
# 设置测试超时时间(单位:秒)
set_tests_properties(test_name PROPERTIES TIMEOUT 30)
  • 标签管理:可以为测试用例添加标签,方便分组管理和选择性执行:
代码语言:javascript
代码运行次数:0
运行
复制
# 添加测试标签
set_tests_properties(test_name PROPERTIES LABELS "UnitTest;FastTest")

# 运行时可以使用标签筛选
# ctest -L UnitTest    # 运行带有UnitTest标签的测试
# ctest -LE FastTest  # 运行不带FastTest标签的测试
  • 设置环境变量:可以为测试设置特定的环境变量:
代码语言:javascript
代码运行次数:0
运行
复制
# 设置测试的环境变量
set_tests_properties(test_name PROPERTIES ENVIRONMENT "PATH=/custom/path;VAR=value")
  • 输出比较:CTest支持将测试输出与预期结果进行比较:
代码语言:javascript
代码运行次数:0
运行
复制
# 添加带输出比较的测试
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.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. CTest是什么
  • 2. CTest怎么用
  • 3. CTest的进阶使用
  • 4. CTest的注意事项
  • 5. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档