在单元测试中使用随机数与硬编码值

当我编写测试时,我喜欢使用随机数来计算。


例如


 func init() {

   rand.Seed(time.Now().UnixNano())

 }


  func TestXYZ(t *testing.T) {

     amount := rand.Intn(100)

     cnt := 1 + rand.Intn(10)

     for i := 0; i < cnt; i++ {

       doSmth(amount)

     }

     //more stuff

  }

这当然有一个缺点

expected := calcExpected(amount, cnt)

因为测试的预期值需要根据随机值计算。

如果这种方法受到批评:

  • 它使测试变得不必要的复杂

  • 由于随机性,可重复性较差

我认为虽然没有随机性,我实际上可以:

  • 弥补我的结果,例如测试仅适用于特定值。随机性证明我的测试是“稳健的”

  • 捕获更多边缘情况(有争议,因为边缘情况通常是特定的,例如 0,1,-1)

使用随机数真的那么糟糕吗?

(我意识到这是一个意见问题,但我对人们的观点非常感兴趣,不介意投反对票)。


烙印99
浏览 105回答 1
1回答

精慕HU

您的问题不是特定于 Go 的。这适用于任何语言和任何类型的单元测试。测试的预期值需要根据随机值计算。这是主要问题。如果您的应用程序逻辑稍微复杂,那么当应用程序中的逻辑发生变化时,您也必须在测试中更改相同的逻辑。您必须实施这些更改两次。想必每一个都同样复杂,并且每一个的实现都有些不同,因为如果您只是在测试中复制粘贴或重用应用程序中的代码来计算预期值,那么他们就会同意并且测试毫无意义。在单元测试中使用固定值进行测试可以使测试变得简单并练习代码。使用随机值进行测试,称为模糊测试。我不是测试模糊方面的专家。使用随机值进行测试是模糊测试的一方面,但细微差别在于测试随机值,这些随机值可能会发现边缘情况、捕获错误、执行未使用的代码分支或发现泄漏。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go