You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让CMake+GTest单元测试正确定位测试数据文件夹?

解决CMake+GTest单元测试中fopen无法找到测试数据文件的问题

问题核心是测试程序运行时的工作目录和源码目录不匹配:默认情况下,CMake构建的测试程序会在build/tests目录下运行,而你的测试数据存放在源码的tests/data目录,直接写相对路径自然找不到。下面提供三种可行的解决办法:

方法一:指定测试的工作目录

在tests/CMakeLists.txt中配置测试的工作目录为测试源码所在的目录,这样测试程序运行时就会以tests为当前目录,直接用data/dataset1.txt就能访问到文件:

add_executable(myProgramTests myProgramTests.cxx)
target_link_libraries(myProgramTests GTest::gtest_main)

# 配置测试用例的工作目录
add_test(NAME myProgramTest COMMAND myProgramTests)
set_tests_properties(myProgramTest PROPERTIES
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

对应的测试代码修改路径:

TEST(test, read_data_file) {
    std::FILE *f = fopen("data/dataset1.txt", "r");
    if (f == NULL){
        perror ("Error opening file");
    }
    fclose(f);
}

方法二:复制测试数据到构建目录

把tests/data目录复制到测试程序的构建目录,让运行时的相对路径有效:

在tests/CMakeLists.txt中添加复制指令:

# 将data目录完整复制到测试构建目录
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/data DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

构建后,build/tests下会生成data子目录,测试代码同样用data/dataset1.txt即可访问文件。

方法三:通过CMake传递绝对路径宏

直接在CMake中定义数据文件的绝对路径,编译时传递给测试代码,彻底避免路径问题:

在tests/CMakeLists.txt中添加编译定义:

add_executable(myProgramTests myProgramTests.cxx)
target_compile_definitions(myProgramTests PRIVATE
    DATASET1_PATH="${CMAKE_CURRENT_SOURCE_DIR}/data/dataset1.txt"
)
target_link_libraries(myProgramTests GTest::gtest_main)

测试代码中使用该宏:

TEST(test, read_data_file) {
    std::FILE *f = fopen(DATASET1_PATH, "r");
    if (f == NULL){
        perror ("Error opening file");
    }
    fclose(f);
}

这种方法无需关心工作目录,是最稳定的方案,尤其适合单文件或路径固定的测试数据。

内容的提问来源于stack exchange,提问作者pooralaska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:30:52