unit testing与验收testing

你是一个人还是另一个? 或两者?

我的理解是unit testing:

  • 从开发人员的angular度validation系统
  • 帮助开发者练习TDD
  • 保持代码模块化
  • 有助于以较低的粒度检测错误

验收testing:

  • 从业务和QC / QA的angular度validation系统
  • 往往是高层次的,因为他们通常是由不熟悉代码内部工作的人写的

我觉得都是必要的。 但是,为了尽量减less冗余工作,尝试将unit testing纳入验收testing是一个好主意吗? 换句话说,后者叫前者。 朝相反的方向行事有意义吗?

你对unit testing和验收testing有什么想法,以及如何pipe理它们之间的关系?

验收和集成testing告诉你,你的代码是否工作和完成; unit testing告诉你它失败的地方。

如果你在接受和集成testing方面做得很好,并且他们通过了,你的代码正在实现它应有的所有function,而且它正在工作。 很高兴知道(知道它不是很好)。 但是,如果它不起作用,验收testing不会让你对错误发生什么了解。 因为它testing了很多function单元,所以它可能是一种鸟瞰的失败。 这是unit testing闪耀的地方。 好的unit testing告诉你到底发生了什么错误,确切地说你的代码是什么部分。 很难知道你是否编写了足够多的unit testing,而不是验收testing,但是如果没有相应的失败unit testing,你的验收testing失败 – 是时候编写unit testing了。

这是从testing的angular度来看。 当然,TDD不是(而ATDD也不是)testing。 在驾驶你的devise方面,验收testing给你一个广泛的路线图(“这是你想去的地方”),而unit testing带你到下一个路口(“左转”)。 在这方面它们都是有价值的,而且它们的价值又是相辅相成的。

不要混淆他们; 不要混淆他们。 尤其是unit testing不应该依赖于其他任何东西,而通过使testing依赖于unit testing来限制你的unit testing是错误的。 当然他们可以共享一些框架代码,但是它们应该是独立的。

但是,为了尽量减less冗余工作,尝试将unit testing纳入验收testing是一个好主意吗?

没有。

换句话说,后者[接受]称为前者[单位]。 朝相反的方向行事有意义吗?

不要打扰。

验收testing通常是政治性的。 你把他们展示给那些基于他们直觉的人 – 决定接受还是拒绝。

然后你就验收testing的有效性进行辩论。

然后你争论工作的范围和下一个版本。

验收testing通常不是技术性的。 如果他们是,那么你会有正式的unit testing,那就是这样。

不要试图搞清楚政治。 拥抱它。 让它发生。


您可以希望接受testing驱动开发(ATDD)导致“验收testing是在开发开始之前由整个团队编写和同意的”。 但是,你必须反映事实上任何事先写好的东西都是似是而非的,最坏的情况是可以谈判的。

所有敏捷方法背后的前提是,你只能同意find可以释放的东西。 之后的一切都是可以协商的。

所有testing优先(TDD,ATDD或其他)背后的前提是testing是一个铁的协议。 除了不是。 使用任何TDD(或ATDD)方法,您原则上可以同意testing结果 ,但您并未真正同意testing本身

可能会出现这个testing不容易写出来的问题。 或者更糟的是,根本不能写。 你可能会同意看起来可以testing的结果,但是结果很差。 现在怎么办? 这些是你开始开发和细节之前所不知道的东西。

所有的testing都很重要。 而且没有任何一种特定的testing可以成为任何其他typestesting的超集或子集。 他们总是部分重叠的集合。 试图结合以某种方式挽救一些工作可能会变成浪费时间。

更多的testing比别的更好。 所有testing的联合比试图强制testing之间的子集 – 超集关系更有价值。

unit testing – 我的具体function是做它应该做的,没有什么更多,也没有什么。

验收testing – 我的应用程序做它应该做的。

示例:应用程序计算二次函数的根。 inputa,b和c,返回根x1和x2。 这个应用程序是由我写的函数构build的,添加两个数字,减去两个数字,乘以两个数字,除以两个数字,并取两个数字的平方根。

unit testing – 检查我的除法和乘法函数是否正常工作,我的平方根是否正确工作,正确地加减工作。

验收testing – 检查我的应用程序是否计算二次函数的根。

由于我的整个应用程序是计算根,我不应该有一个unit testing,也计算根,因为没有个人function这样做。

综上所述,

  • 验收testing确保您正在构build正确的事情
  • unit testing确保你正在构build的东西正确

这些只是我个人对某些testing问题的看法:

但是,为了尽量减less冗余工作,尝试将unit testing纳入验收testing是一个好主意吗?

我想把S.Lott的这句话放在这个上面,并补充说,unit testing在某种程度上被操纵,这可能会有一些错误通过。 例如,在某个下拉列表中,有人可能会testing一些状态,但可能不是全部状态,testing人员可能使用不同的数据来发现潜在的错误。

换句话说,后者叫前者。 朝相反的方向行事有意义吗?

我会小心的将它们连接在一起。 unit testing代表最小function的testing,通常很小,最终用户不会理解可能有数百个testing只是为了让Web表单将数据inputCRM系统。 验收testing更多地是关于应用程序的用户所需要的内容,这可能更主观,比如“这看起来漂亮吗? 与“这看起来正确吗?” 可以有那个“不错”的验收testing的标记,我不确定是否会用unit testing。 一般情况下,如果一个unit testing失败了,那么有人必须决定是修复代码还是取消testing,因为根据情况,每个testing都是一个很好的select。

你对unit testing和验收testing总体上有什么想法,以及如何pipe理它们之间的相互关系?

unit testing是关于validation最简单的代码段。 可以进行整合testing,但是这个水平要高一些,因为一旦所有的小块被检查,这些块的组合是否一起工作,例如周六早上的漫画,我看着长大的玩具,像“Voltron”或者像形成破坏者的Constructicons一样的各种变形金刚。 验收testing通常是从最终用户的angular度来看的,“我现在可以使用应用程序来执行X吗? 答案是“是”,然后才能出门。 虽然在验收testing中可能会检查出一些错误情况,但对每个可能进入应用程序的可能组合进行彻底testing并不常见。 但是,unit testing可能会覆盖边界条件和其他一些随机types的情况。