使用伪随机数生成器(PRNG)测试多个输入

时间:2018-01-05 23:41:58

标签: c# unit-testing testing

问题背景

我已经针对特定问题提供了O(nlog(n))解决方案,我将其用作检查程序来测试新的更快解决方案(O(n))。两种方法都具有相同的签名:它们接收一个数组作为参数并返回long值。因此,我使用常规 PRNG 生成多个数组输入,并运行检查两种解决方案的N实验。我总是在开头使用相同的种子值来从 PRNG 获得相同的数字流。

我在一个测试方法中实现了所有这些方法(据我所知)超出了它被认为是单元测试的范围。事实上,我在 Beautiful Code 一书中看到了类似的实现,但我没有找到关于下面这个问题的一些解释。我得到的距离越近this question

问题

我应该为每个失败的实验创建一个单元测试吗?我应该设置其他自动执行的操作吗?在这种情况下我该怎么办?

我的代码说明

代码实际上非常简单,因为解决问题的方法与问题的目的无关。无论如何,主要部分包含在while循环中,基本上生成输入数组,调用慢速解决方案,调用快速解决方案并检查两个结果是否相等。

        public static int MySeed = 1000000007;
        public static Random random;

        [TestMethod()]
        public void TestSeveralInputSizes()
        {
            random = new Random(MySeed);
            int numberOfExperiments = (int)1e4;
            int maxArraySize = (int)1e2;
            while (numberOfExperiments-- > 0)
            {
                var array = GenerateRandomArray(random.Next(maxArraySize));
                long expectedAnswer = SlowSolution(array);//O(nlog(n))
                long myAnswer = FastSolution(array);//O(n)
                Assert.AreEqual(expectedAnswer, myAnswer);
            }
        }

        public long[] GenerateRandomArray(int maxArraySize)
        {
            //code to generate the array
        }

1 个答案:

答案 0 :(得分:4)

听起来您所提供的代码正在进行与单元测试不同类型的测试。这是FastSolution的验收测试,用于发现潜在的失败测试用例。你正在使用的方法看起来非常合理。

然后,可以使用此验收测试中检测到的故障来创建位于代码中其他位置的单个单元测试用例。将这些测试用例写入失败状态将是处理错误修复的一个很好的起点。在修复之后,每个单元测试用例将在未来的迭代中继续使用,并且可以很好地防范回归错误。

将不同测试类型混合用于不同目的是完全合理的。