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 给了我以下信息,这些信息直接相关,应该对你有很大帮助。
即,您应该在每次测试 运行 时设置对象,在静态方法中,您通常需要一个 reset()
或者类似地记住在每个 运行。无需创建新实例。
类似于 jUnit 的设置和拆卸。
编辑:我刚刚意识到您要求的可能与我正在讨论的不同。 static unsigned int i = 0;
不应该每个 运行 设置为 0
吗?我不确定这是否是 googletest
的故意行为。
无法在声明的函数范围之外重置静态局部变量。
我会尝试在没有静态本地的情况下实现您的 MyClass::createDirectory
函数,即使它需要重新定义函数的签名甚至整个 class' 接口。
虽然当前接受的答案是有效的,但也可以在不重构以删除静态变量的情况下验证 createDirectory()
方法的行为。由于 createDirectory()
return 是一个字符串,因此使用正则表达式来验证函数编辑的目录名称 return 是相当简单的。例如,如果目标是验证 createDirectory()
return 目录名称的后续调用具有顺序递增的序列号,您可以编写一个调用 createDirectory()
两次的测试。在这两种情况下,您都将使用正则表达式捕获序列号,并比较它们以确保第二次调用产生的序列号大于第一次调用。这样,您就可以在不依赖特定值的情况下测试功能。
如果您还没有,请查看 googlemock 的正则表达式匹配器和 ASSERT_THAT()
宏。两者在这些情况下都非常有用。
我有一个方法包含一个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 给了我以下信息,这些信息直接相关,应该对你有很大帮助。
即,您应该在每次测试 运行 时设置对象,在静态方法中,您通常需要一个 reset()
或者类似地记住在每个 运行。无需创建新实例。
类似于 jUnit 的设置和拆卸。
编辑:我刚刚意识到您要求的可能与我正在讨论的不同。 static unsigned int i = 0;
不应该每个 运行 设置为 0
吗?我不确定这是否是 googletest
的故意行为。
无法在声明的函数范围之外重置静态局部变量。
我会尝试在没有静态本地的情况下实现您的 MyClass::createDirectory
函数,即使它需要重新定义函数的签名甚至整个 class' 接口。
虽然当前接受的答案是有效的,但也可以在不重构以删除静态变量的情况下验证 createDirectory()
方法的行为。由于 createDirectory()
return 是一个字符串,因此使用正则表达式来验证函数编辑的目录名称 return 是相当简单的。例如,如果目标是验证 createDirectory()
return 目录名称的后续调用具有顺序递增的序列号,您可以编写一个调用 createDirectory()
两次的测试。在这两种情况下,您都将使用正则表达式捕获序列号,并比较它们以确保第二次调用产生的序列号大于第一次调用。这样,您就可以在不依赖特定值的情况下测试功能。
如果您还没有,请查看 googlemock 的正则表达式匹配器和 ASSERT_THAT()
宏。两者在这些情况下都非常有用。