我是 BDD 的新手,甚至是整个测试世界的新手。
在快速编写简单的线性代数库时,我正在尝试采用 BDD 实践。所以会有很多值对象类型,比如Matrix
,Vector
等等。在写代码的时候,我想我还是需要坚持 TDD 原则(我说的对吗?):
没有失败的测试不写任何一行代码
为了实现一个值对象类型,我需要让它符合Equatable
协议并实现它的==
操作符。这是添加代码,所以我需要一个失败的测试。如何为这种场景编写规范?
有人可能会建议一些方法,例如:
describe("Matrix") {
it("should be value object") {
let aMatrix = Matrix<Double>(rows: 3, cols:2)
let sameMatrix = Matrix<Double>(rows: 3, cols:2)
expect(sameMatrix) == aMatrix
let differentMatrix = Matrix<Double>(rows: 4, cols: 2)
expect(differentMatrix) != aMatrix
}
}
这将是一个丑陋的样板,原因有两个:
- 可能有很多值对象类型,我需要为它们重复一遍
- 可能有很多情况会导致两个对象不相等。以上面的规范为例,
==
like的实现return lhs.rows == rhs.rows
将通过测试。为了揭示这个“错误”,我需要添加另一个期望,例如expect(matrixWithDifferentColmunCount) != aMatrix
. 同样,这种重复发生在所有值对象类型上。
那么,我应该如何operator==
优雅地测试这个“isEqual”(或)方法?还是我根本不应该测试它?
我正在使用 swift 和Quick来测试框架。Quick 提供了一种称为SharedExample的机制来减少样板文件。但是由于 swift 是一种静态类型语言,而且 Quick 的共享示例不支持泛型,所以我不能直接使用共享示例来测试值对象。
我想出了一个解决方法,但不认为它是一个优雅的解决方法。