Appium 从 0 到 1 搭建移动 App 功能自动化测试平台 (1):模拟器中运行 iOS 应用

debugtalk · 2016年05月21日 · 最后由 aiyanyuan 回复于 2017年10月30日 · 5664 次阅读
本帖已被设为精华帖!

上一篇文章中,我对本系列教程的项目背景进行了介绍,并对自动化测试平台的建设进行了规划。

在本文中,我将在已准备就绪的 iOS 自动化测试环境的基础上,通过 Appium 调用模拟器运行 iOS 应用。内容很是基础,熟悉的同学可直接略过。

iOS 应用安装包的基础知识

作为完全的 iOS 新手,困惑的第一个问题就是 iOS 安装包文件。

在 Android 系统中,安装 App 的途径很多,除了各类应用市场,普通用户也经常直接下载 apk 安装包文件后手动进行安装,因此大家对 Android 的安装包文件都比较熟悉。

但是对于 iOS 系统就不一样了,由于我们普通用户在 iOS 上安装应用的时候基本上只能通过 Apple Store 进行安装(未越狱),没有机会接触原始的安装包文件,因此往往连 iOS 应用的安装包到底是什么格式后缀都不清楚。

现在我们想在 Appium App 中通过模拟器运行被测应用,需要指定 iOS app 的安装包路径,因此需要首先获得一个 iOS app 安装包。

那么 iOS app 的安装包长啥样呢?

或者在这个问题之前,我们先来看下另一个问题:对于 iOS 设备来说,如果不通过 Apple Store,我们可以怎样安装一个应用?

针对这个问题,我搜了些资料,也请教了周围的同事,了解到的途径有如下几个:

  • 企业证书:该种方式适用于企业内部;通过企业证书编译出的 iOS 应用,无需上传至 Apple Store,即可无限制的安装到企业员工的 iOS 设备中。只是需要解决的一个问题是,由于 iOS 设备没有文件管理器,没法将安装包拷贝到 iOS 设备中,因此常用的做法是将安装包(.ipa文件)上传至一些下载服务器(例如fir.im),并生成二维码,然后用户扫描二维码后即可通过浏览器下载安装包并进行安装。由此联想到另外一个方法,通过微信文件传输助手将安装包(.ipa)传输至 iOS 设备,然后再进行安装应该也是可以的吧?这种方法不知在原理上是否可行,因为在试验时由于安装包大于 30M,微信无法传输,所以没能进行验证。
  • Xcode:该种方式适用于 iOS 开发者;开发者在 Xcode 中连上 iOS 设备对源码进行编译,编译生成的应用会自动安装至 iOS 设备。当然,该种方式也是需要 iOS 开发者证书。
  • PP 助手:该种方式适用于普通用户;PP 助手是一个非苹果官方的设备资源管理工具,可以实现对未越狱的 iOS 设备进行应用管理,也可以安装本地.ipa文件,前提是.ipa文件具有合适的签名。

在上面列举的安装应用的途径中,反复提到了.ipa文件,那.ipa应该就是 iOS 应用程序的后缀了吧?暂且这么认为吧。

再回到前面的场景,要在 iOS 模拟器中运行 iOS 应用,我们是否可以找研发人员要一个.ipa安装包文件,然后就能在模拟器中加载运行应用呢?

刚开始的时候我是这么认为的。于是我获取到.ipa文件后,在App Path中填写该文件的路径,然后启动 Appium Server;接着我再打开 Inspector 时,发现 iOS 模拟器启动了,但是在应用启动的时候就出问题了,始终无法正常启动,感觉像是启动崩溃,反复尝试多次仍然如此。

