说,我有以下测试:
[Test]
public void MyTest( [RandomNumbers( Count=100, Minimum=0, Maximum=1000 )] int number )
{
...
}
在某些时候,在我的常规构建过程中,它失败了。我收到了一封电子邮件通知并开始调查。
现在,当我在Visual Studio中打开测试并单击“运行测试”时,它会通过。我再做一次,然后再次通过。然后再次。然后再次。显然,失败与特定的随机数序列有关。
所以问题是:如何按照确切的顺序重新运行此测试?
(如果我有完整的Gallio报告)
的更新:
(关于这是一个坏主意的评论)
首先,我实际上并不是在问这是不是一个好主意。问题不同。
第二,当被测系统足够复杂,并且输入数据空间具有多个独立维度时,将该空间正确地划分为等效区域对于心理努力和时间都是一个重大挑战,这是不值得的,只要系统的较小组件已经自行测试。与此同时,如果我可以在这里和那里捅系统,为什么不这样做?
第三,我实际上不是这方面的新手。我总是将这种技术与其他测试框架(例如csUnit和NUnit)一起使用,并且它在捕获细微错误方面非常成功。当时,没有生成数据这样的概念,所以我们使用自己的自定义拐杖,以System.Random
的形式使用预定的种子。该种子是作为夹具初始化的一部分生成的(通常基于当前时间)并仔细写入日志。这样,当测试失败时,我可以从日志中获取种子,将其插入测试夹具,并获得完全相同的测试数据集,因此完全相同的调试失败。
第四,如果这是一个坏主意,为什么RandomNumbers
工厂首先存在?
答案 0 :(得分:1)
Gallio/MbUnit目前没有内置方式可以再次生成相同的随机数序列。但我认为这可能是一个有用的功能,我确实为该请求打开了issue。 我准备好时更新主题答案。
我建议如下:
Seed
属性展示给[RandomNumbers]
和[RandomStrings]
属性,也展示给流畅的数据生成器。因此,您可以通过向生成器提供相同的种子编号来轻松地重新生成完全相同的值序列。
更新:此功能现已在Gallio v3.3.8及更高版本中提供。
现在我们都同意彼得所说的话。使用随机数作为单元测试的输入很少一个好主意。其必然结果是有时方便且最适合。这正是我们决定在MbUnit中实现该功能的原因。恕我直言,一个可以很好地适应随机测试输入的常见场景是stochastic analysis on hash code computations。