CTest 在子目录中添加测试

CTest add tests in subdirectories

我有一个基于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()命令。测试已成功编译,我可以手动 运行 它们。但是,如果我调用 ctest,它会 returns

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 吗?

CTest 文档不是最清楚的。

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

CMake 文档说在顶层 CMakeLists.txt 文件中调用 "enable_testing()",它进一步说这个命令将 "enable CTest at the current directory and below." 这听起来是递归的,对吧?嗯,不是。

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

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

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