如何跨多个单元测试使用用户输入变量

How to use a user input variable across multiple unit tests?

本文关键字:用户 输入 变量 何跨多 单元测试      更新时间:2023-10-16

我有一个c++ 11项目,其中有许多googletest单元测试看起来像

TEST_F(GTest, testSomething) {
    int64_t n = 42;
    // following code depends on input size n
    ...
}

比起在每个测试中使用一个本地常量n,我更希望能够从一个位置设置输入大小,最好是命令行:

./RunMyProgram --gtest_filter=* --n=1000

main应该看起来像:

int main(int argc, char **argv) {
     // TODO: parse command line argument n here
    INFO("=== starting unit tests ===");
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

我应该用什么来代替?在我的测试函数?

TEST_F(GTest, testSomething) {
    int64_t n = ?;
    // following code depends on input size n
    ...
}

首先,如果您在多个测试函数中使用相同的值/参数,请考虑使用fixture。

你想为我做的看起来像一个"值参数化测试"。我想这在测试界是很常见的,而且,谷歌测试在其高级指南中有一章叫做"值参数化测试"(哦,它使用了fixture)。

如果您正在使用gtest,您也可以查看gflags。然后在main.cpp中,您可以定义命令行参数:

DEFINE_int64(n, 0, "some input arg");

然后在你的测试代码中你可以声明它:

DECLARE_int64(n);

在您的测试中,您可以这样使用它:

int64_t n = FLAGS_n;

当然,如果你想手动解析标志,那么你可以自己在main.cpp中定义它:

int64_t FLAGS_n;

然后在你的测试文件中声明它:

extern int64_t FLAGS_n;

你不能这样做,你需要自己解析命令行参数(除了InitGoogleTest),并使用全局变量提供你的值。