再次经过 Google,总算是明白出现问题的原因了,总结下来有如下几点:

  • 不管是从 Apple Store 或 iTunes 上下载的应用,还是在 Xcode 中针对真机设备编译生成的.ipa文件,都是面向于 ARM 处理器的 iOS 设备,只能在真机设备中进行安装;
  • 而在 Mac OSX 系统中运行的 iOS 模拟器,运行环境是基于 Intel 处理器的;
  • 因此,若是针对真机设备编译生成的.ipa文件,是无法在 iOS 模拟器中正常运行的,毕竟处理器架构都不一样;
  • 要想在 iOS 模拟器中运行应用,则必须在 Xcode 中编译时选择模拟器类型;编译生成的文件后缀为.app

准备.app文件

接下来,就说下如何获取.app文件。

虽然是测试人员,不会对被测 iOS 项目贡献代码,但是也不能总是找研发帮忙编译生成.app文件。所以,在本地搭建完整的 iOS 项目开发环境还是很有必要的。

对于 iOS 开发环境的搭建,当前社区中应该已经有了很多完整的教程,我在这儿就不详细描述了,只简单说下我搭建过程中涉及到的几个点。

首先,Mac OSX、Xcode、Apple Developer Tools 这些基础环境的安装,在上一篇文章中已经进行说明了;

然后,申请项目源码的访问权限,git clone到本地;

接着是项目依赖环境的问题;通常一个较大型的 iOS 项目都会引用许多第三方库,而这些依赖库并不会直接保存到项目仓库中,通常是采用CocoaPods进行管理;简单地说,CocoaPods是针对SwiftObjective-C项目的依赖管理器,类似于 Java 中的Maven,Ruby 中的Gem,Python 中的pip

当然,iOS 项目的依赖管理工具也不是只有CocoaPods一个,如果是采用的别的依赖管理器,请自行查找对应的资料。

采用CocoaPods管理的项目,在项目根目录下会包含PodfilePodfile.lock文件,里面记录了当前项目依赖的第三方库以及对应的版本号。

安装CocoaPods很简单,采用gem即可。

$ sudo gem install cocoapods

然后,进入到 iOS 项目的目录,执行pod install命令即可安装当前项目的所有依赖。

$ cd Project_Folder
$ pod install
Re-creating CocoaPods due to major version update.
Analyzing dependencies
.....(略)
Downloading dependencies
.....(略)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There are 27 dependencies from the Podfile and 28 total pods installed.

关于CocoaPods的更多信息,请自行查看官方网站

在依赖安装完成后,正常情况下,就可以在 Xcode 中编译项目了。

没有别的需要注意的,将 target 选择为模拟器(iOS Simulator)即可。而且针对模拟器进行编译时,也不会涉及到开发者证书的问题,项目配置上会简单很多。待后续讲到真机上的自动化测试时,我再对证书方面的内容进行补充。

编译完成后,在 Products 目录下,就可以看到XXX.app文件,这里的XXX就是项目名称;然后,选中XXX.app文件,【Show in Finder】,即可在文件目录中定位到该文件。

接下来,将XXX.app文件拷贝出来,或者复制该文件的Full path,怎样都行,只要在AppiumApp Path中能定位到该文件就行。

模拟器中运行 iOS 应用

被测应用.app准备就绪后,接下来就可以在 iOS 模拟器中运行了。

回到前面的那张图。启动Appium app后,对于模拟器运行的情况,在iOS Settings中必须设置的参数项就 3 个,App PathForce DevicePlatform Version。对于真机运行的情况,后续再单独进行说明。

设置完毕后,点击【Launch】,启动Appium Server

然后,点击图中红框处的按钮,即可通过Inspector启动模拟器,并在模拟器中加载 iOS 应用。

在模拟器中,我们可以像在真机中一样,体验被测应用的各项功能;并且,在 Appium 的日志台中,可以实时查看到日志信息。

经历的一个坑

整个过程是挺简单的,不过,在探索过程中我还是有遇到一个坑。

通过Inspector启动模拟器时,总是弹框报错,报错形式如下。

刚开始出现这问题时百思不得其解,因为提示的信息并不明显,Google 了好一阵也没找到原因。最后只有详细去看日志信息,才发现问题所在。

在日志中,发现的报错信息如下:

