什么是正确的平衡之间的单元与功能测试在一个典型的网络应用程序?

StackOverflow https://stackoverflow.com/questions/312904

  •  10-07-2019
  •  | 
  •  

单元测试的便宜编写和维护,但他们没有复盖所有情况。什么是正确的平衡,它们之间?

有帮助吗?

解决方案

我喜欢 Brian Marick的象限在自动化测试中,区别在于业务与技术的区别,支持编程与批判产品。

有了这个框架,平衡问题变成了,我现在需要什么?

其他提示

重要的是要区分意图和范围的这两种类型的试验:

  • 一个 单元的测试 典型的测试的一个特定功能模块/班级,例如创建-X、Y、foo-对吧,紧凑的whizbang,等等。一个类可能具有多个单元的测试

  • 一个 功能测试, 也被称为'接受测试'典型的测试使用的情况下从外界进行到底的处理,例如从用户接口的数据库,然后再返回,从输入过程中的通知的效用,等等。

这两种类型的测试 不互换, 和一般 不相交.所以这一概念的引人注目的一个"平衡",它们之间没有任何意义。你要么需要他们或你没有。

如果你指的是便于编各种类型的测试,在测试框架,这是一个不同的问题-但是使用框架(说的,关系用户机器人)不改变类型/性测试。

最好的"平衡",在一般情况下,将单元测试的信心和完整性和功能测试的客户接受

我同意史蒂文*洛的是,没有贸易之间的单元测试和功能测试,因为它们被用于非常不同的目的。

单元测试有关方法和类型的核查,并且也回归测试。功能测试有关的功能、方案、和可行性测试。在我看来,有几乎没有重叠,

如果有帮助,这里是我的检测的类别。

开发人员开始从里面向外工作,重点代码:

  • 断言验证的数据流量和结构
  • 调试器验证码和数据流
  • 单元测试验证每个功能
  • 一体化测试验证的子系统
  • 系统测试验证功能
  • 回归测试,检验缺陷固定住
  • 安全测试验证系统不能穿透容易。

测试开始从外部和工作在内,重点特点:

  • 验收测试和验证最终用户的要求
  • 场景测试验证实世界的情况
  • 全球测试验证可行的投入
  • 回归测试,检验缺陷固定住
  • 使用性测试验证的系统是很容易使用
  • 安全测试验证系统不能轻易的穿透
  • 代码复盖率测试的原始码
  • 兼容性,与以前的版本
  • 在寻找的怪癖和粗糙的边缘。

终端用户的工作之外,通常有一点重点:

  • 验收测试和验证最终用户的要求
  • 场景测试验证实世界的情况
  • 使用性测试验证的系统是很容易使用
  • 在寻找的怪癖和粗糙的边缘。

在我正在处理的应用程序上,功能测试可能有10:1单位。单元测试工作就像从数据库中检索实体,数据库/网络连接的错误处理测试等。这些事情快速运行 - 几分钟或更短时间,由开发人员每天运行。

功能测试虽然较少往往是厨房接收器方法 - 用户可以完成订单等等,往往覆盖业务领域的事情由业务分析和操作运行 - 遗憾的是我们经常手工操作。这些事情需要数周时间才能完成并通常最终确定发布周期。

我目前的项目是大约60%的单元测试覆盖率,所有用户故事都在硒测试中对用户故事进行了快乐的报道,其中一些还有额外的报道。

我们不断讨论这个问题:是否真的有任何因素推动针对更高覆盖范围的越来越荒谬的情景进行单元测试?

争论的焦点是,扩大硒测试会增加对具有商业价值的事物的测试覆盖率。客户是否真的关心可能失败的单元测试极端情况?

当您擅长硒测试时,编写具有商业价值的新测试的成本会降低。对我们来说,它们就像单元测试一样简单。

运行时成本是另一个问题。我们有一小组盒子一直在运行这些测试。

所以我们倾向于更多地支持网络测试,可能是因为我们擅长编写它们并且它们提供了不可否认的商业价值。

由于验收测试的初始成本因素,我最初倾向于偏爱功能/验收测试的单元测试。然而,随着时间的推移,我改变了我的理念,现在我强烈支持尽可能选择验收测试,并且只有在验收测试无法满足我的需求时才使用单元测试。

选择接受单位测试背后的基本理性与 SOLID 代码。您的实现应该能够通过重构等进行大幅改变,但所有业务案例 - 验收测试 - 应该能够保持不变并证明可接受的系统行为(测试通过)。通过单元测试,测试与实现代码之间通常存在强烈的耦合。即使它是测试代码,它仍然是代码和强耦合,因为我们应该避免。通过选择验收测试,您通常会在成功的螺旋上领先,以创建精心策划的耗材去耦合API,让您的实施在幕后更改,而不会强制您的测试进行更改。此外,您的开发人员实施思路与业务系统行为思想一致。最后,我发现所有这些对商业和编码人员的满意度都更好。

从理论的角度来看,我经常问自己,如果一段代码无法通过验收测试进行测试,为什么这段代码应该存在? IE - 如果它不是有效业务场景的一部分,那么该代码是否会增加价值,或者它当前是否仍然是单独成本?

此外,如果您对验收测试进行评论/记录,那些评论/文档通常是系统中最新,最准确的语言 - 通常可以让您避免使用其他不太有价值的文档方法。单元测试不适用于那种形式的<!> quot; business-term <!> quot;通信。

最后,我还没有从我的个人发展中形成这个观点,事实证明,在我的<!>“非常公司<!>”中有几个不同的项目团队是成功的。工作环境。

JB http://jb-brown.blogspot.com

测试应该快速运行并帮助本地化问题。 单元测试允许您仅通过测试相关模块来执行此操作。 但是,可以使功能/集成/验收测试在大多数Web场景中足够快地运行。

我曾经读过单元测试是<!>“可执行要求<!>”,这对我来说非常有意义。如果您的测试不是专注于证明业务需求,那么它确实毫无用处。如果您有详细的要求(那就是酸测试),那么您将编写一些单元测试来练习每个可能的场景,从而确保数据结构算法和逻辑的完整性。如果您正在测试某些不是必需的东西但是您知道测试通过时必须是正确的,那么很可能您缺少要求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top