在C++项目的单元测试中,访问外部测试文件的正确方法是什么?我使用的是CMake和Gtest。这是目录结构的示例。
Project -src -test (unit tests here) -test-data (data file here)
谢谢!
dtcbnfnu1#
我更喜欢查找相对于可执行测试的测试数据,为此,我通常在某个TestHelpers.h中定义一个helper方法,然后传递要解析的文件的相对路径。
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!"); }
要使用它,我会说:
std::string foofullPath = resolvePath("test/data/foo.txt");
并且只要我的执行目录是从项目根目录的后代上运行的,这就为我提供了测试文件的完整路径。
30byixjq2#
在CMakefile中,添加测试并设置一些环境变量,其中包含数据的路径。
add_test(mytests ${PROJECT_BINARY_DIR}/unittests) set_tests_properties(mytests PROPERTIES ENVIRONMENT DATADIR=${CMAKE_CURRENT_SOURCE_DIR}/tests/testvectors)
您可以稍后在任何测试中从环境中检索DATADIR。另一个选择是定义不同的工作目录
DATADIR
set_tests_properties(mytests PROPERTIES WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests)
在我看来,这是一种干扰较小、简单的方法。
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();
vatpfxk54#
您可以使用CMAKE_SOURCE_DIR(给出顶层cmake目录的绝对路径)变量来定义路径并将其传递给测试脚本。
CMAKE_SOURCE_DIR
hiz5n14c5#
只需在add_test函数中指定一个WORKING_DIRECTORY,测试用例中的任何路径规范都将相对于指定的WORKING_DIRECTORY。例如:在根目录CMakeLists.txt中
add_test
WORKING_DIRECTORY
# ... 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"这样的路径
"../test-data/expected_values.csv"
5条答案
按热度按时间dtcbnfnu1#
我更喜欢查找相对于可执行测试的测试数据,为此,我通常在某个
TestHelpers.h
中定义一个helper方法,然后传递要解析的文件的相对路径。要使用它,我会说:
并且只要我的执行目录是从项目根目录的后代上运行的,这就为我提供了测试文件的完整路径。
30byixjq2#
在CMakefile中,添加测试并设置一些环境变量,其中包含数据的路径。
您可以稍后在任何测试中从环境中检索
DATADIR
。另一个选择是定义不同的工作目录
在我看来,这是一种干扰较小、简单的方法。
hmmo2u0o3#
将文件名传递给gtest参数:
获取gtest解析输入后的参数:
并将其保存到某个全局 *:
相关
vatpfxk54#
您可以使用
CMAKE_SOURCE_DIR
(给出顶层cmake目录的绝对路径)变量来定义路径并将其传递给测试脚本。hiz5n14c5#
只需在
add_test
函数中指定一个WORKING_DIRECTORY
,测试用例中的任何路径规范都将相对于指定的WORKING_DIRECTORY
。例如:在根目录CMakeLists.txt中
然后在google测试中使用
"../test-data/expected_values.csv"
这样的路径