【发布时间】: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