在为双向转换器编写单元测试时,我想知道用单元测试仅覆盖一个方向是否足够。假设转换器可以转换a -> b
和b -> a
:
class Converter<A, B> {
B convertToB(A a) { /* ... */ }
A convertToA(B b) { /* ... */ }
}
或者更正式地说:
f(a) = b
f(b) = a
标准单位测试必须测试两个转换方向。然而,编写像f(f(a)) == a
这样的测试非常容易。我们假设,f(a) == b
由单元测试覆盖。哪些测试是必要的
足以涵盖f(b) == a
?
(1) f(f(a)) == a
(2) f(f(b)) == b
(3) f(f(a)) == a && f(f(b)) == b
还是我们必须测试
(4) f(b) == a
答案 0 :(得分:2)
从数学理论的角度来看:
如果给出f(a) == b
,您可以说:
f(f(a)) == a
可以评估为f(b) == a
,因此足以进行测试。
f(f(b)) == b
不足以测试!那是因为你没有证明f(b) == a
。如果您只是证明f(f(b)) == b
,则可能会f(b) == b
!
答案 1 :(得分:1)
您未涵盖convertToB(null);
之类的错误案例
如果您测试assertEquals(bObject, convertToB(convertToA(bObject)));
,您将永远不知道最终问题在哪里。
我认为你应该测试正面案例和一些错误或边缘案例。
f(a) = b
f(b) = a
f(null) = ?
f(f(b)) = b
f(f(a)) = a
根据转换规则(因为我不知道A和B是如何相关的)你应该测试更多的情况(例如,将foo属性设置为值的对象,将foo属性设置为null的对象, ...)。
您可以查看equivalence partitioning测试技术,以获得最低要求的测试用例。
答案 2 :(得分:0)
是的,您还需要测试f(a)== b。
Converter的示例实现:
Int convertToB(Int a) { return -a }
Int convertToA(Int b) { return -a }
将通过f(f(a))==测试。虽然它显然无法正常工作;)