CTest在子目录中添加测试

时间:2019-02-06 10:06:04

标签: cmake ctest

我有一个基于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,它将返回

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与上述目录结构一起使用?

1 个答案:

答案 0 :(得分:0)

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