我们正在开发 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/