iOS自动化测试(一)-技术方案、环境配置与疯狂踩坑

2,587 阅读6分钟

移动端的自动化测试,最常见的就是Android自动化测试,IOS相较于Android要安全稳定的多,但是IOS也是一个需要测试的方向,作为测试,不认真测一下心里还是过意不去,只是我个人觉得Android的测试优先级会更高,当然Android也更开放,更容易测试;今天这里来一起学习记录下iOS自动化测试要如何来做

1、环境准备

  • 硬件环境
    • Macbook Pro(做iOS测试,Mac是绕不开的,我们依赖的软件环境需要运行在Mac上,必须要有一台Mac本;没有怎么办?买一台就有了~)
    • iPhone、iPad:既然测试IOS软件,那iPhone和iPad也自然不用多说了,虽然Xcode里有虚拟机,但是实际测试还是以真机为准
  • 软件环境
    • Xcode:Xcode是苹果官方提供的开发IDE,里面集成了苹果软件开发所需的所有,包括专项的性能测试等,我们做自动化也需要通过它来与设备绑定证书

Xcode下载地址: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地址:github.com/appium/ios-…

  • 将项目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 WebDriverAgengithub地址: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!!!老泪纵横...
  • 最终,再执行
    xcodebuild -project WebDriverAgent.xcodeproj \
               -scheme WebDriverAgentRunner \
               -destination 'platform=iOS,name=iPhone (2)' \
               test
    
    终于在IOS真机上看到了WDA的身影
    在这里插入图片描述

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的实操落地