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

时间:2019-06-27 21:05:25

标签: unit-testing go testing random

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

例如

 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)

使用随机数真的不好吗?

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

1 个答案:

答案 0 :(得分:2)

您的问题并非特定于Go。这适用于任何语言以及任何类型的单元测试。

  

需要从随机值中计算出测试的期望值。

那是主要问题。如果在应用程序中更改逻辑时甚至有中等复杂的应用程序逻辑,则还必须在测试中更改相同的逻辑。您必须实施两次更改。

大概每一个都是同样复杂的 每个实现都有些不同,因为如果您只是在测试中从应用中复制粘贴或重用代码来计算期望值,那么它们重新同意,测试毫无意义。

在单元测试中使用固定值进行测试可以简化测试并执行代码。

已完成对随机值的测试,称为fuzzing。我不是测试模糊测试的专家。使用随机值进行测试是模糊测试的一个方面,但是细微差别在于测试可能发现边缘情况,捕获错误,执行未使用的代码分支或发现泄漏的随机值。