unit-testing - 当已经测试了每个组件方法时测试方法组合

标签 unit-testing testing

考虑下面的例子:

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

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

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

更新:基本上,ABC查询对象并简单地链接它们 -ens它们。但非常欢迎关于这些方法的其他想法。

更新 2: 考虑 h(x) = f(x) + g(x)。如果我测试 f(x)、g(x) 和测试 + 运算符是否正常工作,我还需要测试 h(x) 假设相同的测试上下文对于所有 fgh 函数都存在 ?

最佳答案

是的。如果有人将 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/

相关文章:

c# - 如何测试以确保接口(interface)除了列出的方法之外没有其他方法?

android - 仅在单元测试期间出现 DateFormat ParseException

c# - 单元测试应用程序_开始

javascript - 模拟命名导入和构造函数 ES6 和 Ava

当输出重定向到文件时,xcodebuild 会损坏测试结果输出

testing - 当由 CompletableFuture 运行时,在 Spock 的 Mock 等待中休眠

java - 为 TestNG 方法传递对象参数?

database - 测试用户数据(假数据)

javascript - 如何避免为每个 Jest 测试用例重新运行异步 API 调用?

testing - 无法将值传递给测试用例中的输入字段