iOS单元测试简介

您最有可能阅读本文,因为您已经听说过有关单元测试的知识,并且想要了解更多。 如果您从未听说过单元测试,并且想要基本介绍,那么您来对地方了。

本文将为您提供单元测试的一般概述,并将讨论单元测试与iOS之间的关系。

什么

如果您考虑一下, 每个复杂的系统都由较小的部分组成。 您的汽车配有发动机,燃油管,油箱,挡风玻璃等。 将这些组件中的每一个组合在一起,就可以构成您的汽车。 您的汽车行驶到任何地方的唯一原因是这些组件中的每个组件都能发挥出色的作用。

单元测试中的“单元”是这些组件之一。

单元测试不仅适用于软件。 它是一个广义的工程术语,可以应用于由零件组成的任何领域,每个领域都需要完成特定的工作。

您可以将汽车拆开并在每个组件上运行诊断程序,以对汽车进行单元测试。 也许您想测试机油滤清器清除某些脏油的能力,或者您想测试气帽上的密封。 每个测试都是一项测试,您可以对组成汽车的各个单元进行测试。

这很有趣。 我已经看到“单元测试”一词在某些我从未期望使用过的领域中得到了应用。 在星际争霸中。

如您所见,这是一个非常广泛的概念。

编写有效的单元测试需要什么

一个好的单元测试需要具备以下条件。

  1. 您正在测试的隔离组件。 如果您一起测试一件事以上,那就是集成测试
  2. 您正在测试的特定行为。 不用说,此行为需要与您正在测试的组件有关。
  3. 成功和失败的条件。 毫无疑问。 在单元测试中,没有什么是部分成功的 。 运行时,每个单元测试必须成功或失败。

这些看起来很简单,但是您通常会发现第一部分具有挑战性。 大多数系统并不是以模块化的方式设计的,因此需要花费一些额外的精力才能有效地隔离不同的组件。

挑战:隔离组件

例如,假设您要在汽车的机油滤清器上进行单元测试。 您不能只是弹出过滤器并对其进行测试。 您必须将其卸下,将机油排入锅中,进行测试,将其放回去,然后再将油放回车中。

如此彻底地测试机油滤清器需要花费大量时间和精力,这就是为什么大多数机油滤清器都是一次性产品。 您只需在一定距离后或在怀疑它们会变坏时更换它们。 他们就像灯泡。 花时间尝试修复它们是浪费。

汽车中几乎每个组件都很难进行单元测试。 您几乎永远都不会在该级别上测试汽车的组件。 实际上,您在汽车上进行的大多数测试都是集成测试。

整合测试

集成测试是将一个或多个组件一起测试的任何测试。

当您测试汽车将清洗液输送到挡风玻璃的能力时,您正在执行集成测试。 您可以同时测试清洗液泵,清洗液管线和喷涂机机构。

除非有严重的故障,否则任何理智的人都不会花费时间或精力单独测试这些组件。 将系统分解并重新组合在一起会花费太多时间。

这个类比并没有完全映射到软件领域,但是有一个重要的考虑因素。 设计这样一个易于分解的系统需要花费额外的精力。 无论是汽车,软件还是星际争霸战,您都需要考虑这一成本。

大多数汽车都不容易进行单元测试,因为单元测试不是其设计的核心。 汽车公司不希望您一直保持汽车所有零件的良好维护。 实际上,他们希望这些组件中的许多组件会在经过数英里后失效。

使用软件,您具有成为设计师的优势。 您可以选择是否值得让您的应用程序更具模块化,从而更易于进行单元测试。

这样做必然带来额外的费用。 但是,如果成本可以被某些收益所抵消,那么您的设计将物有所值。

为什么

最终, 您应该编写单元测试以节省时间和金钱。 就像任何企业一样,您现在投资一些时间或金钱,并且在此后的投资中获得更大的回报。

您如何在项目的整个生命周期中节省更多时间? 这取决于许多因素。 最大的问题之一是您需要多长时间测试一次应用程序的所有功能。 您需要交付应用更新的频率决定了这一点。

如果您计划发布很少定期更新的独立产品,则无需经常测试其所有功能。 在后续发行之间,您可能一次要花费数年时间。 在这种情况下,每当需要进行更新时,手动测试所有内容可能更有意义。

其他类型的软件产品需要近乎恒定的维护和支持。 想到用户登录并完成工作任务的企业系统,或者可能是社交网络。 这些产品的发布时间表非常频繁,因此总体上需要进行更多测试。

如果您发现自己一遍又一遍地手动测试相同的逻辑,则可能希望将某些手动测试替换为自动测试。

很难确切地说出您何时需要执行此操作,但是有一定的感觉。 肚子上会有个坑告诉你, 呃,不再是这个了

我对其中一个应用程序具有多人游戏功能有这种感觉。 迫切需要自动化测试。 每次我推送更新时,我都会花费数小时来测试该功能。 为了我自己的理智,我想停止支付那笔通行费。

单元测试可以提高整体质量

软件质量是单元测试的另一个“原因”。 具有更多自动化测试的应用程序往往具有更少的错误 。 当您进入测试心态时,您开始考虑更多代码可能行为不当的方式。 它迫使您在计划方面变得更好。

话虽如此,您应该始终设置一个较高的标准,并且应该始终使用某种方式来测试功能是否正常运行(自动还是手动)。 您可以通过手动测试获得同样高的质量,但是如果您一遍又一遍地运行它们,则长期来看会浪费大量时间。

自动执行频繁的任务比较便宜。 您不会搅动自己的黄油或手动洗衣服(至少在第一世界中不会)。 测试同样如此。 如果某些手动测试成为常规操作,请考虑使它们自动化。

怎么

有很多方法可以对iOS应用程序进行单元测试,以至于无法在一篇文章或一本书中涵盖所有这些应用程序。 las,我将参考该标准。 Xcode具有单元测试功能,尽管与Web开发相比有点慢,但是效果很好。

这是开始在iOS中进行单元测试所需要做的一切

  1. 添加一个单元测试目标。 单元测试目标是运行单元测试的,具有单一用途的独立可执行文件。 当您将应用程序运送到App Store时,不包括此测试目标。 尽管不建议这样做,但是您可以在此目标中遇到编译器错误或错误,并且不会影响您交付给App Store的产品。
  2. 将您的应用程序或框架模块导入到单元测试目标中。 Xcode有一个方便的import语句,使它变得整洁。 您不需要像以前那样在单元测试目标中赋予所有文件成员资格。
  3. 编写测试并在Xcode中运行它们。 您可以在一个地方编写和运行测试。 只需按命令U,然后查看通过或失败的内容。

这里还有很多要讨论的内容,这就是为什么我在另一篇文章中进行讨论。 我只是想向您展示,单元测试并不是什么毛茸茸的大怪物。 任何人都可以在短短几分钟内开始编写它们。

下一步是什么?

如果您只是走这条路,请查看我的文章,了解如何开始使用iOS中的单元测试。 它为您提供了快速简单的教程,以使您掌握基础知识。

您可能还需要查看其他一些文章。 如果您还没有猜到,那么本出版物的大部分内容都集中在iOS的单元测试上。 我正在写有关该主题的书。

更多文章

  • 教程:如何在iOS中对私有方法进行单元测试
  • 我们应该在iOS应用程序中进行哪些单元测试?
  • 如何编写单元测试而不公开所有内容