【问题标题】:CMake naming convention for option name to generate project with unit tests?选项名称的 CMake 命名约定以生成带有单元测试的项目?
【发布时间】:2021-04-02 11:44:45
【问题描述】:

一些 CMake 项目为生成具有单元测试支持的项目添加了条件支持。项目根 CMakeLists.txt 文件中遵循的模式类似于:

cmake_minimum_required(VERSION 3.0)

(...)
# add subdirectories, libraries, executables, etc
(...)

option(ENABLE_TESTS "Generate project with unit test support" ON)
if(ENABLE_TESTS)
    enable_testing()
    add_subdirectory(tests)
endif()

虽然这种模式相当普遍,但我也注意到为单元测试选项选择的名称有些随意。尽管BUILD_TESTING 选项是在cmake v3.15 中引入的,但该名称在该版本之前远非标准名称。到目前为止,我注意到使用以下选项名称的项目:

  • BUILD_TESTS
  • BUILD_TESTING
  • ENABLE_TESTS
  • RUN_TESTS
  • 等等……

考虑到这一点,有人知道是否有标准命名约定来控制是否将单元测试添加到 CMake 项目中?

【问题讨论】:

  • 选项 BUILD_TESTING 在 CMake 3.0 之前就已经存在。它是 CTest 模块的选项,而不仅仅是单元测试。参见例如documentation for CTest。而且我不知道可以控制测试可用性的其他(自定义)变量的命名约定。
  • 恐怕选项BUILD_TESTING 来自ctest,而不是cmake 本身。尽管 ctest 很不错,但它仍然是一个外部模块,项目需要显式导入才能使用它。
  • is from ctest, not cmake per se 我不明白。不,ctestcmake 的一部分。
  • @KamilCuk ctest 是 cmake 的扩展,就像许多其他与 cmake 捆绑在一起的扩展一样,例如 GoogleTest 或 AndroidTestUtilities。它绝不是内置的,也不是 cmake 构建系统的一部分。例如,您需要显式包含 ctest 模块才能使用它,否则您不需要。欲了解更多信息,请阅读cmake.org/cmake/help/latest/module/CTest.html
  • 但是 ctest 是由 kitware 维护的,作为 cmake 的一部分随 cmake 一起提供。 you need to explicitly include the ctest module 您还需要 include(CheckSymbolExists) 才能使用 check_symbol_exists 和许多其他库实用程序。就像 C 中的 #includestdio.h 是 C 的一部分,同样ctestcmake 的一部分。我认为GoogleTest 它主要是一个 C++ 测试框架,而不是 cmake 框架。 googletest 是否用于测试其他语言的测试?喜欢 bash 脚本?

标签: unit-testing cmake ctest


【解决方案1】:

是否有标准命名约定来控制是否将单元测试添加到 CMake 项目中?

我通常会看到这样的模式:

if (YOUR_LIBRARY_BUILD_TESTING AND BUILD_TESTING)
    enable_testing()
    add_subdirectory(tests)
endif()

这样:

  • 您可以使用 -DYOUR_LIBRARY_BUILD_TESTING=1 -DBUILD_TESTING=1 启用库测试。
  • 其他人可以使用-DHIS_LIBRARY_BUILD_TESTING=1 -DBUILD_TESTING=1 启用他的库测试
  • 当其他人的库包含您的库时,他可以选择是否要构建您的库测试,并且通常他只想运行他的单元测试,而不是您的。
    • 另一种方法是在add_subdirectory 周围推送/弹出BUILD_TESTING,就像set(sav ${BUILD_TESTING}) set(BUILD_TESTING 0) add_subdirectory(your_library) set(BUILD_TESTING ${sav}) 一样,看起来很难看。如果您想要测试依赖库(例如,使用上游未测试的特定不同工具链),您必须编辑 cmake 文件。
  • 您的库的包构建者、维护者和分发者只需将 -DBUILD_TESTING=0 设置为全面禁用所有可能的测试。

Modern cmake,相信目前cmake教程,推荐:

if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR MYPROJECT_BUILD_TESTING) AND BUILD_TESTING)

这只是让您在测试自己的项目时省略设置MYPROJECT_BUILD_TESTING=1

关于套件项目的一些简短研究,我看到VTK_BUILD_TESTINGPARAVIEW_BUILD_TESTINGVTKm_ENABLE_TESTINGSMTK_ENABLE_TESTING,甚至${PROJECT_NAME}_BUILD_TESTING。当启用特定项目的*_BUILD_TESTING 时,有些人似乎将BUILD_TESTING 强制设置为ON

到目前为止,我注意到使用以下选项名称的项目

每个人都来使用他自己的约定,我相信这就是 cmake 被很好地采用的原因 - 它不会“强制”任何特定的事情。我相信大多数开发人员在编写 cmake 脚本时还不知道 BUILD_TESTING 变量,所以他们开始提出自己的约定 - 或者 BUILD_TESTING 是错误的名称,因为它只意味着测试将是 构建,而不是运行。无论如何,由于 BUILD_TESTING 是很久以前的 cmake,我建议将项目特定标志命名为 *_BUILD_TESTING

【讨论】:

  • t makes no sense to set it manually 我指出写 cmake 的人确实在他们的脚本中手动设置了它。 BUILD_TESTING 预计由用户在配置项目时设置。 let alone push and pop 如果您有一个执行 add_testadd_subdirectory 子库,并且您不希望在测试项目时运行这些子库测试,您可以推送/弹出 BUILD_TESTING 以禁用子库库测试,同时将值保留在库中。就是这个想法,在没有提供*_BUILD_TESTING 库特定变量时使用。
  • you should pay attention... 当然!有什么具体的部分吗?好吧,我重新阅读了它,它谈到了子项目并且不想运行子项目测试,因此建议使用库特定的*_BUILD_TESTING 变量来启用/禁用项目特定的测试。它还说:set a BUILD_TESTING option so users can turn testing on and off - 用户可以设置BUILD_TESTING 来启用/禁用测试。
猜你喜欢
  • 2013-01-04
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多