如果我有 UI 个自动化测试,为什么还要编写单元测试

Why Should I Write Unit Tests if I have UI Automation Tests

如果我有 UI 个自动化测试,为什么我需要编写单元测试?

如果我需要检查方法 returns 给定输入的一些输出,例如添加的结果然后显示在视图中,如果我可以确认,为什么还需要单元测试通过UI自动化测试

,视图中的输出是正确的(或不正确的)

尽管有自动化测试,但您仍需要单元测试的原因有两个。

  1. 单元测试使无情的代码重构成为不那么令人生畏的挑战,并降低了风险
  2. 单元测试提供了宝贵的代码文档,每个模块的作用(自动化测试不会给你这个),当代码更改时,单元测试也会更改,这也不同于某些 wiki 中的陈旧文档或永远不会更新的文档后来随着代码的不断变化和发展。

单元测试和端到端测试(UI 测试)有两个不同的目的

  • 单元测试告诉您代码单元(模块、class、函数、接口)何时出现问题

  • 端到端测试告诉您失败如何影响端到端输出。

让我们打个比方来理解为什么我们需要两者。

假设您通过组装化油器、齿轮箱、轮胎、曲轴等不同部件来制造汽车。所有这些部件都由不同的供应商(想想开发商)制造。

当汽车无法按预期工作时,您是否需要测试各个组件以找出问题的根源?

在组装汽车之前测试部件,让您省时省力吗?

通常您要做的是确保每个组件都按预期工作(单元测试),然后再将它们添加到您的汽车中。

当汽车没有按预期工作时,您测试每个组件以找出问题的根本原因。

这通常通过创建装配线(CI 管道)来实现。您的测试策略看起来像

  1. 测试单个组件

  2. 测试它们在与其他组件交互时是否工作

  3. 在所有部件组装在一起后测试汽车。

这种测试策略就是我们在编程中所说的测试金字塔。

阅读本文可能会给您更多见解:https://martinfowler.com/bliki/TestPyramid.html

除了 Nishants 和 James 的回答:使用 UI/End-to-End 测试,测试某些错误条件要困难得多。

首先,你需要明白单元测试用例和用户界面(UI)测试自动化是两个不同的概念。在单元测试用例中,您为每个单元编写测试用例并逐个模块测试它们——您实际上是在分别测试每个模块。

另一方面,

Test automation 涵盖端到端测试。它测试您的端到端输入及其各自的输出。两者都有各自的优势,因此您需要在您的产品上同时使用它们以确保它没有错误。让我们通过一个例子更好地理解单元测试的必要性:

您正在构建一个聊天应用程序。对于应用程序,您正在集成不同的模块,如登录、注册、发送和接收消息、消息历史记录等。现在,假设有多个开发人员在开发该产品:每个开发人员都在不同的模块上工作。在这种场景下,需要将所有的模块加入到系统流程中,才能做出完整的产品。当你整合所有模块时,你发现产品无法存储消息。所以,现在您需要独立测试每个模块,因为您无法判断哪个特定模块不起作用。

为避免这种情况,最好在将每个模块与其他模块合并之前对其进行测试。这叫做unit testing。如果单元测试正确完成,您将立即发现错误。一旦所有的单元测试用例通过,你终于可以开始集成模块了。

单元测试通常通过使用流水线来执行(CI pipeline)。如果您创建了良好的测试策略并编写了最好的测试用例,您的产品通常会成功。流程有点像这样:

  • 测试单个模块
  • 开始集成和测试每个功能,看看它是否正常工作
  • 运行 UI 集成所有模块后对产品进行自动化测试用例

最后,如果所有测试用例都通过,则意味着您的系统已准备好完美运行。