通过相对路径c++ cmake guest查找单元测试的外部测试文件

2eafrhcq  于 2022-12-18  发布在  其他
关注(0)|答案(5)|浏览(133)

在C++项目的单元测试中,访问外部测试文件的正确方法是什么?我使用的是CMake和Gtest。
这是目录结构的示例。

Project
   -src
       -test (unit tests here)
   -test-data (data file here)

谢谢!

dtcbnfnu

dtcbnfnu1#

我更喜欢查找相对于可执行测试的测试数据,为此,我通常在某个TestHelpers.h中定义一个helper方法,然后传递要解析的文件的相对路径。

inline std::string resolvePath(const std::string &relPath)
{
    namespace fs = std::tr2::sys;
    // or namespace fs = boost::filesystem;
    auto baseDir = fs::current_path();
    while (baseDir.has_parent_path())
    {
        auto combinePath = baseDir / relPath;
        if (fs::exists(combinePath))
        {
            return combinePath.string();
        }
        baseDir = baseDir.parent_path();
    }
    throw std::runtime_error("File not found!");
}

要使用它,我会说:

std::string foofullPath = resolvePath("test/data/foo.txt");

并且只要我的执行目录是从项目根目录的后代上运行的,这就为我提供了测试文件的完整路径。

30byixjq

30byixjq2#

在CMakefile中,添加测试并设置一些环境变量,其中包含数据的路径。

add_test(mytests ${PROJECT_BINARY_DIR}/unittests)
set_tests_properties(mytests PROPERTIES 
                     ENVIRONMENT
                     DATADIR=${CMAKE_CURRENT_SOURCE_DIR}/tests/testvectors)

您可以稍后在任何测试中从环境中检索DATADIR
另一个选择是定义不同的工作目录

set_tests_properties(mytests PROPERTIES
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests)

在我看来,这是一种干扰较小、简单的方法。

hmmo2u0o

hmmo2u0o3#

将文件名传递给gtest参数:

add_executable(foo ...)
enable_testing()
add_test(FooTest foo "${CMAKE_CURRENT_LIST_DIR}/data/input.file")

获取gtest解析输入后的参数:

int main(int argc, char** argv) {
  ::testing::InitGoogleTest(&argc, argv);
  assert(argc == 2); // gtest leaved unparsed arguments for you

并将其保存到某个全局 *:

file_name = argv[1];
  return RUN_ALL_TESTS();
  • 通常,污染全局命名空间不是一个好主意,但我认为这对于测试应用程序是很好的

相关

vatpfxk5

vatpfxk54#

您可以使用CMAKE_SOURCE_DIR(给出顶层cmake目录的绝对路径)变量来定义路径并将其传递给测试脚本。

hiz5n14c

hiz5n14c5#

只需在add_test函数中指定一个WORKING_DIRECTORY,测试用例中的任何路径规范都将相对于指定的WORKING_DIRECTORY
例如:在根目录CMakeLists.txt中

# ...
add_executable(<name of your test executable> src/test/test.cpp)

# ...

add_test(NAME <arbitrary name> COMMAND <name of your test executable> WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/src/test/")

然后在google测试中使用"../test-data/expected_values.csv"这样的路径

相关问题