CTest 在子目录中添加测试

Geo*_* P. 4 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
Run Code Online (Sandbox Code Playgroud)

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

if(BUILD_TESTING)
  add_subdirectory(tests)
endif()
Run Code Online (Sandbox Code Playgroud)

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

No tests were found!!!
Run Code Online (Sandbox Code Playgroud)

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

if(BUILD_TESTING)
  add_subdirectory(comp1/tests)
endif()
Run Code Online (Sandbox Code Playgroud)

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

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

*********************************
No test configuration file found!
*********************************
Run Code Online (Sandbox Code Playgroud)

有没有办法将 ctest 与上面的目录结构一起使用?

小智 7

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()”文档指出“此命令应该位于源目录根目录中,因为 ctest 希望在构建目录根目录中找到测试文件。”您只需确保在任何“add_subdirectory”调用之前完成此操作即可。 (4认同)