如何让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
相关产品推荐
相关产品推荐

