cmake - 如何强制 ctest 只在某些子目录中运行单元测试?

标签 cmake cxxtest

我的 cmake 项目具有以下树结构:

├── CMakeLists.txt
├── basis
├── build
├── deps
├── study

其中 /deps 包含所有第 3 方依赖项,/basis/study 目录包含我编写的例程。

在我的主 CMakeLists.txt 文件中,我有以下代码来启用 CxxTest

cmake_minimum_required(VERSION 3.14)
project(study_cmake)

set( CMAKE_BUILD_TYPE "Debug"  )
add_subdirectory(deps/eigen)

set(CMAKE_PREFIX_PATH ${CMAKE_SOURCE_DIR}/deps/cxxtest/)
find_package(CxxTest REQUIRED)
if(CXXTEST_FOUND)
    include_directories(${CXXTEST_INCLUDE_DIR})
    message( 'CXXTEST_INCLUDE_DIR:' ${CXXTEST_INCLUDE_DIR} )
    enable_testing()
endif()

add_subdirectory(study) 
add_subdirectory(basis) 

/basis/CMakeLists.txt中,我有

project(basis)
add_library(
    basis
    include/bernstein.h
    src/bernstein.cpp
)

CXXTEST_ADD_TEST(test_bernstein test_bernstein.cc ${CMAKE_CURRENT_SOURCE_DIR}/test/test_bernstein.h

/study/CMakeLists.txt 中,我有与 /basis/CMakeLists.txt 中类似的内容。在 build 目录中运行 cmake ..make 之后,我可以在 build/中运行 ctest basis/, build/study/分别运行这两个子目录下定义的单元测试。但是我想有一种方法来运行这两个子目录中定义的所有单元测试,所以我尝试在 /build/ 中运行 ctest。不幸的是,此命令似乎还运行在 /deps/ 中的 3d 方依赖项中定义的所有单元测试。我们如何才能强制 ctest 只运行定义在 build/basis/build/study/ 中的所有单元测试?

最佳答案

我首先要尝试的是 ctest 的正则表达式选择器。来自 ctest --help

  -L <regex>, --label-regex <regex>
                               = Run tests with labels matching regular
                                 expression.
  -R <regex>, --tests-regex <regex>
                               = Run tests matching regular expression.
  -E <regex>, --exclude-regex <regex>
                               = Exclude tests matching regular expression.
  -LE <regex>, --label-exclude <regex>
                               = Exclude tests with labels matching regular
                                 expression.

如果您想将一堆测试组合在一起,您可以在它们上设置标签。

CXXTEST_ADD_TEST(test_bernstein test_bernstein.cc ${CMAKE_CURRENT_SOURCE_DIR}/test/test_bernstein.h
CXXTEST_ADD_TEST(test_scarry test_scarry.cc ${CMAKE_CURRENT_SOURCE_DIR}/test/test_scarry.h
CXXTEST_ADD_TEST(test_mayer test_mayer.cc ${CMAKE_CURRENT_SOURCE_DIR}/test/test_mayer.h
CXXTEST_ADD_TEST(test_king test_king.cc ${CMAKE_CURRENT_SOURCE_DIR}/test/test_king.h

set_tests_properties(test_bernstein test_scarry test_mayer PROPERTIES LABELS "fun")
set_tests_properties(test_king PROPERTIES LABELS "scary")

请注意,set_tests_properties() 仅定义使用 add_test() 创建的测试的属性(CXXTEST_ADD_TEST 在幕后执行。)然后您可以运行 ctest -L fun 以仅运行“有趣”的测试。

$ ctest -L fun
Test project /home/me/myproject
     Start 1: test_bernstein
 1/3 Test #1: test_bernstein ..............   Passed    2.19 sec
     Start 2: test_scarry
 2/3 Test #2: test_scarry .................   Passed    2.19 sec
     Start 3: test_mayer
 3/3 Test #3: test_mayer ..................   Passed    2.19 sec
100% tests passed out of 23

Total Test time (real) =  6.57 sec

$

关于cmake - 如何强制 ctest 只在某些子目录中运行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67865677/

相关文章:

c++ - 使用 cxxtest 框架和 valgrind 测试 qt 对象

windows - OpenCV 使用 CMake 在 Windows 上安装 opencv_contrib 模块

c++ - cmake编译组

c++ - 如何在 CMake 中设置编译标志?

c++ - 如何使用 CMake 组织我的文件?

c++ - 如何使用 CMake 链接到非标准位置的库?

c++ - BOOST_FOREACH 和 cxxtest 插件的转换问题

c++ - MinGW/CxxTest 奇怪的错误

c++ - 在 CMake 中链接 CxxTest,它说它成功但无法构建