最近对iOS自动化测试做了一番探究,希望通过自动化测试更好的去提高公司项目的测试效率 。在网上找了很多的文章和相关资料,都因为时间比较久导致无法实现基本环境的搭建,我在这儿分享给大家分享我的实现过程。
首先是iOS自动化实现方案。有两篇文章值得你去读一读。
- 腾讯--移动APP自动化测试框架对比
- 美团--客户端自动化测试研究
我简单的对第一篇文章中的内容做一下总结。一个高质量的App不仅仅需要代码规范和逻辑严谨,还需要通过测试去对App的质量进行考核。从分层测试的角度来说,我们的测试你首先是单元测试,然后是接口级测试,最后是UI的测试。文章中列举了安卓和iOS一些常用的测试框架,iOS端常用的XCTest(系统自带用于单元测试的框架)、KIF(Keep It Functional,一款iOS app功能性测试框架)、Kiwi(BDD框架,是对XCTest的一个完整替代)都进行了简单的介绍。
解释一下BDD和TDD: - 行为驱动开发(英语:Behavior-driven development,缩写BDD)是一种敏捷软件开发的技术,BDD的重点是通过与利益相关者的讨论取得对预期的软件行为的清醒认识。它通过用自然语言书写非程序员可读的测试用例扩展了测试驱动开发方法。
- 测试驱动开发(英语:Test-driven development,缩写为TDD)是一种软件开发过程中的应用方法,由极限编程中倡导,以其倡导先写测试程序,然后编码实现其功能得名。测试驱动开发是戴两顶帽子思考的开发方式:先戴上实现功能的帽子,在测试的辅助下,快速实现其功能;再戴上重构的帽子,在测试的保护下,通过去除冗余的代码,提高代码质量。测试驱动着整个开发过程:首先,驱动代码的设计和功能的实现;其后,驱动代码的再设计和重构。
如果你的项目对UI自动化测试要求度不高的话,仅仅是需要单元测试和UI测试那么这里提出两套方案: - 方案一:xcode自带两个target,XCTest和XCUITest。前者是单元测试后者是UI测试。
- 方案二:Kiwi+KIF。前者可以进行单元测试,后者则可以进行UI测试。
Tip:Kiwi和KIF的环境搭建亲测是没问题的。有issue可以底部留言。
在了解了iOS可用的测试相关工具之后,结合第二篇美团技术团队分享的文章,我们延用其给出的实现项目UI自动化测试方案:Appium + cucumber。下面简单介绍一下两个平台:
Appium是一个开源的自动化测试工具,支持多种脚本语言,不依赖源码。由于苹果删除了自动化测试框架UIAutomation, Appium改为使用XCUITest框架,使用Facebook的WebDriverAgent驱动。
cucumber是使用文本描述语言来执行测试用例的工具,使用Gherkin语法,文件以.feature做为后缀。
Appium + cucumber的方案具有以下优势: - Appium底层以webDriverAgent为驱动,跨平台性较高。
- Appium对webView的支持性更好。
- Appium元素定位手段更多。
- Appium对安卓和iOS的接入成本较低,安卓提供apk文件,iOS提供.app文件。
- Cucumber可以进行报表的可视化输出,在执行完全部脚本之后就可以看到生成好的HTML格式的测试报告,集成Jenkins的方式也相对常规。(个人还待探究)
接下来,我将正式开始说明对Appium和cucumber的集成,首先是Appium。
前置条件:
- mac
- xcode
目前本人运行成功的各工具对应版本,贴给大家参考:
- appium v1.15.1
- xcode 11.2
- iphone6 iOS12.4
- ruby 2.6.3
- cucumber 4.0.0
下载步骤:
下载Appium客户端
Appium客户端下载地址-
环境配置
注意,下列步骤如果提示你没有权限,记得在命令前面加sudo
。- 命令行安装homebrew.
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装完毕后执行
brew -v
查询安装的版本号,我这里是Homebrew 2.1.16
- 安装libimobiledevice
brew install libimobiledevice --HEAD
如果你遇到下面的问题
Requested 'libusbmuxd >= 1.1.0' but version of libusbmuxd is 1.0.10
那么你需要进行下列的步骤进行更新升级操作:
brew update brew uninstall --ignore-dependencies libimobiledevice brew uninstall --ignore-dependencies usbmuxd brew install --HEAD usbmuxd brew unlink usbmuxd brew link usbmuxd
- 安装carthage
brew install carthage
- 安装node
brew install node
- 安装npm
brew install npm
- 安装ios-deploy
npm install -g ios-deploy
如果你遇到下面的错误:
ld: framework not found MobileDevice
clang: error: linker command failed with exit code 1 (use -v to see invocation)
** BUILD FAILED **错误原因是:xcode的自带的DerivedData和要求的不一致,需要更新,请尝试使用下列语句:
\rm -fr ~/Library/Developer/Xcode/DerivedData/ios-deploy-* npm -g uninstall ios-deploy npm -g install ios-deploy@beta
先移除DerivedData里的缓存,然后卸载重装。
- 安装xcpretty
gem install xcpretty
- 安装appium-doctor
npm install -g appium-doctor
- 使用appium-doctor 检查Appium iOS环境环境
appium-doctor --ios
这里给到我的控制台完整打印信息:
info AppiumDoctor Appium Doctor v.1.12.1 info AppiumDoctor ### Diagnostic for necessary dependencies starting ### info AppiumDoctor ✔ The Node.js binary was found at: /usr/local/bin/node info AppiumDoctor ✔ Node version is 12.13.0 info AppiumDoctor ✔ Xcode is installed at: /Applications/Xcode.app/Contents/Developer info AppiumDoctor ✔ Xcode Command Line Tools are installed in: /Applications/Xcode.app/Contents/Developer info AppiumDoctor ✔ DevToolsSecurity is enabled. info AppiumDoctor ✔ The Authorization DB is set up properly. info AppiumDoctor ✔ Carthage was found at: /usr/local/bin/carthage. Installed version is: 0.34.0 info AppiumDoctor ✔ HOME is set to: /Users/jackie-pc info AppiumDoctor ### Diagnostic for necessary dependencies completed, no fix needed. ### info AppiumDoctor info AppiumDoctor ### Diagnostic for optional dependencies starting ### WARN AppiumDoctor ✖ opencv4nodejs cannot be found. WARN AppiumDoctor ✖ ffmpeg cannot be found WARN AppiumDoctor ✖ mjpeg-consumer cannot be found. WARN AppiumDoctor ✖ idb is not installed info AppiumDoctor ✔ applesimutils is installed at: /usr/local/bin/applesimutils. Installed versions are: applesimutils 0.7.6 info AppiumDoctor ### Diagnostic for optional dependencies completed, 4 fixes possible. ### info AppiumDoctor info AppiumDoctor ### Optional Manual Fixes ### info AppiumDoctor The configuration can install optionally. Please do the following manually: WARN AppiumDoctor ➜ Why opencv4nodejs is needed and how to install it: https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image- comparison.md WARN AppiumDoctor ➜ ffmpeg is needed to record screen features. Please read https://www.ffmpeg.org/ to install it WARN AppiumDoctor ➜ mjpeg-consumer module is required to use MJPEG-over-HTTP features. Please install it with 'npm i -g mjpeg-consumer'. WARN AppiumDoctor ➜ Why idb is needed and how to install it: https://github.com/appium/appium-idb
其中的警告不用管,我这里配置了Xcode Command,如果你需要配置的话,则需要打开你的Xcode,来到偏好设置->location的位置设置command line tools
Appium底层是由WebDriverAgent驱动的,WebDriverAgent是由Facebook开发的一套开源框架,用于端对端的UI测试,能同时支持模拟器和真机。但是2018年已经停止维护了,所以Appium现在是自己在对WebDriverAgent进行维护
。所以,当你下载Appium后其内置的WebDriverAgent地址发生了变化。接下来我们将开始搭建非常重要的一个玩意儿WebDriverAgent
,大家做好战斗准备。
具体操作步骤如下:以真机为例,模拟器不需要添加开发者账号
- 先去到这一级目录然后里面有一个appium-webdriveragent工程,进入其根目录,执行初始化脚本添加相关的库
/Applications/Appium.app/Contents/Resources/app/node_modules
sh ./Scripts/bootstrap.sh
-
修改工程targets下WebDriverAgentLib和WebDriverAgentRunner的bundleID,添加开发者账号。
当你完成了上述的几步操作之后,链接你的手机,执行command + U。
Tips:
- 这里如果你去到上述的路径下,发现你的工程的targets没有我贴的图片那么多时或者按照给的操作步骤cmd + u没有通过编译,并且报RunnerHttp文件找不到这个错误时,怎么办?
首先检查是否有执行脚本命令,还是不行则说明你的WebDriverAgent工程可能不是最新的,你需要去下载由Appium自己维护的WebDriverAgent。
- 如何检验你的webDriverAgent确实真机运行成功了呢?
当你运行成功,xcode控制台会输出一条http地址,将其用浏览器加载后会返回一段json数据。因为Appium本身就是通过发送json数据和你的app进行通信的,能返回json数据说明你的WebDriverAgent运行成功了,可以支持真机,然后你的手机上应该会出现一个WebDriverAgent的工程。
至此,Appium和WebDriverAgent的搭建算是完成了,应该会松一口气。接下来轻松一下,可以把Appium跑起来玩玩,步骤是:
- 先把WebDriverAgentRunner编译在手机上,再把待测试的工程运行在手机上。
- 启动Appium,点击start sever v1.15.1,点击放大镜(start inspector session),配置测试相关信息。有两种方式:
Desired Capabilities
和JSON Representation
,任选一种进行配置。下面是Appium真机配置界面:
这里的配置作用是让Appium知道是哪台手机运行哪个App,我贴出JSON Representation的代码:
{
"bundleId": "",
"platformName": "iOS",
"platformVersion": "12.4",
"deviceName": "iPhone 6",
"automationName": "XCUITest",
"clearSystemFiles": "True",
"udid": ""
}
这里如果你是测试人员
,上述相关信息请找开发
要,然后手机信息从手机的通用
- 关于本机
里面找即可。配置好后点击start session进行相关操作。下面我贴出start session后的界面和相关按钮作用:
至此,自动化测试工具Appium的WebDriverAgent已经全部搭建完毕。现在请思考一个问题,如果你是一个测试人员你肯定希望让App根据你的测试用例能够跑起来做相应的操作,那么怎么实现呢?答案是运行脚本
。那么,我们通过什么语言写脚本呢?有没有相关的工具可以支持我们运行脚本后通过Appium去测试我们的app呢?答案是有,可以通过BDD自动化测试工具Cucumber解决刚提出的问题。下一篇我们将讲述关于Cucumber的搭建和简单使用。
Tips:
简单解释下什么是homebrew。
Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。
援引官方的一句话:又提示缺少套件啦?别担心,Homebrew 随时守候。Homebrew —— OS X 不可或缺的套件管理器。
什么是Carthage
Carthage与CocoaPods类似,都是用于在iOS/OS X环境下管理第三方的工具。Carthage 使用于 Swift 语言编写,只支持动态框架,只支持 iOS8+的Cocoa依赖管理工具。
参考链接:
Appium+Python3+iOS真机环境搭建
移动端UI自动化测试--Appium和Cucumber的完美结合
美团客户端自动化测试研究