移动端的自动化测试,最常见的就是Android自动化测试,IOS相较于Android要安全稳定的多,但是IOS也是一个需要测试的方向,作为测试,不认真测一下心里还是过意不去,只是我个人觉得Android的测试优先级会更高,当然Android也更开放,更容易测试;今天这里来一起学习记录下iOS自动化测试要如何来做
1、环境准备
- 硬件环境:
- Macbook Pro(做iOS测试,Mac是绕不开的,我们依赖的软件环境需要运行在Mac上,必须要有一台Mac本;没有怎么办?买一台就有了~)
- iPhone、iPad:既然测试IOS软件,那iPhone和iPad也自然不用多说了,虽然Xcode里有虚拟机,但是实际测试还是以真机为准
- 软件环境:
- Xcode:Xcode是苹果官方提供的开发IDE,里面集成了苹果软件开发所需的所有,包括专项的性能测试等,我们做自动化也需要通过它来与设备绑定证书
Xcode下载地址:https://developer.apple.com/download/
下载安装好的图标如下
2、技术方案
2.1 主流框架
先来看目前主流的IOS移动测试框架
- Appium:目前最常用的APP自动化测试框架,具备跨平台性
- Calabash-IOS :BDD模式,没有过多的了解使用
- KIF:KIF 使用 XCTest 框架,需要对Objective—C 、Swift和 XCTest掌握程度较高,这个对测试工程师来说学习成本太大
- XCTest:苹果官方提供的iOS测试框架,要求同KIF一致
- WebDriverAgent:由Facebook 推出的一款iOS移动测试框架,也是appium跨平台的底层驱动;WDA本身也是一个完整的基于webdriver协议的框架
- Uiautomation :在xcode8后废弃
2.2 方案选型
之前的Android自动化我们选择的是appium
框架作为底层的驱动框架,当时就介绍说appium的优点之一就是跨平台性,其实也就是因为其底层封装了WebDriverAgent
,而我们期望的是:
- 做一套可以跨平台支持的app测试方案,可以在公司的Android和iOS版本间自由切换测试
- 并且在编程语言上要是测试工程师常用的Java或Python,降低学习成本
综上原因,那么最终的选择依然是appium
。
3、落地实践(踩坑)
3.1 App安装
appium官方提供了一个演练的IOSApp,以此为例进行演示:
appium演练example地址:https://github.com/appium/ios-uicatalog
- 将项目clone到本地后用Xcode打开,注意打开IOS项目要打开以
.xcodeproj
结尾的文件
- 插入真机,Xcode上选择真机,在Singing中添加AppleID作为account,生成一个本地的
Provisioning Profile
和设备上的证书
踩坑:你可能会遇到如下的错误信息Failed to create provisioning profile. The app ID "com.appium.apple-samplecode.UICatalog" cannot be registered to your development team. Change your bundle identifier to a unique string to try again. Provisioning profile "iOS Team Provisioning Profile: *" doesn't include the currently selected device "Uzumaki的 iPhone".
这是因为你的bundle identifier
不唯一导致,将其修改自定义为一个唯一的bundle identifier
再尝试即可
- Xcode中选中
Build
,Success后在手机中我们可以看到UICatalog
已经被成功安装,尝试打开:
踩坑: 苹果对未在AppStor中上架的App做了限制,默认不受信任,所以我们需要手动将其设置为信任:
设置-通用-描述文件与设备管理
- 这个时候再打开App,就可以正常操作运行了
3.2 环境配置
- 上面介绍了这里是选中appium作为移动测试框架,因此appium相关环境的安装必不可少,具体安装细节可参考另一篇博客:Windows(Win10)、Mac下安装appium
- 另外还需要几个辅助测试工具和命令
- 依赖工具包安装:
brew install --HEAD ideviceinstaller brew install --HEAD libimobiledevice
- 查看模拟器列表:
instruments -s devices
运行结果如下,可以看到最前面两行显示的其实是本机的Mac和连接的iPhone真机,剩下的是模拟器
$ instruments -s devices Known Devices: user的MacBook Pro [A6791A60-C973-5E1F-AB56-60Cxxx1D8C8E] iPhone (2) (12.4.1) [aa3c395a15b4edcc21c4df8f01xxx7ffc307e61f] Apple TV (13.3) [5B058A91-DF96-4F33-A0AC-EBFB380261F8] (Simulator) Apple TV 4K (13.3) [A8902607-CECF-41D2-B9A2-27BA5F071C5A] (Simulator) Apple TV 4K (at 1080p) (13.3) [BE620E4C-47CA-4440-B612-EA7429882325] (Simulator) Apple Watch Series 4 - 40mm (6.1.1) [5F4AA1E1-4E6F-444A-9415-E82677D217D7] (Simulator) Apple Watch Series 4 - 44mm (6.1.1) [F8F72C70-308C-4466-AD21-2C08D0A992E9] (Simulator) iPad (7th generation) (13.3) [A942CAE8-1174-4750-BE5A-BFB53CEB1750] (Simulator) iPad Air (3rd generation) (13.3) [09E7731F-5671-4025-8600-B54849071FCD] (Simulator) iPad Pro (11-inch) (13.3) [FD89E91B-C186-45C8-B3E2-28163DCE28E0] (Simulator) iPad Pro (12.9-inch) (3rd generation) (13.3) [F52FFEE6-3924-43E4-B3F4-01B0924984D0] (Simulator) iPad Pro (9.7-inch) (13.3) [F80CDE6E-7D71-4DD2-A6ED-75A369F34448] (Simulator) iPhone 11 (13.3) [7EE01CD6-A04C-48B0-B4E1-A07656DCBD0B] (Simulator) iPhone 11 Pro (13.3) [0F9B4876-6730-412A-BDB1-2B7385D1269E] (Simulator) iPhone 11 Pro (13.3) + Apple Watch Series 5 - 40mm (6.1.1) [ADD82DF7-23F7-4AD0-843F-9BAD6DE5F451] (Simulator) iPhone 11 Pro Max (13.3) [9E0FC67A-13D6-4626-8DAD-1393E0E2CFBA] (Simulator) iPhone 11 Pro Max (13.3) + Apple Watch Series 5 - 44mm (6.1.1) [B66BF964-2965-4B67-96D9-5828E98CE25B] (Simulator) iPhone 6s (13.3) [36540FE6-A996-403E-AA2C-1DBE74F67E88] (Simulator) iPhone 8 (13.3) [C8A32676-39BA-4EB0-99A0-7C2C8F91A85E] (Simulator) iPhone 8 Plus (13.3) [9B9BC775-9D0E-4B39-B25E-1EC75E289A00] (Simulator)
- 查看真机列表:
idevice_id -l
$ idevice_id -l aa3c395a15b4edcc21c4df8f0182a7ffc307e61f
- 安装App:
ideviceinstaller -i demo.app
- 命令行编译(在做持续集成时候可能会用到):
xcodebuild -scheme UICatalog -target iOS clean build xcodebuild -scheme UICatalog -target iOS archive
3.3 WebDriverAgent的安装与启动
- 虽然appium使用WDA作为底层的iOS自动化框架,但是由于版本的更新等原因,可能造成appium本身自带的WDA会有bug,因此为了保险起见,先手动下载facebook的
WebDriverAgent
facebook
WebDriverAgen
github地址:thttps://github.com/facebookarchive/WebDriverAgent$ git clone git@github.com:facebookarchive/WebDriverAgent.git Cloning into 'WebDriverAgent'... remote: Enumerating objects: 18311, done. remote: Total 18311 (delta 0), reused 0 (delta 0), pack-reused 18311 Receiving objects: 100% (18311/18311), 15.69 MiB | 7.00 KiB/s, done. Resolving deltas: 100% (6810/6810), done.
- 然后我们进入
WebDriverAgent
进行编译,在Scripts
下有一个bootstrap.sh
脚本,执行它即可
小技巧: 使用bash -x
命令可以输出更详细的执行过程
踩坑: 安装最后我们可以看到部分依赖安装需要安装Carthage
这个东西,如果没注意的话就会造成RoutingHTTPServer
部分文件缺失,后面build
就会报错
通过命令Test session results, code coverage, and logs: /Users/qinzhen/Library/Developer/Xcode/DerivedData/WebDriverAgent-euroowhgzlpucmekkhluceevrkdj/Logs/Test/Test-WebDriverAgentRunner-2019.12.17_13-59-10-+0800.xcresult Testing failed: 'RoutingHTTPServer/RoutingConnection.h' file not found 'RoutingHTTPServer/RouteResponse.h' file not found 'RoutingHTTPServer/RouteResponse.h' file not found Testing cancelled because the build failed. ** TEST FAILED **
brew install carthage
安装后再执行./Scripts/bootstrap.sh
即可 - 根据
WebDriverAgent
官网提供的步骤,将参数替换为我们真机的参数后在真机上尝试build
踩坑: 执行完命令后可能会出现如下报错xcodebuild -project WebDriverAgent.xcodeproj \ -scheme WebDriverAgentRunner \ -destination 'platform=iOS,name=iPhone (2)' \ test
从报错信息来看,缺少$ xcodebuild -project WebDriverAgent.xcodeproj \ > -scheme WebDriverAgentRunner \ > -destination 'platform=iOS,name=iPhone (2)' \ > test 2019-12-17 09:20:29.973 xcodebuild[30451:2032814] DTDeviceKit: deviceType from aa3c395a15b4edcc21c4df8f0182a7ffc307e61f was NULL 2019-12-17 09:20:30.026 xcodebuild[30451:2032862] DTDeviceKit: deviceType from aa3c395a15b4edcc21c4df8f0182a7ffc307e61f was NULL ... //中间内容省略 Testing failed: Signing for "WebDriverAgentRunner" requires a development team. Select a development team in the Signing & Capabilities editor. Testing cancelled because the build failed. ** TEST FAILED **
development team
,那么我们回到Xcode,将Automatically manage signing
进行勾选后选择一个Team,注意要进入WebDriverAgentRunner
中进行设置
设置好之后又会出现报错,如下:
这个报错信息就和我们之前提到的一样,bundle indentifler
不唯一,保险起见,这里将项目中所有的Targets都进行了修改 - 修改好之后我们再次build,之前的问题解决了,不幸的是build又fail了,又出现了新的报错:
Semantic issue: 'assign' property of object type may become a dangling reference; consider using 'unsafe_unretained' Parse Issue: Could not build module 'RoutingHTTPServer'
幸运的是在Google上一位外国友人轻描淡写的一句话解决了我的问题(感谢外国友人~)
没错,我们在报错出双击,进入到报错代码处,将assign
改为strong
后再次build
Build succeeded!!!老泪纵横… - 最终,再执行
终于在IOS真机上看到了WDA的身影xcodebuild -project WebDriverAgent.xcodeproj \ -scheme WebDriverAgentRunner \ -destination 'platform=iOS,name=iPhone (2)' \ test
4、踩坑补充
上面是我所经历的各种坑,也都是我实测过一步步填平的,下面试我认识的小伙伴踩到的坑和填坑方法,作为补充供记录参考
1)执行./Scripts/bootstrap.sh ERROR in ./js/app.js
报错
cd
/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgen # js
vi
webpack.config.js
2)执行时候报xcodebuild failed with code 65
错误
5、最后
花了很大的功夫和篇幅,记录iOS自动化的准备工作,踩了很多坑,坑不能白踩,后面继续实现iOS的自动化测试落地,欢迎小伙伴来一起探讨:iOS自动化测试(二)-基于appium的实操落地