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



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

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

其中/deps包含所有第三方依赖项,/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/basis/中运行ctestbuild/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
$

最新更新