Xcode中的单元测试

415 阅读2分钟

在我们实际开发中,是比较少会使用Xcode提供的框架写测试用例的,所以这里只是简单介绍一下。

1. 使用UnitTest来做单元测试

可以在Xcode新建项目时或者在target处去添加这个功能,具体使用可以参考文章 t.zoukankan.com/fengmin-p-5…

image.png

2. 使用Code Coverage查看单元测试的代码覆盖率

在上述单元测试的情况下,还可以通过Code Coverage查看单元测试的代码覆盖率。 image.png 具体使用可以参考文章 t.zoukankan.com/fengmin-p-5…

3. UITest测试

通过UIAutomation来完成自动化UI测试,它的测试用例是javascript写的(Instruments中提供了该功能),这个过程深奥繁琐,需要自行编写对应的测试脚本,速度慢,学习成本高。 Xcode 7 Apple提供了UITest框架,这个主要是用来测试UI的,UnitTest涌来测试功能逻辑代码,UITest专门用来测试UI。 具体使用可以参考文章 t.zoukankan.com/fengmin-p-5…

4. 可能会遇到的问题

  1. 有趣的是,如果我们项目使用cocoapods来继承的,我们没办法运行单元测试,这个时候我们需要再podfile中添加
  target '单元测试target名' do
    inherit! :search_paths
  end
  target 'UI-单元测试target名' do
    inherit! :search_paths // 明确指定继承于父层的所有pod,默认就是继承的
  end
  1. 在我们运行UItest的时候可能会遇到错误 test运行失败的问题,报错:The bundle “XXXXUITests” couldn’t be loaded. Try reinstalling the bundle 解决办法: 第一步:修改test的target对应的depolyment编译设置跟项目target一样。 第二步:修改项目的podfile文件, 正确的是如下样式: 关键:DemoUITests和use_frameworks!不在同一层级
platform :ios, '11.0'
target 'Demo' do
  use_frameworks!
  pod 'Masonry'

  target 'Demo_Tests' do
    inherit! :search_paths
  end
end

target 'DemoUITests' do
  inherit! :search_paths
end

第三步:重新pod一下就好了

  1. 上述问题解决了之后,系统自动添加的UItest是可以运行的,对于我们自己手写的test方法中通过点击红点recording后Xcode生成的代码却不能运行,报错UserInfo={NSLocalizedDescription=Application org.cocoapods.demo.Demo is not running}: Application org.cocoapods.demo.Demo is not running 生成UItest代码.png

这个时候我们应该在自动生成的代码中添加一句app.launch() ,如下

    func testalert() {

        let app = XCUIApplication()
        app.launch() // 这句是手动添加的
        app.buttons["Toast-纯文字"].tap()
        app.buttons["Sheet"].tap()
        app.buttons["common icon close"].tap()
        app.buttons["Toast-成功"].tap()

    }
  1. 性能测试设置基准线 No baseline average for Time. test的一个用例失败.png

如果需要进一步了解并实践,可以了解这篇文章 juejin.cn/post/684490… iOS单元测试简介和使用