iOS-UI自动化-Apple-XCUITest技术

        前提:测试的App基于iOS 9.3 以及之后的系统版本,Xcode软件版本不低于7,才可以使用该技术,UI Testing 在易用性上比 KIF 这样的框架要有所进步,随着 UI Testing 的推出,Apple 也将原来的 UI Automation 一系列内容标记为弃用。这意味着 UI Testing 至少在今后一段时间内将会是 iOS 开发中的首选工具。但是我们也应该看到,基于 Accessibility 的测试方式有时候并不是很直接。在这个限制下,我们只能得到 UI 的代理对象,而不是 UI 元素本身,这让我们无法得到关于 UI 元素更多的信息 (比如直接获取 UI 元素中的内容,或者与 ViewController 中的相关的值),现在的 UI Testing 在很大程度上还停留在比较简易的阶段,适合保证App的主流程的顺畅运行、用于回归测试。在技术探索过程中,发现测试脚本在iOS 11系统表现很好,但是在iOS 9等系统上会出现找不到按钮的情况等问题。随着iOS系统版本的推进,相信XCUITest技术的兼容性、性能会不断得到改进。

    PS: 首先请允许我宣传一波,iOS的UI自动化测试,我还没见过速度更快更稳定的UI自动化技术,这毕竟是Apple官方主导的,每年都会提升的测试技术。一个算不上缺点的缺点:需要了解些Swift等iOS编程知识,但是现在的Swift、Python、Kotlin等现代化的语言都很容易入门了,不用担心,况且实现UI自动化的脚本不会涉及太多语言上过深的知识。


一、给已有的Xcode源码工程添加UITest功能:

1.在项目中新建UITest模块

(1)如果是新建空白项目,可以勾选Include UITest相关选项。

(2)如果是已有项目(比如pull下来的完整的iOS客户端代码),在Xcode中点击File->New->Target

如图选择:

一、给已有的Xcode源码工程添加UITest功能:

1.在项目中新建UITest模块

(1)如果是新建空白项目,可以勾选Include UITest相关选项。

(2)如果是已有项目(比如pull下来的完整的iOS客户端代码),在Xcode中点击File->New->Target

如图选择:


1

点击Next,进入选项配置:

第一步:选择Project。

第二步:选择最底部的Target to be Tested,这里选择Dev结尾的包,因为该包在模拟器上测试不需要签名。

此时Product Name会根据选项自动生成。切换自己需要的语言(Objective-C、Swift(推荐))

完成。


2

此时,项目中增加了新的以[Target+UITest]命名的文件夹,如图:

当前选中的与文件夹同名的(UITests结尾)文件就是我们可以编写测试代码的文件了。

点击Next,进入选项配置:

第一步:选择Project。

第二步:选择最底部的Target to be Tested,这里选择Dev结尾的包,因为该包在模拟器上测试不需要签名。

此时Product Name会根据选项自动生成。切换自己需要的语言(Objective-C、Swift(推荐))

完成。

此时,项目中增加了新的以[Target+UITest]命名的文件夹,如图:

3

当前选中的与文件夹同名的(UITests结尾)文件就是我们可以编写测试代码的文件了。


二、常用基本操作

1.点击某个按钮,比如登录按钮

app.buttons["登录"].tap()

2.普通输入框输入文本

app.textFields["手机号"].tap()    //要先聚焦文本框,才能继续输入

app.textFields["手机号"].typeText("13038865629")

注意密码输入框等输入文本会变成小圆点的地方使用app.secureTextFields["密码"]。

3.下拉刷新

app.swipeDown()

4.滚动查看屏幕下方的内容,上拉加载更多

app.swipeUp()

也可以左右滑动切换页面:app.swipeLeft/Right()

5.切换tab

app.tabBars.buttons["首页"].tap()

app.tabBars.buttons["行情"].tap()

6.让应用程序等待一会(比如数据载入的时候,或者延时操作)

sleep(3) //单位是秒

7.判断元素是否存在

if app.buttons["确定"].exists {

//点击确定按钮

}

8.使用断言来验证App界面的状态

XCTAssert(app.buttons["个人中心"].count ==  1)

 //count属性表示符合查询条件的结果个数

9.从导航栏返回上级页面

app.navigationBars["消息中心"].buttons["返回"].tap()

10.使用正则匹配,操作列表元素(进阶)

let addButton = app.tables.cells.matching(NSPredicate(format: "label CONTAINS %@", "铜")).element(boundBy: 0)

addButton.tap()

//NSPredicate(format: "label CONTAINS %@", "铜")  --  筛选包含‘铜’字的文本

//element(boundBy: 0)  --  查询结果的第一个元素,该页面结果显然是唯一的,这种情况下可以使用firstMatch属性来代替,提升效率。


三、通过命令行执行UI自动化测试

做平台集成需要了解的知识

首先进入项目中包含PreciousMetals.xcproject文件的文件夹下,然后执行:

xcodebuild test -workspace PreciousMetals.xcworkspace -scheme PreciousMetalsDevUITests -destination 'platform=iOS Simulator,name=iPhone X,OS=12.0'

-workspace参数: 项目的工程文件,和使用xcode打开客户端项目时双击的文件是同一个。

-scheme参数:使用的配置或者方案,就是测试哪个目标,测试过程有什么代码覆盖等要求都可以在scheme中配置。

-destination参数可以指定多个,从而实现一个命令执行多个模拟器的兼容测试。


四、测试报告的优化

1.优化测试报告的可读性(层级关系),同时改进了源码可读性。

XCTContext.runActivity(named: "测试直播间内 - 子Tab切换", block: { _ in

            app.otherElements["策略"].tap()

            app.otherElements["提问"].tap()

            app.otherElements["介绍"].tap()

            app.otherElements["节目"].tap()

            app.otherElements["直播"].tap()

        })

效果图:控制台输入,即为

控制台输出的UITest日志

可以看到Activity是有层级的。

每个动作还会有完成该动作的具体过程,比如下图中的绿色部分,就是输入浏览器URL这个动作的具体过程:


log 分析

2.增加指定元素的截图到结果集:

XCTContext.runActivity(named:"收集一波关键截图") {  activity  in

            //捕捉第一个cell的截图

            //也可以使用XCUIScreen.main.screenshot()来捕捉一张全屏幕截图

            let  cell =  app.cells.element(boundBy:0)

            let cellAttachment =  XCTAttachment(screenshot:  cell.screenshot())

            cellAttachment.lifetime =  .keepAlways

            activity.add(cellAttachment)

}


这是很好用很高效的官方测试技术,希望愿意认识swift等iOS语言的测试人员来交流使用。


下一篇:

XCUITest技术进阶

//www.greatytc.com/p/e6df6c6024ac

番外篇:

//www.greatytc.com/p/ee8f937ae9a5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容