【问题标题】:Why should I write unit tests if I already have E2E tests [closed]如果我已经进行了 E2E 测试,为什么还要编写单元测试 [关闭]
【发布时间】:2017-11-25 06:01:14
【问题描述】:

如果我们已经在进行E2E (end-to-end) 测试,是否还需要编写单元测试?

考虑到我们在端到端测试中进行所有功能测试,两者都做的优缺点是什么?

【问题讨论】:

  • e2e 测试测试未模拟数据库连接的整个应用程序。在哪里作为单元测试模拟数据并测试特定功能

标签: unit-testing end-to-end


【解决方案1】:

因为 E2E 测试并不是单元测试的完美替代品。

特别是:

它们运行缓慢

E2E 测试使用实际服务,而不是模拟。真正的数据库比数据库的内存模拟要慢得多。您还必须构建整个项目、设置种子数据等。

如果我必须等待很长时间才能结束测试运行,我可能会开始更频繁地跳过它。

他们不会隔离失败

E2E 测试告诉您整个场景都被破坏了,即“用户登录失败”。他们不会告诉您参与该场景的哪个组件的哪个部分损坏了。这使得很难判断是哪部分代码导致了测试失败。

它们损害了可重用性

您不能放心地拔出系统的组件并将其放到另一个系统中。在新环境中,无需为该组件运行单元测试。

你不能按单元做TDD

如果您想为您的系统开发一个新的组件(单元)并在使用 TDD 的同时使用它,那么您在没有单元测试的情况下处于死胡同。单元测试和 TDD 齐头并进。


话虽如此:

  • 如果您的资源允许,同时进行 E2E 测试单元测试是您的目标。
  • 仅进行 E2E 测试总比没有测试好。

这是完美测试套件的一个很好的说明,称为Testing Pyramid

Google 测试博客中的这篇文章更详细地介绍了:Just Say No to More End-to-End Tests。虽然我不同意您不应该编写 E2E 测试,但它深入说明了每种测试的优缺点。

【讨论】:

  • 还有一个事实是端到端测试往往更难编写,因为它们通常涉及与实时数据的交互,但必须避免不必要地修改所述实时数据。可以轻松测试更改是否成功的单元测试在端到端测试中变成了更改数据、验证更改、还原更改的循环。忘记还原更改,或者还原过程出现问题可能会导致实时数据中出现意外的伪影。
  • @Claies AFAIK,E2E 测试在生产数据库的克隆上运行,您在整个测试运行后完全丢弃。
  • 这绝对是它们应该被设置的方式,但在实践中,它们并不总是以这种方式设置(可悲但真实)。
【解决方案2】:

单元测试是软件生命周期中提高其质量的重要方面。如果我们编写了测试用例,任何新开发人员都可以理解功能并根据条件检查不同的输出。它应该是流程的强制性部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多