58

你是其中之一吗?或两者?

我的理解是单元测试:

  • 从开发人员的角度验证系统
  • 帮助开发者实践 TDD
  • 保持代码模块化
  • 协助检测低粒度级别的错误

验收测试:

  • 从业务和 QC/QA 的角度验证系统
  • 往往是高级别的,因为它们通常是由不熟悉代码内部工作的人编写的

我觉得两者都是必要的。但是,为了最大限度地减少冗余工作,尝试将单元测试合并到验收测试中是否是个好主意?换句话说,让后者调用前者。往反方向走有意义吗?

您对单元测试与验收测试的总体看法是什么,以及如何管理它们之间的关系?

4

5 回答 5

89

验收和集成测试告诉您您的代码是否正常工作和完整;单元测试告诉你它在哪里失败。

如果您在验收和集成测试方面做得很好,并且它们通过了,那么您的代码正在实现它应该实现的所有功能,并且它正在工作。很高兴知道(很高兴知道事实并非如此)。但如果它不起作用,验收测试不会让您深入了解哪里出了问题。因为它测试了许多功能单元,所以它可以是一种失败的鸟瞰图。这就是单元测试大放异彩的地方。好的单元测试可以准确地告诉您出了什么问题,以及代码的哪一部分。与验收测试相比,更难知道您是否编写了足够多的单元测试,但是当验收测试失败而没有相应的失败单元测试时 - 是时候编写该单元测试了。

这都是从测试的角度来看的。当然,TDD 与测试无关(ATDD 也不是)。关于推动您的设计,验收测试为您提供了一个广泛的路线图(“这是您想去的地方”),而单元测试将您带到下一个路口(“左转”)。它们在这方面都很有价值,而且它们的价值又是相辅相成的。

不要混淆他们;不要将它们混为一谈。特别是单元测试不应该依赖于其他任何东西,并且通过使验收测试依赖于它们来限制单元测试是错误的。当然它们可以共享一些框架代码,但它们应该是独立的。

于 2010-11-10T14:38:37.217 回答
15

但是,为了最大限度地减少冗余工作,尝试将单元测试合并到验收测试中是否是个好主意?

不。

换句话说,让后者 [acceptance] 调用前者 [unit]。往反方向走有意义吗?

不要打扰。

验收测试通常是政治性的。你把它们展示给那些——根据他们的直觉——决定接受或拒绝的人。

然后你争论验收测试的有效性。

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

验收测试通常不是技术性的。如果是这样,那么您将进行正式的单元测试,就是这样。

不要试图巧妙地利用政治。拥抱它。让它发生。


您可以希望验收测试驱动开发 (ATDD) 导致“验收测试在开发开始之前由整个团队编写并达成一致”。但是你必须反映这样一个现实,即任何事先写好的东西都是似是而非的,最坏的情况是可以商量的。

所有敏捷方法背后的前提是您只能同意获得可发布的东西。之后的一切都可以商量。

所有测试优先(TDD、ATDD 或其他任何东西)背后的前提是测试是一个铁定的协议。除非它不是。使用任何 TDD(或 ATDD)方法,您原则上都可以同意测试结果,但您并没有真正同意测试本身

可能会出现测试不容易编写的情况。或者更糟的是,根本写不出来。您可能会同意看似可测试的结果,但结果定义不明确。现在怎么办?在您开始开发并了解详细信息之前,您无法知道这些事情。

所有的测试都很重要。并且没有特定类型的测试可以是任何其他类型测试的超集或子集。它们总是部分重叠的集合。试图结合以某种方式节省一些工作可能会浪费时间。

更多的测试比什么都好。所有测试的联合比试图在测试之间强制建立子集-超集关系更有价值。

于 2010-11-09T22:02:52.317 回答
15

作为以上所有内容的总结,

  • 验收测试确保您正在构建正确的东西
  • 单元测试确保你正在构建正确的东西
于 2017-03-11T07:02:06.323 回答
11

单元测试——我的特定功能只做它应该做的事情,不多也不少。

验收测试 - 我的应用程序做了它应该做的事情。

示例:计算二次函数根的应用程序。接受 a、b 和 c 的输入,返回根 x1 和 x2。这个应用程序由我编写的函数构建,用于将两个数字相加、两个数字相减、两个数字相乘、两个数字相除以及两个数字的平方根。

单元测试 - 检查我的除法和乘法功能是否正常工作,我的平方根是否正常工作,我的加法和减法是否正常工作。

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

由于我的整个应用程序都是计算根,所以我不应该有一个也计算根的单元测试,因为没有单独的函数可以这样做。

于 2013-04-17T16:31:17.690 回答
2

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

但是,为了最大限度地减少冗余工作,尝试将单元测试合并到验收测试中是否是个好主意?

我反对 S. Lott 的反对意见,并补充说这里存在单元测试在某种程度上被操纵的危险,这可能会导致一些错误通过。例如,在下拉列表中,有人可能会测试几个状态,但可能不是全部,测试人员可能会使用不同的数据来发现潜在的错误。

换句话说,让后者调用前者。往反方向走有意义吗?

我会小心地将它们耦合在一起。单元测试代表对最小功能位的测试,通常小到最终用户无法理解可能有数百个测试只是为了获取一个 Web 表单以将数据输入到 CRM 系统中。验收测试更多的是关于应用程序的用户想要什么,这可能更主观,例如“这看起来漂亮吗?” 与“这看起来对吗?” 验收测试可能会有“足够好”的标记,我不确定它是否适用于单元测试。通常,如果单元测试失败,则必须有人决定修复代码或删除测试,因为每个测试都可能是一个不错的选择,具体取决于具体情况。

您对单元测试与验收测试的总体看法是什么,以及如何管理它们之间的关系?

单元测试是关于验证最简单的代码片段。可以进行集成测试,但这是一个更高的级别,因为一旦检查了所有小部件,这些部件的组合是否可以一起工作,例如,我在成长过程中观看的周六早上卡通片中有可以像“Voltron”这样的玩具或各种变形金刚,例如形成毁灭者的 Constructicons。验收测试通常从最终用户的角度出发,“我现在可以用应用程序做 X 吗?” 在某事出门之前得到“是”的回答。虽然在验收测试中可能会检查一些错误情况,但对可能进入应用程序的每个可能组合进行彻底测试并不常见。但是,单元测试可能涵盖边界条件和其他一些类似随机的情况。

于 2010-11-09T22:53:32.313 回答