测试每个组件方法时的方法组合

时间:2015-06-06 09:28:52

标签: unit-testing testing

考虑以下示例:

void Whole()
{
   A().B().C();
}

我已经为ABC编写了测试方法。它们以多种不同的方式使用,例如A().C().B()B().A().C()B().C().A()。其中一个用于Whole方法。有3个!当所有人都参与其中时,这种组合。

问题:是否有必要为任何使用过的组合编写测试,例如Whole使用什么?

更新:基本上,AB以及Cquery objects,并将and链接起来 - 接受它们。但关于这些方法可能存在的其他想法非常受欢迎。

更新2: 考虑h(x) = f(x) + g(x)。如果我测试f(x),g(x)和测试 + 运算符以便正常工作,我是否还需要测试h(x),假设所有{存在相同的测试上下文{1}},fg功能?

1 个答案:

答案 0 :(得分:1)

是。如果有人将Whole的实现更改为:

,会发生什么
void Whole()
{
   A().C().B();
}

如果你没有进行测试,你就不会知道,并且可能会在您的应用程序中发生错误的事情。

所以你需要确定Whole。但是你需要什么类型的测试?如果整数与A() B()C()属于同一个类的一部分,并且这些方法以某种可观察的方式修改该类的状态,那么您可以只使用基于状态的测试来验证该类调用Whole时会发生预期的状态更改。由于Whole无效且您没有详细说明其他可能的方法,我无法确定此类测试是否合适。

如果A() B()C()调用其他类来完成他们的工作或在其他类中运行,那么您将需要基于交互的测试,并且您将使用模拟或测试双打来检查调用Whole时是否发生了预期的互动,即确认首先调用A(),然后B(),最后调用C()

查看状态和基于交互的测试here

之间的区别

我不怀疑你的功能会一起正确执行,但你需要测试它们是否被正确调用。这可能更好地作为交互测试而不是状态测试(即使状态在数据库中,对各个查询的测试也是如此)。您可以从Whole进行测试中获益,只需先验证A(),然后B(),最后C(),然后忽略数据库中的结果或提供模拟实现这些测试的A() B()C()

或者完全抛弃Whole方法并让客户自己调用A().B().C(),然后你将负责检查他们正在做正确的事情。但恕我直言,如果你提供Whole方法,你应该测试它是否符合预期,即使这意味着15次测试(实际上不是那么多)