我有一个C ++类,它以下列方式生成唯一ID。
class Foo
{
static int seed;
public:
const int Uid;
Foo() : Uid(seed++) {}
}
int Foo::seed = 0;
现在我正在使用Google Test测试此Id生成器:
Foo foo;
EXPECT_EQ(0, foo.Uid);
Foo foo2;
EXPECT_EQ(1, foo2.Uid);
此测试在我调试时通过但在我实际运行时失败,而是给我ID为2和3。有人可以帮我找出原因吗? Google测试是否背靠背地运行其中两项测试?
答案 0 :(得分:5)
良好测试的一个特点是可重复性而不依赖于测试订单的执行。
你有一个单身人士,你以一种糟糕的方式使用它。如果我们假设没有内存问题,那么最有可能发生的是Foo
类型的对象是在某处创建的,并且您的测试将以不同的顺序执行以进行调试和正常运行。这可以解释不同的结果。
如何解决?最简单的方法是添加一个方法来重置计数器,并在setUp()
中调用它。要正确修复它,您需要考虑如何删除该单例。
答案 1 :(得分:3)
BЈовић's answer会帮助你。可能在测试代码中的其他地方创建了另一个Foo实例,它增加了静态成员的值。
如果不适用添加公开重置方法(即您不想将特定于测试的代码添加到API),这可能是一个不那么糟糕的解决方案,可能很有用:
我建议使用模拟路线。保持原始类清除任何测试特定的黑客,并允许您更多地了解其界面中的任何曝光。