需要帮助谷歌测试一个独特的Id生成器

时间:2015-05-11 08:47:05

标签: c++ googletest

我有一个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测试是否背靠背地运行其中两项测试?

2 个答案:

答案 0 :(得分:5)

良好测试的一个特点是可重复性而不依赖于测试订单的执行。

你有一个单身人士,你以一种糟糕的方式使用它。如果我们假设没有内存问题,那么最有可能发生的是Foo类型的对象是在某处创建的,并且您的测试将以不同的顺序执行以进行调试和正常运行。这可以解释不同的结果。

如何解决?最简单的方法是添加一个方法来重置计数器,并在setUp()中调用它。要正确修复它,您需要考虑如何删除该单例。

答案 1 :(得分:3)

BЈовић's answer会帮助你。可能在测试代码中的其他地方创建了另一个Foo实例,它增加了静态成员的值。

如果不适用添加公开重置方法(即您不想将特定于测试的代码添加到API),这可能是一个不那么糟糕的解决方案,可能很有用:

  1. 模拟课程。添加一个来自Foo的类。将静态变量的访问级别从private更改为protected,并将新的reset方法添加到受保护的类。然后,您可以重构测试代码以运行派生类。
  2. 让FooTester成为Foo的朋友。通过班级朋友发送,您可以让测试代码更多地操纵被测试的类。
  3. 我建议使用模拟路线。保持原始类清除任何测试特定的黑客,并允许您更多地了解其界面中的任何曝光。