【问题标题】:Testing Several Inputs with a Pseudo Random Number Generator (PRNG)使用伪随机数生成器 (PRNG) 测试多个输入
【发布时间】:2018-06-15 19:25:54
【问题描述】:

问题背景

我已经有一个给定问题的O(nlog(n)) 解决方案,我用它作为检查器来测试一个新的更快的解决方案(O(n))。这两种方法具有相同的签名:它们接收一个数组作为参数并返回一个long 值。因此,我使用常规 PRNG 生成多个数组输入并运行 N 实验来检查这两种解决方案。我总是在开始时使用相同的 Seed 值来从 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
        }

【问题讨论】:

  • 我可能有误会,但这听起来并不是真正的单元测试,即验证一个单元的功能,而是某种验收测试来验证两种解决方案是否等效。我认为您担心的是您在测试中有多个断言,这在单元测试的世界中是不鼓励的,但是使用非单元测试以这种方式测试事物是完全合理的(以及一个断言事情无论如何,单元测试更像是一个经验法则)。
  • 我假设慢速解决方案是正确的,这是非常简单的工作。在那种情况下,我相信不同的结果意味着快速解决方案中的错误。所以,我的问题更多是关于当我发现错误时该怎么做。
  • 我明白了,谢谢你的澄清。

标签: c# unit-testing testing


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 2011-07-02
    • 2016-05-24
    • 2011-09-22
    • 2013-09-15
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多