为什么我要写单元测试,如果我已经有了UI自动化测试?

4

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

例如,如果需要检查某个方法对于给定的输入是否可以返回一些输出(例如相加的结果,然后显示在视图中),那么如果我可以通过UI自动化测试来确认视图中的输出是否正确(或不正确),我为什么还需要进行单元测试呢?


1
这个问题更适合于软件工程社区而不是Stack Overflow。 - Faheel
@FaheelAhmad 在那里,它可能会被关闭为这个问题的重复(也许还会因为缺乏研究而被投票否决)。 - gnat
4个回答

8

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

  • 单元测试可以告诉你代码单元(模块、类、函数、接口)是否存在问题。

  • 端到端测试可以告诉你故障如何影响端到端输出。

让我们使用类比来理解为什么我们需要这两个测试。

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

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

在组装汽车之前测试组件能够节省时间和精力吗?

通常,您希望在将它们添加到汽车之前确保每个组件都按预期工作(单元测试)。

当汽车无法按预期工作时,您会测试每个组件以查找问题的根本原因。

这通常通过创建一个装配线(CI流水线)来实现。您的测试策略如下:

  1. 测试各个组件

  2. 测试它们与其他组件接口配合是否正常

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

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

阅读以下内容可能会让您更了解:https://martinfowler.com/bliki/TestPyramid.html


1
谢谢。这一切都很有道理,我明白这些测试是什么以及它们的工作原理。但是我从同事那里听到,并且也开始相信,如果同一个测试由Calabash(https://calaba.sh/)覆盖,那么单元测试更像是浪费时间,因为Calabash提供了出色的文档,并且可以在功能测试中验证期望的结果。但我想我明白了你的观点,你是在说,“如果汽车出故障了,你怎么知道是曲轴导致了它的故障?”通过单元测试,你知道“曲轴出故障了,因此,汽车也会出故障”。谢谢。 - pixel
1
是的,除此之外,它还记录了曲轴作为一个单元应该完成的任务,例如:“它应该以1000RPM的速度工作”等等。当汽车使用新发动机无法工作时,我们发现曲轴在1200转/分钟时失效,我们会更新曲轴测试以确保其在1200转/分钟时正常运转(然后修复该部件)。 - Nishant

5

即使已经有了自动化测试,为什么你仍然需要单元测试呢?这里有两个原因:

  1. 单元测试可以让无情的代码重构变得不那么艰巨,并减轻风险。
  2. 单元测试提供了宝贵的代码文档,告诉你每个模块都做了什么(自动化测试无法提供此信息)。当代码发生变化时,单元测试也会随之改变,而不像某些 wiki 或文档中的陈旧文档一样永远不会更新,因为随着时间的推移,代码将继续变化和演变。

你好,谢谢。但是看看Calabash UI自动化测试,它提供了更好的文档,我认为是这样的。你看看,事实上,你可以得到简单易懂的英文文档 https://calaba.sh/ - pixel

3
除了Nishants和James的回答以外:使用UI/端到端测试更难针对某些错误条件进行测试。

2
首先,您需要了解单元测试用例和用户界面(UI)测试自动化是两个不同的概念。在单元测试用例中,您会按单元编写测试用例,并逐个模块进行测试——实际上,您正在单独测试每个模块。
另一方面,测试自动化涵盖端到端测试。它测试您的端到端输入及其相应的输出。两者都有各自的优点,因此您需要在产品上同时使用两者,以确保它没有漏洞。让我们通过一个例子更好地理解需要进行单元测试的原因:
您正在构建一个聊天应用程序。对于该应用程序,您正在集成不同的模块,例如登录、注册、发送和接收消息、消息历史记录等。现在,假设有多个开发人员在这个产品上工作:每个开发人员都在不同的模块上工作。在这种情况下,您需要将所有模块加入系统流程中,以完成整个产品。当您集成所有模块时,您会发现该产品无法存储消息。因此,现在您需要独立测试每个模块,因为您无法确定哪个具体模块未正常工作。
为避免这种情况发生,最好在将每个模块合并到其他模块之前对其进行测试。这称为单元测试。如果单元测试执行正确,您将立即发现错误。一旦所有单元测试用例都通过,您就可以开始集成模块了。
通常使用组装线(CI pipeline)执行单元测试。如果您创建了良好的测试策略并编写了最佳的测试用例,则产品通常可以正常工作。流程有点像这样:
- 测试各个模块 - 开始集成和测试每个功能,查看它是否正常工作 - 一旦集成了所有模块,请在产品上运行UI自动化测试用例
最后,如果所有测试用例都通过,那么意味着您的系统已准备好无缝运行。

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