iOS测试的一些有用的提示和技巧

在为iOS开发的那些年里,我一直不愿意在我的应用程序上使用测试。 我不认为这是必要的,并且还认为这样做会浪费我的大量开发时间。 但是,反复进行手动测试和错误修复使我有了新的工作机会。

结果不只是正面的,但我不得不承认,开始并不容易。 由于这是进行开发的一种新方法,因此在编写代码之前,我们必须更改思维方式。

在这篇文章中,我将告诉您我们如何在LateralView中工作,为我们开发的应用程序创建测试。

工具类

Xcode有自己的框架来编写测试,但是我更喜欢使用一个友好的库来促进BBD。 它的名字叫Quick,它是Swift和Objective-C的一个行为驱动的开发框架。

我用于测试创建的另一个工具是OHHTTPStubs,这是一个旨在非常轻松,非常有用地对网络请求进行存根的库。

要测试什么?

添加到模型中的每个功能都是测试的目标。 特别是,我喜欢从用户的角度测试动作的完整行为。 这就是BDD所讲的,这也是我创建测试所依赖的过程。 按照这个原则,我不会测试激活按钮的特定功能,而是在用户按下按钮后测试应用程序的最终状态。

改变我们开始开发应用程序功能的方式非常重要。 总是最好:

  1. 编写测试
  2. 执行测试
  3. 等待测试失败(因为尚未编码解决方案)
  4. 编码解决方案
  5. 为测试编写足够的代码以使其正常工作

如我之前所说,BDD的主要思想是测试应用程序的行为。 这意味着我们将不匹配函数的结果或模型对象的属性。 相反,我们将专注于为用户提供可见和有形的元素。 我们将根据用户在应用程序上的实际响应以及响应后的最终状态进行测试。

斑点结构

BDD为编写测试提出了一种更具叙述性的语法。 第一组测试是Spec,通过使用Quick,其结构如下:

对于测试用例的语法,更重要的块是describebeforeEach它的功能是代表接受标准以验证所需的最终状态。

describe块使我们可以指定场景并将测试序列分组。 例如,可以将它们分组,因为它们共享相同的初始设置。 此设置可以写在另一个重要的块中: beforeEach ,这是将在每个代码之前执行的代码,并包含第一个describe所包含的describe块。 有关“快速”功能的更多信息,请转到“带有快速示例和示例组的有组织的测试”。

期望功能是负责验证期望结果的功能,它将向我们显示测试是否成功。 如果您想了解更多关于Expect函数的用法,请查看Nimble的github。

一个例子

在此示例中,产品所有者请求一个带有电子邮件和密码输入的登录屏幕。 它应确认电子邮件有效,否则应在标签中显示错误消息。 它还具有一个导航到“注册”屏幕的按钮。 这是一个非常基本的示例,但足够有趣,可以从测试和BDD领域入手。

beforeEach块(1)中,我们编写代码以初始化将要测试的导航控制器和视图控制器。

第一个测试是应该显示错误消息的测试,如描述所指示(2),我们模拟用户按下登录按钮而不填写电子邮件字段。 然后,在it块(3)中,我们使用断言来演示应用程序的行为。 在此示例中,我们希望标签的文本等于“无效的电子邮件”。

另一个简单的示例是测试,该测试包括在发生某些情况后导航到另一个屏幕。 在这种情况下,我们希望应用程序在用户按下注册按钮(4)之后进入注册屏幕。 为此,我们在beforeEach函数中模拟按钮的TuchUpInside事件。 在it块中,我们必须使用类匹配器beKindOf断言topViewController等于期望的类( SignUpViewController )。 但是,匹配器equalTo在这种情况下无效,因为最后一个匹配器立即进行比较。 众所周知,导航需要一些时间。 为了解决这个问题,我使用了特殊的Nimble匹配器toEventually ,它对异步更新的值有期望,因此,当topViewController类更改为所需的值时,它将通过测试。

运行测试( + U),它将在每次测试中失败。 现在,您应该编写解决方案了!

加起来!

这篇文章的主要思想是,这是在应用程序中使用测试的开端,并提供了一个简单但真实的示例。 在以后的文章中,我们将对TableViewControllers以及使用OHHTTPStubs的HTTP请求进行测试。