【问题标题】:CTest add tests in subdirectoriesCTest 在子目录中添加测试
【发布时间】:2019-02-06 10:06:04
【问题描述】:

我有一个基于 CMake 的项目,它由几个子组件组成,它们都可以独立编译和测试。目录布局如下:

.
├── CMakeLists.txt
├── comp1
│   ├── CMakeLists.txt
│   ├── src
│   │   ├── foo.cc
│   │   └── foo.h
│   └── tests
│       ├── CMakeLists.txt
│       └── test_comp1.cc
└── comp2
    ├── CMakeLists.txt
    ├── src
    │   ├── bar.cc
    │   └── bar.h
    └── tests
        ├── CMakeLists.txt
        └── test_comp2.cc

我想启用 ctest,因此在根 CMakeLists.txt 中我有 include(CTest),在特定于组件的 CMakeLists.txt 文件中我有

if(BUILD_TESTING)
  add_subdirectory(tests)
endif()

在 compX/tests/CMakeLists.txt 我有编译测试的代码和add_test()command。测试成功编译,我可以手动运行它们。但是,如果我调用ctest,它会返回

No tests were found!!!

玩了一会儿之后,事实证明,如果我像这样将add_subdirectory(tests) 调用移动到根 CMakeLists.txt:

if(BUILD_TESTING)
  add_subdirectory(comp1/tests)
endif()

它有效。但是我觉得这很丑陋和混乱,将特定于组件的东西放入根文件中。

相反,我尝试将include(CTest) 命令下移一级到特定于组件的 CMakeLists.txt。但ctest 抱怨:

*********************************
No test configuration file found!
*********************************

真的没有办法在上面的目录结构中使用 ctest 吗?

【问题讨论】:

  • 可能是comp1/CMakeLists.txt 禁用了BUILD_TESTING 选项,或者替换了add_test 命令。注意,如果你在子目录中调用include(CTest)ctest也应该在子目录中执行;它在顶级目录中不起作用。
  • “替换add_test”是什么意思?
  • 标准 CMake 命令可以替换为用户提供的同名函数或宏。例如。可以定义function(add_test)。在任何地方,我们只能猜测您的tests/CMakeLists.txt 出了什么问题 - 您没有在问题帖子中显示。
  • 您是否尝试使用cmake --build build --target test (UNIX) 运行它们?否则必须从调用enable_testing() 的二进制目录运行ctest(由宏include(CTest) 在内部完成) ) 源:gitlab.kitware.com/cmake/cmake/blob/master/Modules/…

标签: cmake ctest


【解决方案1】:

CTest 文档不是最清晰的。

我正在做的一个项目有一个类似的目录结构,由多个单元组成,每个单元中都有 src 和 tests 子目录。

CMake 文档说在顶级 CMakeLists.txt 文件中调用“enable_testing()”,并且进一步说此命令将“在当前目录及以下目录中启用 CTest”。这听起来是递归的,对吧?好吧,不是。

每个 CMakeLists.txt 都必须调用 enable_testing() 以在该目录中启用自动 CTest 发现。

因此,在您的项目中,顶层 CMakeLists.txt 将需要 enable_testing(),然后 comp{1,2}/CMakeLists.txt 将需要它,最后 comp{1,2}/tests/CMakeLists.txt 将需要它。

添加这些命令并重新运行 cmake 后,这些目录将分别包含一个 CTestTestfile.cmake 文件,这是 ctest 程序在运行时将查找的文件。

【讨论】:

  • 其实是递归的。你只需要确保在add_subdirectory 之前调用enable_testing()enable_testing() 文档指出 This command should be in the source directory root because ctest expects to find a test file in the build directory root. 您只需确保在任何 add_subdirectory 调用之前完成此操作。
猜你喜欢
  • 2020-09-22
  • 2016-05-26
  • 2023-03-20
  • 2011-12-20
  • 2013-10-12
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多