[iOS] Error: Could not find a device to launch. You requested 'iPhone 6 (8.4)', but the available devices were: ["Apple TV 1080p (9.2) [98638D25-7C82-48DF-BDCA-7F682F951533] (Simulator)","iPad 2 (9.2) [5E22F53E-EAB3-45DF-A1DD-10F58E920679] (Simulator)","iPad 2 (9.3) [4B2D2F9A-C099-4C13-8DE9-27C826A521C2] (Simulator)","iPad Air (9.2) [825E4997-9CD8-4225-9977-4C7AE2C98389] (Simulator)","iPad Air (9.3) [E4523799-E35F-4499-832B-12CF33F09144] (Simulator)","iPad Air 2 (9.2) [8057039D-F848-453E-97EC-2F75CAEA2E77] (Simulator)","iPad Air 2 (9.3) [0B8F49DA-832A-4248-BA1D-9DA5D11E31FD] (Simulator)","iPad Pro (9.2) [AF1F2D06-3067-41B5-AC2B-4B0ED88BF5D9] (Simulator)","iPad Pro (9.3) [C39617A6-9D91-4C0B-B25B-741BD57B016C] (Simulator)","iPad Retina (9.2) [D3C694E1-E3B4-47BE-AB5E-80B3D4E22FC2] (Simulator)","iPad Retina (9.3) [907C7B06-ED2C-48AC-AC46-04E4AD6E0CA3] (Simulator)","iPhone 4s (9.2) [1A786195-94E3-4908-8309-7B66D84E4619] (Simulator)","iPhone 4s (9.3) [3F76F34B-5A8F-4FD1-928D-56F84C192DDD] (Simulator)","iPhone 5 (9.2) [0D79A4CA-71EB-48A6-9EE4-172BEF3EB4E0] (Simulator)","iPhone 5 (9.3) [04270D44-F831-4253-95F2-3D205D2BC0D9] (Simulator)","iPhone 5s (9.2) [13A16C07-3C5B-4B04-A94B-B40A63238958] (Simulator)","iPhone 5s (9.3) [D30A7B34-BA01-4203-80DA-FAEA436725F9] (Simulator)","iPhone 6 (9.2) [5D01650F-2A31-4D53-A47A-CCF7FD552ADD] (Simulator)","iPhone 6 (9.3) [2F0810F6-C73B-4BA4-93BA-06D4B6D96BDA] (Simulator)","iPhone 6 Plus (9.2) [9A840B78-E6CE-4D18-BE83-16B590411641] (Simulator)","iPhone 6 Plus (9.3) [27C6557A-B09D-4D8A-9846-DA8FE0A8E8D5] (Simulator)","iPhone 6s (9.2) [E7F5B8A5-0E85-404F-A4D4-191D63E7EC1B] (Simulator)","iPhone 6s (9.3) [6F702911-13C2-472C-9ECD-BADD4385CB77] (Simulator)","iPhone 6s (9.3) + Apple Watch - 38mm (2.2) [B63FFAA4-00A4-473B-9462-3664F41F9001] (Simulator)","iPhone 6s Plus (9.2) [58837F78-511A-4F0B-9DDF-782E3B9935BD] (Simulator)","iPhone 6s Plus (9.3) [C31003C6-DCE2-414D-AD7F-376F6FA995B0] (Simulator)","iPhone 6s Plus (9.3) + Apple Watch - 42mm (2.2) [E3154768-CA23-45CC-90E5-2D0386A57B7D] (Simulator)"]

问题在于,我设置iOS Settings时,将Force Device设置为"iPhone 6",将Platform Version设置为 “8.4”,但是经过组合,iPhone 6 (8.4)并不在可用的模拟器设备列表中。

再来看日志中提示的可用设备,发现 “iPhone 6” 设备对应的Platform Version只有 “9.2” 和 “9.3”。然后回到iOS Settings,发现Platform Version的下拉框可选项就没有 “9.2” 和 “9.3”,最新的一个可选版本也就是 “8.4”。

