代码之家  ›  专栏  ›  技术社区  ›  Fyodor Soikin

如何在MBUnit中用相同的数据重新运行相同的测试

  •  3
  • Fyodor Soikin  · 技术社区  · 14 年前

    我有以下测试:

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

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

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

    所以问题是: 我如何用这个确切的序列重新运行这个测试?
    (如果我有完整的加里奥报告)



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

    弗斯特 我不是在问这是否是个好主意。问题是不同的。

    第二 当被测系统足够复杂,且输入数据空间具有多个独立维度时,适当地将该空间划分为相等的区域,在脑力劳动和时间上都是一个重大挑战,如果系统的较小组件已经单独测试过,这是不值得的。同时,如果我可以到处戳系统,为什么不这样做呢?

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

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   Yann Trevin    14 年前

    目前没有内置方式 Gallio/MbUnit 再次生成相同的随机数序列。但我认为这可能是一个有用的特性,我打开了一个 issue 为了那个请求。 准备好后我会更新主题答案。

    我建议如下:

    • 将内部随机生成器的实际种子显示为 注释 在测试报告中。
    • 揭露一 Seed 属性到 [RandomNumbers] [RandomStrings] 属性,以及Fluent数据生成器。

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

    更新 :此功能现在可用于 Gallio v3.3.8 后来。


    现在我们都同意P_ter所说的。使用随机数作为单元测试的输入是 很少地 好主意。其必然结果是 有时 方便且最合适。这正是我们决定在MBUnit中实现这个特性的原因。imho,一个可以很好地适应随机测试输入的常见场景是 stochastic analysis on hash code computations .