单元测试和测试驱动开发(Xcode 8和Swift 3)

使用单元测试时,您将使用代码来测试项目,而不是运行模拟器并浏览应用程序。 在开发时,测试不是必要的做法-但是,如果您设置了良好的测试,它会使构建和重构代码更加安全。

我们可以使用代码测试代码的方法是将函数结果与预期结果进行比较。 因此,如果我们有一个函数返回两个整数的和,则可以给它提供具有预期结果的参数。 因为我们知道2 + 3 = 5…如果函数返回5,则测试将通过,否则测试将失败,并且我们知道需要修复函数。

许多开发人员练习测试驱动开发(TDD)。 TDD涉及在编写与该测试关联的生产代码之前编写测试代码。 在本文中,我将构建一个使用单元测试和TDD的简单项目。

设置项目

要在项目中使用单元测试,需要与主项目建立一个单独的目标。 您可以通过在创建新项目时取消选中“使用单元测试”框来实现。

如果您已经创建了项目,则可以通过在Project Navigator中选择项目 ,选择“ Targets”下的“ +”按钮,然后选择“ iOS Unit Testing Bundle”来创建新目标。

在这两种情况下,Xcode都会创建一个新目录,默认Info.plist和.swift文件。 .swift文件包含一些可以在XCTest框架中使用的函数示例,但是我们将从头开始创建自己的文件。

设置测试.swift文件

为了使事情井井有条,我将为项目中的每个.swift文件创建一个tests.swift文件。 为了说明这一点,我将在项目中创建两个新的.swift文件,然后再创建相应的tests.swift文件。

由于我们在这里进行TDD练习,因此让我们从为Math.swift文件中的代码创建一些测试开始。 我将跳至我的MathTests.swift文件并设置该文件进行测试。

设置tests.swift文件时,您将要导入XCTest框架和包含@testable的项目。 这允许单元测试在您的项目中查找测试中定义的任何类。

接下来,我们将该类定义为XCTestCase的子级。 我还包括一个初始变量和两个函数。 “ setUp”函数在类中的每个测试方法之前被调用,而“ tearDown”在每个测试方法的末尾被调用。 如果需要,您可以进行一些自定义-但在我们的示例中我们将不需要它们。

现在,在编写生产代码之前,我已经以真正的TDD方式编写了测试实现的一部分。 由于我的Math.swift文件没有任何代码,因此测试无法找到它。 因此,让我们转到Math.swift文件并声明该类以解决此问题。

快速构建后,错误已修复! 请记住,由于我们导入了项目,因此可以在项目中使用类声明变量。

编写数学测验

我们想要一个包含3个整数的函数,该函数获取前两个整数的和并将其乘以第三个整数。 由于我们正在练习TDD,因此让我们先编写测试。

这是测试功能的基本结构:

为了在运行测试时调用该函数,名称必须始终以“ test”开头。 这里的函数名为“ testAddAndMultiply”,因为我打算在我的数学类中创建一个名为“ addAndMultiply”的函数。

接下来,我们看到“ XCTAssert”,它实际上是一个函数。 如果表达式的值为true,则测试将通过(false =失败)。 让我们使用一些我们期望在“ addAndMultiply”函数中使用的数字来完成测试。

由于我们是在生产代码之前编写测试,因此会收到一条错误消息,指出方法addAndMultiply不存在。 因此,让我们在Math类中对其进行定义! 我将故意编写此方法,以使其无法通过测试。

现在,该功能已在生产代码中实现,我们可以使用command + U运行测试。 请记住,我们期望这样做会失败,因为我们使用除法而不是乘法来查找乘积。

测试失败时,测试会在红色菱形中显示白色“ x”。 我们可以在XCTAssert函数中添加第二个参数,以在显示错误时帮助测试更具描述性。

因此,测试告诉我们应该是36,但函数返回1。现在,我们对发生了什么问题有了一些了解,我可以修复addAndMultiply函数,然后再次运行测试。

现在测试通过,并在绿色菱形上显示一个白色的对勾!

XCTAssert

XCTAssert具有该功能的许多其他变体,使夜晚的测试变得更加容易。 一切都归结为傻瓜……但如果您愿意,您当然可以使用其他一些选项。

不适用于Action类的另一个测试,并尝试使用其他XCTAssert函数。 随时在我的GitHub上检查项目!

感谢您阅读🙂