欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Xcode 7和Swift 2的测试进展

程序员文章站 2024-03-24 08:54:16
...

在iOS的早期,促进测试的工具并不是Apple开发人员工具团队的主要重点。 多年来,随着XCTest框架的引入以及最近对异步和性能测试的支持,这种情况已逐渐改变。

借助Xcode 7和Swift 2,Apple在改善Xcode测试方面又迈出了一大步。 在本教程中,我将向您介绍三个重要的补充,这些补充将使测试更容易,更有趣。

1.访问控制

在Swift 1中,开发人员必须跳很多圈来测试他们的代码。 例如,一个单元测试目标只能访问另一个模块的公共实体。 如果您熟悉Swift的访问控制,这并不奇怪。 但是,测试内部例程变得很痛苦。

Apple的Swift团队意识到了这个问题,因此,Swift 2引入了@testable属性,以@testable测试的@testable 使用@testable属性,单元测试目标可以访问另一个模块的每个内部实体。 以下代码段显示了如何使用@testable属性。

@testable import AnotherModule

让我们创建一个简单的项目,看看它如何工作。 打开Xcode 7,基于Single View Application模板创建一个项目,然后勾选标为Include Unit Tests的复选框。

Xcode 7和Swift 2的测试进展

为了展示@testable属性的工作原理,我实现了一个名为User的结构。 它具有两个存储的属性firstNamelastName ,以及一个私有的计算属性fullName

import Foundation

struct User {
    var lastName: String = ""
    var firstName: String = ""
    
    var fullName: String {
        get {
            return firstName + " " + lastName
        }
    }
}

因为我们没有为fullName计算的属性指定访问级别,所以它的访问级别是internal 如果我们要对fullName进行单元测试,则可以将其标记为public 这不是很好,它违背了Swift的访问控制的目的。

幸运的是,Swift 2使用@testable属性解决了这个问题。 以下代码片段显示了如何使用@testable属性。 通过使用@testable属性为import语句添加前缀,我们可以在testFullName方法中访问User结构的fullName属性。

import XCTest
@testable import Testing

class TestingTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
    }
    
    override func tearDown() {
        super.tearDown()
    }
    
    func testFullName() {
        var me = User()
        me.firstName = "Bart"
        me.lastName = "Jacobs"
        
        XCTAssertEqual(me.fullName, "Bart Jacobs", "The full name should be equal to \"Bart Jacobs\".")
    }
    
}

请注意,文档中明确指出, @testable属性仅在产品启用了测试的情况下编译才能@testable 换句话说,您不能也不应将@testable属性用于测试以外的目的。

2.代码覆盖率

如果您正在测试编写的代码,那么您将走上正确的道路。 但是,了解您编写的测试如何覆盖您认为覆盖的代码也同样重要。 尽管以前版本的Xcode在某种程度上已经支持代码覆盖,但是使其工作始终有些棘手。 Xcode 7不再是这种情况。

我不想向您展示一堆屏幕截图,而是向您介绍在Xcode项目中启用代码覆盖的相关步骤。 让我们以几分钟前创建的项目为例。

要启用代码覆盖,我们只需要编辑活动方案。 点击左上方的方案,然后选择编辑方案...。

Xcode 7和Swift 2的测试进展

要启用代码覆盖率,请从左侧选择“ 测试” ,然后勾选标记为“ 收集代码覆盖率”的复选框。 而已。 如果您尝试在早期版本的Xcode中启用代码覆盖,那么我相信您很高兴看到在Xcode 7中启用代码覆盖有多么容易。

Xcode 7和Swift 2的测试进展

通过按Command-U或从Xcode的“ 产品”菜单中选择“ 测试”来运行单元测试。 测试完成运行后,打开右侧的“报告导航器 ”,然后选择顶部的“ 覆盖率”选项卡。 这说明您的单元测试覆盖了您编写的代码的程度。

Xcode 7和Swift 2的测试进展

看来我们已经很好地完成了对User结构的单元测试。 它会变得更好。 您在方法名称后面看到小箭头了吗? 如果单击它,Xcode将带您到已测试单元测试的源代码。 因为Xcode已经收集了coverage数据,所以它也可以在源代码编辑器中显示该coverage数据。

覆盖率数据显示在源代码编辑器的右侧。 右侧装订线中的数字表示单元测试触发该特定例程的频率。

Xcode 7和Swift 2的测试进展

测试期间未执行的代码将突出显示。 这对于编写更好的测试以及提高测试套件的代码覆盖率非常有用。

3. UI测试

Xcode 7最令人期待的功能之一就是用户界面测试的集成。 过去,我曾与KIFUI Automation合作过,但是我对这两种解决方案都不满意。 Xcode的UI测试看起来像我们许多人一直在等待的解决方案。

XCTest框架

Xcode 7中的用户界面测试通过添加三个类XCUIApplicationXCUIElementXCUIElementQuery扩展了苹果健壮的XCTest框架。 为了简化用户界面测试的创建,Xcode 7提供了记录测试的功能。 如果您曾经使用过Apple的UI Automation ,那么这是一项非常强大的功能,可能有些人已经熟悉了。

与UI自动化一样,Xcode的用户界面测试在很大程度上依赖于可访问性。 因此,花费时间使残障用户更容易访问您的应用程序比以往任何时候都更加重要。

Xcode 7和Swift 2的测试进展

请注意,UI测试仅在iOS 9和OS X 10.11上可用。 苹果公司强调单元测试和用户界面测试是相辅相成的。 换句话说,选择一个或另一个都不是问题。

尽管为应用程序创建用户界面测试很容易,但是您并不希望针对每种可能的情况或用例编写UI测试。 首先关注常见关键的用例,例如用户入职。

测试报告

测试报告也大大改善。 我最喜欢的新测试报告是为失败的UI测试添加屏幕截图。 除了错误消息,当UI测试失败时,Xcode还会为应用程序的用户界面拍摄快照。 这使查找和解决问题变得非常容易。

在我们的Swift快速测试课程中了解更多信息

如果您想了解有关使用Swift和XCTest框架进行测试的更多信息,那么我鼓励您看一下Derek Jensen的有关使用Swift和XCTest进行单元测试的课程。

结论

随着Xcode 7的发布,Apple付出了很多努力来改善测试和调试。尽管集成的代码覆盖范围很广,但增加用户界面测试将产生更大的影响。

我希望这个简短的概述能激发您对Xcode 7进行测试的兴趣。我们将在以后的教程中更详细地介绍这些新功能。

翻译自: https://code.tutsplus.com/tutorials/advances-in-testing-with-xcode-7-and-swift-2--cms-24469