Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在MbUnit中使用相同的数据重新运行相同的测试_C#_Unit Testing_Mbunit_Gallio - Fatal编程技术网

C# 如何在MbUnit中使用相同的数据重新运行相同的测试

C# 如何在MbUnit中使用相同的数据重新运行相同的测试,c#,unit-testing,mbunit,gallio,C#,Unit Testing,Mbunit,Gallio,比如说,我有以下测试: [Test] public void MyTest( [RandomNumbers( Count=100, Minimum=0, Maximum=1000 )] int number ) { ... } 在我的常规构建过程中,它在某个时候失败了。我收到一封电子邮件通知,开始调查 现在,当我在VisualStudio中打开测试并单击“运行测试”时,它通过了。我再做一次,它又通过了。一次又一次。一次又一次。显然,失败与特定的随

比如说,我有以下测试:

    [Test]
    public void MyTest( [RandomNumbers( Count=100, Minimum=0, Maximum=1000 )] int number )
    {
        ...
    }
在我的常规构建过程中,它在某个时候失败了。我收到一封电子邮件通知,开始调查

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

因此,问题是:我如何以准确的顺序重新运行此测试?
(前提是我有完整的Gallio报告)



更新
(以下是关于这是一个坏主意的评论)

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

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

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


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

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

我的建议如下:

  • 将内部随机生成器的实际种子显示为测试报告中的注释
  • [RandomNumbers]
    [RandomStrings]
    属性以及fluent数据生成器公开
    种子
    属性
因此,通过向生成器提供相同的种子编号,可以轻松地重新生成完全相同的值序列

更新:此功能现在在和更高版本中可用



现在我们都同意佩特所说的。使用随机数作为单元测试的输入很少是个好主意。由此推论,它有时是方便的,而且最合适。这正是我们决定在MbUnit中实现该功能的原因。IMHO,一个很适合随机测试输入的常见场景是。

这就是为什么在单元测试中使用随机输入不是一个好主意:-)@péter:我已经更新了这个问题来回答你的评论。@Fyodor,看看笑脸吧-你不应该把我当回事:-)你是第一个,我不是在回答,只是在评论。我应该学会从不说“从不”,所以我很高兴将我的上述说法改为“在单元测试中使用随机输入很少是个好主意”。@Péter:哦,好吧,whatchagonnado。。。我真的很喜欢这种技术,如果没有办法重现这个序列,那将是令人失望的。事实上,为什么他们会有这个工厂?我觉得这是个很好的问题。我不知道是否可以复制整个序列,但失败的值是否足以进行复制?例如,如果一个具有可参数化int的测试以随机序列输入,并且该测试以值55失败,则您可以在下一个测试中插入值55。除非测试对象是有状态的,否则你需要整个序列…谢谢你,Yann。在我看来,你提出的解决办法似乎很好。虽然我个人并不同意佩特的观点,但我必须指出,这个想法到底是好是坏并不重要。您必须同意,无论是哪一个可测试的主题,随机生成输入都毫无意义,除非您能够精确地复制它以进行调试。另外:您能否分享您的想法,无论多么粗略,这可能需要实现的时间框架?