使用 Google 测试来测试文件输出?

Use Google Test to test file output?

我正在从事一个用 C++ 创建模拟器(用于模拟生物系统)的项目。模拟器获取参数的输入文件,然后在模拟的不同时间点生成包含数百个分子计数的输出文件。我正在使用 Google Test 进行所有单元测试。我还想包括一些更高级别的测试,我在其中提供具有各种模型参数的输入文件,然后检查输出文件是否与某个参考文件匹配。有人建议使用 bash-tap 进行这些更高级别的测试,但如果可能的话,我更愿意坚持使用 Google 测试。是否可以使用 Google 测试来进行我在此处描述的更高级别的测试?

我们编写CAE软件(模拟器)并使用Google测试。我们面临类似的问题,希望您能找到实用的答案。

您可以编写更高级别的测试,但您通常需要做的不仅仅是 "EXPECT_EQ()" 来检查 pass/fail。例如,如果您必须测试两个任意图的连通性,如果允许算法改变节点的顺序,则可能会很困难。或者,如果您正在比较矩阵,有时您会遇到可以毫无问题地切换矩阵行和列的情况。也许舍入误差是可以的。准备好处理这些类型的问题,因为与单元测试相比,它们在完整模拟器中的问题要严重得多。

一个更实际的问题是当您的组织说 "run all tests before you check in." 或者,也许他们 运行 每次您点击构建按钮。如果是这种情况,您需要将这些单元测试与更高级别的测试区分开来。我们在 Visual Studio 中使用 Google Test Runner,它期望 运行 文件名为“*Test*”的所有内容。最好给更高级别的测试起个别的名字清楚。

我们还必须将整个可执行文件转换为 DLL,以便它可以在其上进行测试 运行。还有其他方法(如脚本)可以与 Google 测试一起使用,但我们发现可执行文件作为 dll 方法可以工作。我们的 "real" 产品可执行文件只是一个调用 dll 中的 app_main() 的 main() 函数。

还有,使用 Runner 时的最后一个提示:如果您的应用获得 --gtest_list_tests 参数,请不要进行大量昂贵的设置:

// Don't run if we are just listing tests.
if (!::testing::GTEST_FLAG(list_tests))
{
        // Do expensive setup stuff here.
}

int result = RUN_ALL_TESTS();

if (!::testing::GTEST_FLAG(list_tests))
{
        // Do expensive shutdown stuff here.
}