在CMake中将单元测试分组在一起

plupiseo  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(157)

我在CMake中有不同的测试版本,最后一个版本运行所有的测试。最后一个测试UTestAll是否单独构建每个单元测试,如果是,是否意味着同一个测试最终会构建多次?也许有一种方法可以将单元测试分组,使其只构建一次?
或者说,有没有一种方法可以选择从运行中排除一个特定的目标?所以说,在某个时候,我不想在jenkins pipeline上运行UTestAll,而是想在本地运行。

  • #测试1 *
set(THIS UTest1)
string(TOUPPER DO_BUILD_${THIS} THIS_FLAG)

if (${THIS_FLAG})
  add_executable(
          ${THIS}
          src/Test1.cpp
  )

  target_include_directories(${THIS} PRIVATE include)
  target_link_libraries(${THIS} PUBLIC lib1
endif()
  • #测试2 *
set(THIS UTest2)
string(TOUPPER DO_BUILD_${THIS} THIS_FLAG)

if (${THIS_FLAG})
  add_executable(
          ${THIS}
          src/Test2.cpp
  )

  target_include_directories(${THIS} PRIVATE include)
  target_link_libraries(${THIS} PUBLIC lib2
endif()
  • #测试3 *
set(THIS UTest3)
string(TOUPPER DO_BUILD_${THIS} THIS_FLAG)

if (${THIS_FLAG})
  add_executable(
          ${THIS}
          src/Test3.cpp
  )

  target_include_directories(${THIS} PRIVATE include)
  target_link_libraries(${THIS} PUBLIC lib3
endif()
  • #运行所有测试 *
set(THIS UTestAll)
string(TOUPPER DO_BUILD_${THIS} THIS_FLAG)

if (${THIS_FLAG})
  add_executable(
          ${THIS}
          src/Test1.cpp
          src/Test2.cpp
          src/Test3.cpp
  )

  target_include_directories(${THIS} PRIVATE include)
  target_link_libraries(${THIS} PUBLIC lib1 lib2 lib3
endif()
7xllpg7q

7xllpg7q1#

基本上,您可以将每个测试构建为一个对象库,从每个对象库创建一个可执行文件,然后使用所有对象库创建另一个可执行文件,如下所示:

# add object library for each file
add_library(UTest1_obj OBJECT)
target_sources(UTest1_obj PRIVATE src/Test1.cpp)
target_include_directories(UTest1_obj PRIVATE include)
[...]

# add executables linking one object each
add_executable(UTest1)
target_link_libraries(UTest1 PRIVATE UTest1_obj)
[...]

# add an executable with all objects
add_executable(UTestAll)
target_link_libraries(UTestAll PRIVATE UTest1_obj UTest2_obj UTest3_obj)

看一下CMake宏可能是有意义的,所以它不是那么重复。看一下ctest和一些测试框架(GoogleTest,Catch2或类似的东西)也可能是有意义的。

相关问题