【问题标题】:Is it good to create random tests? [duplicate]创建随机测试好不好? [复制]
【发布时间】:2016-03-13 08:18:16
【问题描述】:

比如这样一个测试:

[Test]
public void Test_With_Many_Random_Words()
{
  var randomWords = new string[100];
  for (var i = 0; i < 100; ++i)
    randomWords[i] = GenerateRandomWord();

  var trie = new PrefixTrie();
  for (var i = 0; i < 100; ++i)
    trie.AddWord(randomWords[i]);

  Assert.AreEqual(100, trie.CountOfWords);
  foreach (var word in randomWords)
    Assert.IsTrue(trie.ContainsWord(word));
}

private string GenerateRandomWord()
{
  var random = new Random();
  var builder = new StringBuilder();

  var length = 1 + (random.Next()%100);
  for (var i = 0; i < length; ++i)
  {
    var charCode = random.Next()%26;
    builder.Append((char) ('a' + charCode));
  }
  return builder.ToString();
}

或者用“testword1”、“alsotestword2”、“notword3”等少数已知词创建测试并检查代码是否正确会更好?

【问题讨论】:

  • 你想测试什么?
  • 其实我的问题没关系,但是这一次,我们可以假设我们正在测试一些数据结构(例如,在我的代码中我正在测试前缀trie)。
  • 你不应该依赖随机测试。大多数时候它会错过特殊情况。但是你可以添加它们,总比没有测试好
  • Tim Rogers,是的,我自己没有找到这个话题。谢谢。
  • 测试的许多最佳实践之一是拥有应该产生预期输出的已知输入。重点是已知输入。如果您的输入是随机的,它们是否已知?这似乎违反直觉,不是吗?通过您的具体示例,我可以看到这将如何有意义,但是它会再次使用相同的已知输入测试所需的功能。我相信这个问题对于这个论坛来说实际上有点太模糊了。

标签: c# unit-testing testing


【解决方案1】:

您可以使用生成的测试数据,但我不鼓励您使用随机实时生成的输入,原因之一是:可重复性。

如果你的代码有问题,你的测试可能会突然变红,因为你不小心发现了一个“错误”的参数组合......或者不是。

这样的测试非常不可靠。

【讨论】:

  • 这可以通过使用固定种子生成随机数来缓解,这将导致生成随机但可重复的数字序列
  • 是的,但是创建假随机数据有点矫枉过正,不是吗? :P
  • 在某些情况下,测试数据无关紧要,随机创建可能表明所选值不重要。 AutoFixture 这样做。
猜你喜欢
  • 2018-09-26
  • 1970-01-01
  • 2014-07-25
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多