关键词:XCUITest iOS UI自动化 自动化测试 Mac Swift
1.测试类的基类
创建「XCUITestBase」基于XCTestCase。接下来的UITest用例都基于这个「XCUITestBase」,
可以减少每个用例的代码量,并统一管理setUp和tearDown函数。
接下来的TestHomeTab等测试类都继承XCUITestBase。
2.设置用例执行顺序为随机顺序
在图中的下拉列表中找到「Edit Scheme」,在Test栏目中找到如图选项:
勾选第二个「Random execution order」即可。
3.测试外部App
可启动当前模拟器上已安装app用于测试。需指定bundleId
let app = XCUIApplication(bundleIdentifier: "com.apple.mobilesafari")
app.launch()
_ = app.wait(for: .runningForeground, timeout: 30)
4.查看UI元素树
类似于xpath的查看,能够得到UITest中的元素的具体信息:label、ID、frame等
在编写测试用例时,需要查找元素,执行一系列动作,获取元素并断言。根据上述的查找方式,调试起来其实很麻烦。经过多次尝试,找到了一个非常简便的测试办法。
首先断点进入任意测试方法内部,然后可在lldb中(断点停留的时候的命令行):
po app //查看当前view的所有元素结构
po app.buttons["abc"] //查找你想要的元素
po app.buttons.firstMath.tap() //所执行的动作会即可作用在当前模拟器中,你也可以直接操作模拟器去展现你要的view,在通过lldb去查找元素,调用动作。相当于通过lldb,你可以动态执行测试案例。可以任意操作app,去寻找你想要的元素和动作
这里只需要了解两个lldb命令:
p(print):打印值,比如p app.staticTexts["登录"].exists ,可以得到true/false
po(print object):打印对象。上例中使用的就是po
5.只执行某个用例(比如整体测试的时候失败的用例)
xcodebuild test-without-building \
-workspace PreciousMetals.xcworkspace \
-scheme PreciousMetalsDevUITests \
-destination 'platform=iOS,name=李鹏SuperXperia' \ //真机-destination表示方法,模拟器是iOS Simulator
-only-testing:PreciousMetalsDevUITests/TestHomeTab //甚至可以继续拼接/+指定的函数名称
name 的取值就是手机真机的设置里面的「关于本机」的名字。
二、Xcodebuild 命令与特性
(待续)
1.parallel test:多虚拟机测试
同时开启多个设备进行测试。
每个虚拟机使用独立的数据容器,不使用原始模拟器文件,而是使用生成的模拟器副本。
并行数量worker count=3时,如图效果
平行测试的支持范围:
a. 支持iOS和tvOS的模拟器的UI测试和单元测试
b. 支持macOS的单元测试
2.编译与test过程分离(一次编译,随时测试)
如果软件版本功能相对稳定,短期内需要上线后台服务等。需要多次执行测试。
此时可以只编译一次UITest,然后用到的时候直接测试(不走编译阶段,超级高效!)
为UITest进行build
xcodebuild build-for-testing -scheme tvOS -destination 'platform=tvOS Simulator,id=D6FA2C2A-E297-406A-AA22-624B4834ACB2'
区分build for 模拟器和真机(通过-destination)
例如:
xcodebuild build-for-testing -workspace PreciousMetals.xcworkspace -scheme PreciousMetalsDevUITests -destination 'platform=iOS Simulator,name=iPhone XS,OS=12.1'
不进行build,直接开始测试
xcodebuild test-without-building
例如:
$ xcodebuild test-without-building -xctestrun iOSApp_iphonesimulator.xctestrun -destination 'platform=iOS Simulator,id=6DC4A7BA-EA7F-40D6-A327-A0A9DF82F7F6'