2017-02-22 83 views
1

我是BDD的新手,甚至是整个测试世界。我应该如何测试BDD中值对象类型的“isEqual”方法?

我想在快速编写一个简单的线性代数库时采取BDD的做法。所以会有很多的值对象类型,如MatrixVector等在编写代码时,我想我还需要坚持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 
    } 
} 

这将是两个原因一个丑陋的样板:

  1. 可能有大量的值对象类型的,我需要重复所有其中
  2. 可能有很多情况会导致两个对象不相等。以上述规格为例,==的执行如return lhs.rows == rhs.rows将通过测试。为了揭示这个“bug”,我需要增加一个像expect(matrixWithDifferentColmunCount) != aMatrix这样的期望。再次,这种重复发生在所有值对象类型上。

那么,我该如何优雅地测试这个“isEqual”(或operator==)方法呢?或者我不应该测试它?


我正在使用swift和Quick进行测试框架。 Quick提供了一种称为SharedExample的机制来减少样板。但是由于swift是一种静态类型语言,Quick的共享示例不支持泛型,所以我不能直接使用共享示例来测试值对象。

我想出了一个workaround但不认为它是一个优雅的。

回答

1

优雅是测试套件的敌人。测试套件很无聊。测试套件是重复的。测试套件不是“干”。您制作测试套件越聪明,试图避免模板化的越多,测试测试基础架构的代码就越多,而不是您的代码。

BDD的规则是在编写代码之前编写测试。这是少量的测试代码,因为它正在测试少量的实时代码;你只是写它。

是的,这可以采取太多,我不是说你从来没有使用助手功能。但是当你发现自己重构你的测试套件时,你需要问自己测试套件的用途。

作为一个便笺,您的测试不会测试它说的是什么。您正在测试相同的构造函数创建Equal对象和不相同的构造函数创建非Equal对象(原则上这是两个测试)。这根本不测试它是一个值对象(尽管这是一个非常好的测试)。这不是一个大问题。不要让测试理念妨碍有用的测试;但让你的标题符合你的测试意图是很好的。

+0

这是真的(可悲)。 –

相关问题