端到端测试与单元测试之间,应该将测试解耦吗?


23

在我们公司,我们通常会确保为我们的网站/ Web应用程序编写一个端到端测试。这意味着我们访问一个URL,填写一个表单,将该表单提交到另一个URL并检查页面结果。我们这样做是为了测试表单验证,测试HTML模板是否具有正确的上下文变量等。

我们还使用它间接测试基础逻辑。

一位同事告诉我,这样做的原因是,只要端到端测试通过,我们就可以随时淘汰和更改基础实现。

我想知道这种解耦是否有意义,或者这仅仅是避免编写针对较小代码单元的测试的方法?


6
was told by a co-worker that the reason for this is that we can rip out and change the underlying implementation at any point as long as the end-to-end tests pass.-单元测试也是如此。在我看来,端到端测试被用作不编写单元测试的借口。
罗伯特·哈维

12
单元测试并非如此。更改/删除/创建方法或类需要更新这些方法或类的所有单元测试。除非最终用户功能发生变化,否则在端到端测试中并非如此。只要是系统级重构(无需修改最终用户功能),就无需对端到端测试进行任何更改。
Dietbuddha 2013年

2
@dietbuddha,我认为一般概念对于单元测试是正确的,但范围较小(单元)。
2013年

Answers:


38

端到端测试也是必要的。您还怎么知道如何将所有单元正确地连接在一起?在非常简单的代码上,可以仅使用端到端测试来测试代码中的所有路径,但是随着层数的增加,这样做的代价将变得非常高昂。

例如,假设您有三层,每层都有五个可能的路径。要测试通过整个应用程序的所有路径,将需要进行5 3个端到端测试,但是您可以仅使用5·3个单元测试来测试通过每个单元的所有路径。如果仅进行端到端测试,则很多路径最终都会被忽略,主要是在错误处理和边界条件下。


这是一个很好的答案。我看到了两者的价值,但是看到了通过端到端测试全面测试所有路径的可能性的数量有助于解释为什么单元测试需要做得比实际情况更多
Rudolf Olah

14
我认为单元测试非常有价值,主要是因为它们可以快速定位问题。端到端很有价值,因为它们使您确信所有东西都可以一起工作。
杰森·斯威特

20

是的,端到端测试(或集成测试)很有意义,但是单元测试也是如此。理想情况下,您应该同时拥有它们,因为它们通常会捕获不同类型的错误。因此,进行端到端测试绝不能成为没有单元测试的借口。


2
关于措辞的快速笔记;即使不是一门精确的科学,许多人也会说端到端测试和集成测试是不同的东西。见stackoverflow.com/questions/4904096/...
sbrattla

6

经过几年的编码和从事项目工作,我将为我自己的问题提供答案。

是的,您应该编写单元测试。端到端测试更难编写且易碎,尤其是如果它们依赖于UI组件。

如果您使用的是Django或Rails之类的框架(或您自己的自定义类),则应该有一个用于处理表单验证的表单类。您还将拥有视图类,这些类显示渲染的模板和表单并处理GET和POST请求。

在端到端测试中,您将:

  1. 获取网址
  2. 用有效数据填写表格
  3. 将表格发布到网址
  4. 检查以确保数据库已更新或由于有效表单而执行了某些操作

您正在测试很多代码,覆盖范围会很好,但是只有在一切顺利时才测试幸福的道路。您如何确保表单具有正确的验证?如果在多个页面上使用该表格怎么办?您还编写另一项端到端测试吗?

让我们通过单元测试再试一次:

  1. 测试视图GET方法
  2. 使用伪造/模拟形式测试视图POST方法
  3. 用有效数据测试表格
  4. 用无效数据测试表格
  5. 测试表格的副作用

通过使用单元测试,您正在测试较小的代码段,并且这些测试是特定的并且易于编写。当您将其与TDD(测试驱动开发)结合使用时,您将获得更高质量的代码。

编写单元测试的简便性不应该被忽略,因为当您在没有自动测试的项目中时,您必须从某个地方开始。从单元测试开始更容易,更快捷,它使您可以立即开始测试错误,而不仅仅是开始尝试。


另一个数据点是,Google Testing Blog对更多的end2end测试表示拒绝:googletesting.blogspot.ca/2015/04/…–
Rudolf Olah

5

实际上,端到端测试或集成测试比单元测试更为重要,因为它们可以确保您拥有一个完整的系统。单元测试不覆盖系统的集成部分,这是一项复杂的任务,尤其是在大型项目中。

但是,正如已经说过的那样,您还应该进行单元测试,因为在集成测试中捕获边缘情况更为复杂。


1

它验证系统行为,而单元测试则验证单元行为。两者的收益和成本是不同的。您可以做一个或另一个。

在我的工作中,我们进行没有单元测试的验收测试驱动开发,这听起来与您所描述的相似。我们从开始就开始做这两个过程,随着时间的流逝,最终取消了单元测试,这样做的代价超出了我们的收益。

话虽这么说,但我认为针对您的问题领域和环境的成本/收益应该驱动做出参与任何开发实践(包括不同的自动化测试实践)的决策。我更喜欢信念,而不是信念,所有实践都应有经验证据来支持它们。


我担心的是,我们将对验收测试进行编码,这将导致大型类或方法,而不是较小的单元。
Rudolf Olah

@omouse:仅仅因为您没有编写单元测试就没有理由不编写良好的代码。但是,如果您没有经验的程序员或只是有不良的习惯,那么收益可能会超过成本。无论哪种情况,都应进行分析并将其简化为一个简单的方程式。For Any Practice: Practice iff Benefit > Cost
Dietbuddha
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.