端到端测试足够吗?

8
我的问题主要与测试方法有关。我在一家实践TDD(测试驱动开发)的组织工作。我们使用AngularJS及其完整的测试堆栈——Jasmine进行单元测试,使用Protractor进行端到端测试。
在开发功能时,我们的流程始于先编写失败的端到端测试,然后使用TDD编写功能。这些测试仅针对公共方法编写(无论是控制器/指令/服务)。产品本身不包含任何复杂逻辑(除了几个异常情况)。
最近,我们开始讨论这样一个事实:为控制器编写单元测试没有意义,因为它们正在公开功能,100%的功能都暴露给视图,并且通过端到端测试进行了测试。基本上,单元测试和端到端测试是重叠的。起初,我们都同意了,但是这个决定引发了一个潘多拉魔盒。毕竟,指令也可以说同样的话。那么为什么也要测试它们呢?然后就出现了服务的问题。其中大部分服务(98%)只是进行后端调用并返回响应。那么为什么不简单地模拟httpBackend并在测试控制器时测试服务,而这些控制器已经通过端到端测试进行了测试呢?
你明白了吗?
尽管它们实际上是重叠的,但我确实看到了进行单元测试和端到端测试的好处。主要是即时反馈和“可执行文档”。
你在实践什么?您是否看到其他好处,并且“值得一试”——为了获得上述两个好处而编写重叠测试是否值得呢?

如果编写良好的代码是一种观点,那么您可以删除它,但您也可以提出关于设计模式等许多高级问题的问题。 - Shvilam
大家好。 虽然我理解你们的关注,但我的问题是关于方法论的,这类问题从来没有一种适合所有情况的答案。即使方法论已经被明确定义,每个人的实践方式也不尽相同,我的问题的目的是让其他人分享他们在测试方法论方面的实践和经验。 为了做到这一点,必须引发讨论。一旦讨论开始,结果可能会收敛到你所寻找的一个答案。 - Boris Litvinsky
1个回答

4
这是一个很大的话题,没有权威答案,但我会尽力涵盖一些要点。首先,你应该考虑测试的目的。根据敏捷测试象限, 单元测试主要用于支持团队。它们通常在产品附近编写(例如使用TDD,可能由开发人员自己编写),并有助于增加开发人员的信心,以确保他们没有在最后一次更改中破坏任何内容。有了这个信心,开发人员可以高效地工作和随意重构 - TDD的梦想。单元测试不能回答“这是否适合我们客户的目的”,但这不是它们存在的原因。功能测试(端到端,如果我理解你的描述)仍然通过快速测试结果的快速反馈来支持团队,但实际上开始回答问题“用户能做这件事吗?”你正在测试用户看到的内容,并开始以对用户有意义的方式测试您的实际产品。
第三和第四象限开始讨论产品是否做得好(即是否适合用途而不仅仅是功能),但这是另一个话题。
基于对测试的理解,答案的一部分取决于您的团队结构。您是否有独立的开发和测试团队?如果是这样,您的开发人员编写单元测试可能是有意义的(毕竟这对他们有益),而测试团队则独立处理其他象限(包括根据需要编写端到端测试)。如果您的测试和开发团队是同一个团队呢?如果你可以从功能/端到端测试中获得与单元测试相似的周转时间(测试编写->有用结果),那么专注于它们并同时收获两种方法的回报可能是有意义的,而且没有重叠。
我会给出的简短答案就是简单地问“我们从这个测试中获得了什么好处?”如果您发现测试的答案重叠,那么消除冗余可能是有意义的。
上述一些点和更多内容在此处进行了讨论,所以我现在停止唠叨。

嗨,史蒂夫。非常感谢你周到详细的回答。我会在今天稍后阅读你提到的文章,因为它们似乎非常切题。当然,由此我会有后续问题。我想澄清一下你对“周转时间”的定义。你是指开发人员在出现问题时接收反馈所需的时间吗?如果是这样,差异是很大的(主要是因为浏览器实际上也参与其中)。在我看来,单元测试与端到端测试不重叠的好处是:a)即时反馈;b)各种应用程序组件的可执行文档。 - Boris Litvinsky
关于反转时间,您是正确的;单元测试应该有短的转换时间,通常是从按下“运行”到返回“通过”或“失败”结果的几秒钟内。相比之下,像负载测试这样的东西可能需要运行多天甚至数周。在您的情况下,听起来您的单元测试正在通过快速反馈进行开发团队的良好受益,而端对端测试并没有很好地服务于特定目的,这意味着它们各自具有不同的目的。 - Steve U

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接