为c ++项目的单元测试访问外部测试文件的正确方法是什么?我正在使用CMake和Gtest。
这是目录结构的示例。
Project
-src
-test (unit tests here)
-test-data (data file here)
谢谢!
答案 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)
在我看来,这是较不那么侵入和更简单的方法。