关于cmake:CTest在子目录中添加测试

CTest add tests in subdirectories

我有一个基于CMake的项目,该项目包含几个子组件,所有这些子组件都可以独立编译和测试。目录布局如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.
├── 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文件中,我

1
2
3
if(BUILD_TESTING)
  add_subdirectory(tests)
endif()

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

1
No tests were found!!!

玩了一点之后,结果发现,如果我将add_subdirectory(tests)调用移至根CMakeLists.txt,如下所示:

1
2
3
if(BUILD_TESTING)
  add_subdirectory(comp1/tests)
endif()

有用。但是我发现将组件特定的内容放到根文件中非常丑陋和混乱。

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

1
2
3
*********************************
No test configuration file found!
*********************************

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


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程序运行时将查找的文件。