考虑下面的例子:
void Whole()
{
A().B().C();
}
我已经为A
、B
、C
编写了测试方法。它们以许多不同的可能方式使用,例如 A().C().B()
或 B().A().C()
或 B().C().A()
。其中之一用于 Whole
方法。有3个!当他们都参与进来时的组合。
问题:是否有必要为任何使用的组合编写测试,例如 Whole
使用的是什么?
更新:基本上,A
和B
和C
是查询对象
并简单地链接它们 和
-ens它们。但非常欢迎关于这些方法的其他想法。
更新 2:
考虑 h(x)
= f(x)
+ g(x)
。如果我测试 f(x)、g(x) 和测试 + 运算符是否正常工作,我还需要测试 h(x)
假设相同的测试上下文对于所有 f
、g
和 h
函数都存在 ?
最佳答案
是的。如果有人将 Whole
的实现更改为:
void Whole()
{
A().C().B();
}
如果您没有进行测试,您将不会知道,并且可能会在您的应用程序中发生不好的事情。
所以你需要测试 Whole
来确定。但是你需要什么类型的测试?如果 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 次测试(实际上并没有那么多)
关于unit-testing - 当已经测试了每个组件方法时测试方法组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681175/