scala - 哪一个更好?通过数据测试还是通过算法测试?

标签 scala unit-testing testing

我们正在开发 Play/Scala 应用程序并使用 Specs2 进行测试。我们的大部分测试都是针对 Controller 的。

我们为数据库的每个实体创建了一个数据样本生成器,并使用它们生成测试数据。这些样本生成器尝试生成各种数据场景案例。

对于每个测试,我们:

  • 使用示例数据生成器插入数据
  • 调用被测 Controller Action
  • 计算出正确答案
  • 断言返回结果是否等于计算结果。

为了确保我们不会在测试和主代码中重复一个错误,我们总是以不同的方式实现测试计算。

例如,如果被测系统内部有数据库查询,我们会获取所有数据并在内存中计算结果以进行相应的测试。

我认为我们的方法有点像 property-based testing .示例:

"a * a returns the correct value" >> {
  forAll { (a: Int, b: Int) =>
    a * b === (1 to b).fold(0) { (acc, b) => acc + a }
  }
}

另一种方法是为特定情况生成特定数据,并期望基于生成的数据获得固定结果,这可能是手动计算的(而不是代码)。像这样:

"2 * 2 == 4" >> {
  2 * 2 === 4
}

"3 * 5 == 15" >> {
  3 * 5 === 15
}

// etc.

NOTE: Our system is much more complicated than this simple scenario

我们方法的问题在于,当我们的测试失败时,很难找出是测试还是主代码导致了失败!

另一方面,我们必须编写更多的测试来覆盖另一种方法的所有数据场景,而且很难做到 DRY。正如您在上面的测试示例中所看到的。

简而言之,我们有两种选择(我们知道):

  • 智能且复杂但测试次数较少
  • 愚蠢和简单但更多的测试

推荐将哪一个用于实际应用?为什么?

最佳答案

通过基于属性的测试,您希望从不同的角度测试系统,而不是通过不同的测试方式实现相同的功能。您可能希望测试不变量之类的东西,例如,如果您将 2 个正数相乘,结果应该是正数。

虽然我相信良好的基于​​属性的测试具有巨大的值(value),但也很难提出这样的测试。所以,除非你认为你非常了解你的域并且它足够稳定,否则我会从基于示例的测试开始。它们更易于编写和理解,这是您创建新事物时最重要的事情。

关于scala - 哪一个更好?通过数据测试还是通过算法测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33729756/

相关文章:

postgresql - 将 Scala Slick 与数据库枚举结合使用

Java 模拟 - 用模拟对象动态替换类

unit-testing - Grails 2.x中的Grails单元测试失败

android - 为什么在给定 List<List<Any>> 时,参数化 JUnit 测试会抛出 IllegalArgumentException,但适用于 List<Array<Any>>

java - Junit 测试空方法

testing - 开源或免费测试解决方案

scala - 如何在 Spray 的嵌套路由中使用字符串指令提取器

Scala - HashMap 上的折叠操作示例 ** 不是 foldLeft

Scala 错误 : class file is broken, 错误的常量池索引

unit-testing - 引入单元测试的代码基准行数边界是多少?