CMake如何在单元测试中安装测试文件

15

我正在使用CMake构建我的系统和单元测试。

我也在进行源外构建。

我发现使用ADD_TEST()命令时,你不需要安装测试可执行文件(它将在运行make install时直接运行,这很方便)。

然而,我的单元测试依赖于一些输入文件,这些文件需要复制到可执行文件的构建位置。

据我所知,我不能使用INSTALL()将这些文件复制到那里,因为我没有指定那里是哪里——它取决于调用构建命令的位置。

我是否有办法告诉CMake将我的测试文件复制到构建可执行文件的相同位置?

5个回答

9

您可以使用configure_file和参数COPYONLY。并将其复制到构建目录:${CMAKE_CURRENT_BINARY_DIR}。


8

这个问题很老了,但我认为有一个比复制需要的文件到${CMAKE_CURRENT_BINARY_DIR})更好的解决方案。 add_test 命令有一个 WORKING_DIRECTORY 选项,允许选择运行测试的目录。因此,我建议使用以下解决方案:

add_executable(testA testA.cpp)
add_test(NAME ThisIsTestA COMMAND testA WORKING_DIRECTORY ${DIRECTORY_WITH_TEST_DATA})

这样可以避免不必要的输入文件复制。

2
在防止复制所有测试数据的同时,您承担着测试会改变实际测试数据的风险。 - stackprotector

7
这可能不是最好的解决方案,但目前我正在这样做:
file(COPY my_directory DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

似乎已经取得了不错的效果。

3
功能正常,但复制发生在配置时间。 - fgiraldeau

4
当然,您可以在配置步骤中按照以下方式完成此操作:
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${fileFrom} ${fileTo})

如果您的输入文件依赖于构建产生的某些内容,则可以为其创建一个目标,并将其添加到all目标中:

add_custom_target(copy_my_files ALL
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${fileFrom} ${fileTo}
    DEPENDS ${fileFrom}
)

3
在构建时复制整个目录(仅在构建成功后)可以在添加目标(例如单元测试可执行文件)后执行以下操作:
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
    ${CMAKE_CURRENT_SOURCE_DIR}/testDataDir $<TARGET_FILE_DIR:${PROJECT_NAME}>/testDataDir)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接