CTest:如何全局设置WORKING_DIRECTORY?

CTest: How to set WORKING_DIRECTORY globally?

最近,我一直在用 CTest 构建一个简单的测试套件。在最简单的形式中,它看起来像这样:

cmake_minimum_required(VERSION 3.7)
project(testsuite)
enable_testing()

add_test(NAME test_0
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  COMMAND script.sh arg-0)

add_test(NAME test_1
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  COMMAND script.sh arg-1)

add_test(NAME test_2
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  COMMAND script.sh arg-2)

然而,随着它的增长,我很快就厌倦了每次测试都必须重复 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}

问题:有没有办法全局设置WORKING_DIRECTORY(或者,更好的是,在每个测试子目录中本地设置)?像

cmake_minimum_required(VERSION 3.7)
project(testsuite)
enable_testing()

set(DEFAULT_WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})

add_test(NAME test_0
  COMMAND script.sh arg-0)

add_test(NAME test_1
  COMMAND script.sh arg-1)

add_test(NAME test_2
  COMMAND script.sh arg-2)

到目前为止最接近解决方案的是我亲爱的同事的建议,即定义一个测试生成函数:

cmake_minimum_required(VERSION 3.7)
project(testsuite)
enable_testing()

function(add_my_test TEST_NAME TEST_COMMAND TEST_ARGUMENTS)
  add_test(NAME ${TEST_NAME}
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMAND ${TEST_COMMAND} ${TEST_ARGUMENTS})
endfunction()

add_my_test(test_0 script.sh arg-0)
add_my_test(test_1 script.sh arg-1)
add_my_test(test_2 script.sh arg-2)

这很好用,但感觉没必要level of indirection

最后,我选择了使用fixture将必要的部分复制到构建文件夹中,在那里测试并再次清理;这可能是一个更干净、更惯用的解决方案。尽管如此,出于好奇,我仍然对原始问题的解决方案感兴趣。

Is there a way to set WORKING_DIRECTORY globally

没有。 add_test 的默认 WORKING_DIRECTORY 在文档中指定。

This works fine

做吧。我会这样做:

macro(add_my_test)
  add_test(
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    ${ARGV}
  )
endmacro()

add_my_test(
  NAME test_1
  COMMAND script.sh arg-1
)

您也可以推出自己的功能 ,但我相信只有一个包装函数就很棒而且很干净。