Google 测试和静态局部变量

Google Test and static local variable

我有一个方法包含一个static unsigned int,所以它可以return个连续的目录名。类似于:

string MyClass::createDirectory() const
{
    static unsigned int i = 0;
    stringstream ss;
    string directory;
    do
    {
        ++i;
        ss.str("");
        ss << "/" << setfill('0') << setw(6) << i;
        directory = m_rootDirectory + ss.str();

    } while(!m_filesystem->createDirectory((directory)));

    return directory;
}

我知道这是一个非常幼稚的解决方案,但现在已经足够好了。

但是我在编写单元测试时遇到了问题 - 静态变量在测试用例之间递增。

有没有办法重置这样的变量?还是将静态方法变量更改为非静态 class 成员是我唯一的选择?

我正在使用 Google 测试框架。

我还没有使用 googletest 框架(虽然我希望我可以)。

快速 Google 给了我以下信息,这些信息直接相关,应该对你有很大帮助。

If you find yourself writing two or more tests that operate on similar data, you can use a test fixture. It allows you to reuse the same configuration of objects for several different tests.

即,您应该在每次测试 运行 时设置对象,在静态方法中,您通常需要一个 reset() 或者类似地记住在每个 运行。无需创建新实例。

类似于 jUnit 的设置和拆卸。

编辑:我刚刚意识到您要求的可能与我正在讨论的不同。 static unsigned int i = 0; 不应该每个 运行 设置为 0 吗?我不确定这是否是 googletest 的故意行为。

无法在声明的函数范围之外重置静态局部变量。

我会尝试在没有静态本地的情况下实现您的 MyClass::createDirectory 函数,即使它需要重新定义函数的签名甚至整个 class' 接口。

虽然当前接受的答案是有效的,但也可以在不重构以删除静态变量的情况下验证 createDirectory() 方法的行为。由于 createDirectory() return 是一个字符串,因此使用正则表达式来验证函数编辑的目录名称 return 是相当简单的。例如,如果目标是验证 createDirectory() return 目录名称的后续调用具有顺序递增的序列号,您可以编写一个调用 createDirectory() 两次的测试。在这两种情况下,您都将使用正则表达式捕获序列号,并比较它们以确保第二次调用产生的序列号大于第一次调用。这样,您就可以在不依赖特定值的情况下测试功能。

如果您还没有,请查看 googlemock 的正则表达式匹配器和 ASSERT_THAT() 宏。两者在这些情况下都非常有用。