3

说,我有以下测试:

    [Test]
    public void MyTest( [RandomNumbers( Count=100, Minimum=0, Maximum=1000 )] int number )
    {
        ...
    }

在某些时候,在我的常规构建过程中,它失败了。我收到一封电子邮件通知并开始调查。

现在,当我在 Visual Studio 中打开测试并单击“运行测试”时,它通过了。我再做一次,它又过去了。然后再次。然后再次。显然,失败与特定的随机数序列有关。

所以问题是:我如何以那个确切的顺序重新运行这个测试?
(如果我有完整的 Gallio 报告)

 
 
更新:(
在评论说这是一个坏主意之后)

首先,我实际上并不是在问这是否是个好主意。问题是不同的。

其次,当被测试的系统足够复杂,并且输入数据空间是多个独立维度时,将空间正确地分解为等价区域在脑力和时间上都存在重大挑战,如果组件更小,这是不值得的的系统已经过自己的测试。同时,如果我可以到处戳系统,为什么不这样做呢?

第三,我其实不是这个领域的新手。我总是将此技术与其他测试框架(例如 csUnit 和 NUnit)一起使用,并且证明它在捕获细微错误方面非常成功。当时还没有生成数据这样的概念,所以我们使用了自己定制的拐杖,形式是System.Random带有预定种子的。该种子是作为夹具初始化的一部分生成的(通常基于当前时间)并仔细写入日志。这样,当测试失败时,我可以从日志中获取种子,将其插入测试夹具中,并获得完全相同的测试数据集,从而调试完全相同的失败。

第四,如果这是一个坏主意,为什么RandomNumbers工厂首先存在?

4

1 回答 1

1

目前在Gallio/MbUnit中没有内置方法可以再次生成相同的随机数序列。但我认为这可能是一个有用的功能,我确实为该请求打开了一个问题。准备好后,我将更新主题答案。

我的建议如下:

  • 将内部随机生成器的实际种子作为注释显示到测试报告中。
  • Seed[RandomNumbers][RandomStrings]属性以及流式数据生成器公开一个属性。

因此,您可以通过为生成器提供相同的种子编号,轻松地重新生成完全相同的值序列。

更新:此功能现在在Gallio v3.3.8及更高版本中可用。


现在我们都同意彼得所说的话。使用随机数作为单元测试的输入很少是一个好主意。推论是它有时很方便,而且大多是合适的。这正是我们决定在 MbUnit 中实现该功能的原因。恕我直言,可以很好地适应随机测试输入的常见场景是哈希码计算的随机分析

于 2010-09-18T11:38:05.593 回答