将B2风格的测试细粒度引入CMake

将B2风格的测试细粒度引入CMake

💡 原文英文,约1800词,阅读约需7分钟。
📝

内容提要

Boost库在CMake中缺乏细粒度测试,通常将所有测试作为一个整体处理。本文提出通过动态生成CMake脚本,将单个测试可执行文件拆分为多个独立的CTest目标,从而改善测试报告和开发体验,提升CI效率。

🎯

关键要点

  • Boost库在CMake中缺乏细粒度测试,通常将所有测试作为一个整体处理。
  • Boost.Build (B2) 提供了独立测试目标的定义,但CMake集成缺乏这种细粒度。
  • CMake的构建和测试模型分为配置、构建、测试和安装四个关键阶段。
  • 在配置阶段,无法知道单元测试可执行文件中的测试,导致无法将其拆分为独立的CTest目标。
  • 通过使用TEST_INCLUDE_FILES属性,可以动态生成CMake脚本,定义每个测试用例的add_test()调用。
  • 提出的解决方案包括构建可执行文件、后期构建步骤、生成CMake脚本和条件包含。
  • 实现细节包括测试列出提取脚本和CMake测试定义生成器。
  • 通过POST_BUILD自定义命令集成测试列出步骤,确保测试在构建后自动列出。
  • 生成的CMake文件仅在存在时包含,避免在可执行文件未构建时出错。
  • 通过封装CMake函数,简化其他库的采用过程,保持Boost的细粒度测试哲学。
  • 这种方法改善了CI日志的失败报告、开发者体验、并行执行和IDE集成。
  • 其他Boost库只需支持--list-tests命令,进行最小的CMake更改即可采用此模式。

延伸问答

Boost库在CMake中测试的主要问题是什么?

Boost库在CMake中缺乏细粒度测试,通常将所有测试作为一个整体处理,导致无法单独查看测试失败情况。

如何在CMake中实现细粒度测试?

通过动态生成CMake脚本,使用TEST_INCLUDE_FILES属性,将单个测试可执行文件拆分为多个独立的CTest目标。

CMake的构建和测试模型包含哪些关键阶段?

CMake的构建和测试模型分为配置、构建、测试和安装四个关键阶段。

使用CMake进行测试时,如何处理测试发现的依赖问题?

通过在构建后运行可执行文件并使用--list-tests命令提取测试名称,动态生成CMake脚本来注册测试。

这种细粒度测试方法对CI有什么好处?

它改善了CI日志的失败报告,允许开发者更容易地运行或重新运行单个测试,提高了并行执行效率。

其他Boost库如何采用这种细粒度测试模式?

其他Boost库只需支持--list-tests命令,进行最小的CMake更改即可采用此模式。

➡️

继续阅读