单元测试双向转换器

时间:2016-01-26 08:59:38

标签: java unit-testing

在为双向转换器编写单元测试时,我想知道用单元测试仅覆盖一个方向是否足够。假设转换器可以转换a -> bb -> 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

3 个答案:

答案 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))==测试。虽然它显然无法正常工作;)