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

时间:2014-08-08 19:42:11

标签: c++ unit-testing cmake googletest

为c ++项目的单元测试访问外部测试文件的正确方法是什么?我正在使用CMake和Gtest。

这是目录结构的示例。

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

谢谢!

4 个答案:

答案 0 :(得分:5)

我更喜欢找到与我的可执行测试相关的测试数据。为此,我通常在某些var sGroup = jQuery.sap.uid(), oModel = this.getModel(); oModel.setDeferredGroups([sGroup]); oModel.read("/EntitySet", {groupId: sGroup, filters: ...}); oModel.read("/EntitySet", {groupId: sGroup, filters: ...}); oModel.read("/EntitySet", {groupId: sGroup, filters: ...}); oModel.submitChanges({groupId: sGroup}); 中定义一个辅助方法,然后传递我希望解析的文件的相对路径。

TestHelpers.h

要使用它,我去:

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!");
}

只要我的执行目录在项目的根目录的后代运行,它就会给我一个完整的测试文件路径。

答案 1 :(得分:3)

将文件名传递给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();

*通常污染全局命名空间不是一个好主意,但我认为测试应用程序

相关

答案 2 :(得分:1)

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

答案 3 :(得分:1)

在CMake文件中,添加测试并设置一些环境变量以及数据路径。

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)

在我看来,这是较不那么侵入和更简单的方法。