考虑以下示例:
void Whole()
{
A().B().C();
}
我已经为A
,B
,C
编写了测试方法。它们以多种不同的方式使用,例如A().C().B()
或B().A().C()
或B().C().A()
。其中一个用于Whole
方法。有3个!当所有人都参与其中时,这种组合。
问题:是否有必要为任何使用过的组合编写测试,例如Whole
使用什么?
更新:基本上,A
和B
以及C
为query objects
,并将and
链接起来 - 接受它们。但关于这些方法可能存在的其他想法非常受欢迎。
更新2:
考虑h(x)
= f(x)
+ g(x)
。如果我测试f(x),g(x)和测试 + 运算符以便正常工作,我是否还需要测试h(x)
,假设所有{存在相同的测试上下文{1}},f
和g
功能?
答案 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次测试(实际上不是那么多)