iOS上的UITest轻松完成

我们知道,设计和编写测试并不是世界上最令人兴奋的事情,但是对于您编写的任何应用程序,测试都是绝对必要的。 它们可能是AppStore上闪闪发光的5星级应用程序,或者是漏洞百出的代码集之间的区别。

我们都知道什么是单元测试以及如何编写它们,但是自XCode 7以来,Apple便向我们介绍了其IDE中的UI测试。 通过这些测试,您可以记录用户与应用程序的交互,并检查其是否表现正常。

在本文中,我们将重点关注测试的UI方面,以及如何在iOS应用中记录和编写您的第一个测试。 但是为什么要专注于UI? 您的应用程序可能在后台执行了它需要做的所有事情,并且单元测试可能具有100%的覆盖率,但是对于普通用户来说,如果有什么地方不合适,那么就会出现问题。 通过测试应用程序的用户界面,您可以查看用户与用户界面的交互方式,并检查他们是否看到了应有的样子。 现在,让我们深入研究如何轻松测试UI而不会有任何麻烦。

在开发iOS应用程序时,我们必须首先决定将使用哪种架构。 苹果建议 ,大多数开发人员都使用MVC,但是MVC有其缺点。 我们可能都在某个地方读过或听到过大量的视图控制器笑话 。 可悲的是,在大多数情况下是这样。 当我们不得不将与View或Model逻辑不相关的所有内容放到Controller逻辑中时,控制器中会生成很多代码,而在Model或View中则不会那么多。 让我们快速看一下Viper是什么及其组件。

如果您不熟悉Viper,让我们快速介绍一下。 Viper是View,Interactor,Pentent,Entity和R external的首字母缩写。 这基本上是一种实施“ 单一责任原则”的方法 ,旨在创建一个更清洁,更模块化的结构。 Viper通过具有以下结构来实现此目的:

在上面的插图中,我们可以看到Viper方法以及架构的每一部分如何相互集成。 毒蛇的每个元素都负责完成一项工作,并要求/将任何其他工作发送/发送到负责任的元素。 例如,演示者告诉视图它需要显示什么。 在这种情况下,View的唯一工作就是显示演示者告诉其显示的内容。 为了帮助测试,Viper的每个元素(实体除外)都实现了一个协议,因此您可以轻松模拟类的任何部分并编写零麻烦的测试。 很简单吧? 让我们深入了解Viper的每个主要组件。

视图是被动的,因为它基本上只是等待演示者提供其内容来显示。 它还需要接收来自用户的输入,如果需要处理任何内容,则将其传递给Presenter。 View还具有有关如何显示数据的所有逻辑,例如哪些信息进入UILabel,以及哪些UIImageView将用于显示Presenter发送的图像。

输入想要用于测试目标的名称并创建它。 XCode会将这个新目标添加到您的项目中,并自动创建一个与目标名称相同的新文件。 在此文件中,您将已经创建了一些功能。 在每个测试之前和之后都有setUp()和tearDown()运行,还有一个testExample()。 您可以根据需要删除它们,但是为了简单起见,您可以选择函数testExample()并开始测试。 然后,XCode将允许您通过页面底部的红色圆圈按钮记录测试。

单击它,XCode将构建您的应用程序并启动模拟器。 您在此模拟器上执行的每项操作都将记录并记录在所选功能上。 我为本文创建的页面包含两个元素:UIImage和UIButton。 当我运行记录器并单击两者时,它生成了以下代码:

哇,这是很多用于点击图像的代码,不是吗? UIButton更好,因为它具有文本并且XCode知道如何搜索它,这意味着您可以找到所需的内容。 那么,如何处理图像呢? 嗯,有一个accessibilityLabel可以帮助您在屏幕上找到任何元素。 我将图像的acessibilityLabel设置为profileImage ,这使您的测试代码更易于编写。

开发iOS应用程序时,可访问性标签是您最好的朋友。 它为听力障碍的用户提供了一种导航您的应用程序的方式,还可以帮助您更好地测试UI。

您必须问自己,为什么我首先向您介绍了Viper。 当然,我们所做的测试可以使用MVC进行,但是如果您必须测试应用程序中更深层次的内容怎么办?

由于Viper是如此模块化,因此您可以编写类来考虑测试,从而使它们具有极高的可注入性。 您还可以创建仅用于实例化Viper所有元素的类,您可以在其中注入所需的任何东西。 在我们的示例中,我创建了一个名为ProfileBuilder的构建器,该构建器实例化Viper的所有元素并返回Router元素。

你是对的。 这就是为什么您可以在启动应用程序时传递参数以及在appDelegate中检查这些参数的原因。 这是我的代码在测试和appDelegate中的样子:

您可以并且应该改进您的代码以使其看上去比这更好。 您可以根据需要传递任意数量的参数,并在应用程序委托中检查每个或所有参数。 由于仅在您的配置文件上运行UI测试时才传递此参数ProfileUIITest,因此仅在那时将调用该特定页面。

现在,您对如何进行UI测试有任何初步的了解。 一旦习惯了在项目中使用Viper,就很容易设计它们,当然,这可能需要一些时间,但是这是值得的。 我承诺。 为了加快速度,您可以在此处此处此处查看一些特定于Viper体系结构的文章。 此外,您可以阅读一些专门针对UI测试的文章,Apple还在此处提供了一些见解。 尽管本教程并不完全专注于UI测试,但是学习一些新事物以及理解UI测试为何如此重要的好方法。