在每个组件方法都测试过的情况下测试方法组合



考虑以下示例:

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

我已经写了A, B, C的测试方法。它们以许多不同的可能方式使用,例如A().C().B()B().A().C()B().C().A()。其中一个用于Whole方法。有3个!

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

Update:基本上,ABCquery objects,并将它们简单地链接为and -ens它们。但是对于这些方法的其他想法是非常受欢迎的。

更新2:

考虑h(x) = f(x) + g(x)。如果我测试f(x), g(x),并测试+操作符工作良好,我是否仍然需要测试h(x)假设相同的测试上下文存在于所有f, gh函数?

是。如果有人改变Whole的实现,会发生什么:

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

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

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

如果A() B()C()调用其他类来做他们的工作或在其他类中起作用,那么你需要一个基于交互的测试,你会使用mock或测试double来检查当你调用Whole时预期的交互是否发生,即验证A()首先被调用,然后B(),最后C()

查看状态测试和基于交互的测试之间的区别

我不怀疑你的函数会一起正确地执行,但是你需要测试它们是否被正确地调用。这可能是一个更好的交互测试,而不是一个状态测试(个别查询的测试-即使状态是在数据库中)。您可能会受益于为Whole进行测试,只是验证A()首先被调用,然后是B(),最后是C(),或者忽略来自DB的结果,或者为这些测试提供A() B()C()的模拟实现。

或者完全放弃Whole方法,让您的客户端调用A().B().C()自己,然后您将检查它们正在做正确事情的责任转移给它们。但IMHO,如果你提供Whole方法,你应该测试,它做你所期望的,即使这意味着15个测试(它不是真的那么多)

相关内容

最新更新