这应该是Appium app的一个 bug 吧。不过好在Platform Version参数虽然是通过下拉框选择,但是也可以在框内直接填写内容。于是我在Platform Version设置框内填写为 “9.3”,然后再次启动时,发现 iOS 模拟器就可以正常启动了。

To be continued ...

现在,我们已经成功地通过 Appium Inspector 调用模拟器并运行 iOS 应用,接下来,我们就要开始尝试编写自动化测试用例了。

在下一篇文章中,我们将对 Appium Inspector 的功能进行熟悉,通过 Inspector 来查看 iOS 应用的 UI 元素信息,并尝试采用脚本语言与 UI 进行交互操作。


Read More ...

公众号:DebugTalk
原文链接:http://debugtalk.com/post/build-app-automated-test-platform-from-0-to-1-Appium-interrogate-iOS-UI

相关文章

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 14 条回复 时间 点赞

不错,把整个 iOS 安装方面相关的知识串起来了。因为打包各种麻烦,我们项目中一般最先实现自动化的就是打包。

PS:不经过 App store 的安装方式我补充一下:

所有安装到真机(非越狱)的应用(可以是 .app ,也可以是 .ipa ,只要编译时选的是编译成 Arm 的就好。.app 转 .ipa 只需要一条命令)都必须经过证书签名。证书主要有三大种:

  1. 企业证书:$299/年,土豪专用(哈哈)。可以装到无限台手机上,但不能提交 app store 。一般用于企业内部软件。
  2. 收费个人开发者证书:$99/年。未提交 app store 前只能最多安装到 100 台设备上,并且该手机的 udid 号必须登记到此开发者证书上(在苹果的开发者平台上登记)。可以提交到 app store。
  3. 免费个人开发者证书:从 XCode 7 开始推出,仅用于开发中的真机调试。可最多安装到 5 台设备上(这五台设备必须通过连接开发者电脑的方式来登记到证书上),没有提交到 app store 的权限。

同时证书签名还有分 release 和 debug 的哦,只有 debug 拥有调试权限,可以用于自动化测试。

至于安装方式,主要有 2 大类:

  1. 从电脑安装。Xcode,iTunes,ideviceinstaller,ios-deploy、PP 助手等都属于这种。底层调用的是一样的协议,具体协议没研究过。。。
  2. OTA 安装,即从网络安装。大批量的安装大多用这种。具体调用的是苹果的 itms-service 协议。有兴趣的同学可以看看这里:https://m.oschina.net/blog/125501

其实还有一类,MDM,可以主动推送安装信息。实际安装方式类似 OTA ,但是能获得手机的 udid(MDM 权限很大的哦),可以根据 udid 来推送合适的包。

#1 楼 @chenhengjie123 感谢补充,学习啦

写的很清楚,感谢,期待下一篇文章

一个开发环境问题....一个模拟器设备列表问题都见过 实在是坑的没命 最后还是没搞完=3= 果然还是等到了楼主~~~非常感谢@debugtalk 业务测试空余时继续去体验一下这个问题。

哟西,正在学习

—— 来自 TesterHome 官方 安卓客户端

楼主 DJI.app 是 Debug 模式编译的,还是默认的 release 模式

#6 楼 @heminwon 默认的,现在还没有区分 Debug 模式和 Release 模式

#7 楼 @debugtalk 默认的话就是 release 模式

今天正好遇到了类似的问题,非常感谢@debugtalk 的分享

itools 可以安装.ipa

楼主的学习能力真的很强,刚接触 ios 自动化测试 2 天,纠结模拟机安装 app 的多次闪退,头疼中,

感谢楼主的分享,有 qq 么,我们能够聊下么

第一个坑我也遇到过,哈哈,我就是这么解决的

命令行安装的 appium 怎么启动模拟器呢?Open Application http://192.168.181.1:4723/wd/hub platformName=ios platformVersion=11.0 deviceName=iphone 6s app=users:/zhuolipu/desktop/HeiZhimaApp 提示 URLError: 求助大佬

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册