Macaca自动化测试Android和IOS应用
1.Macaca简介
Macaca是阿里巴巴集团开发的一套完整的自动化测试解决方案。
2.Macaca特性:
- 支持移动端和PC端
- 支持Native, Hybrid, H5 等多种应用类型
- 提供客户端工具和持续集成服务
3.macaca-cli客户端的安装:
3.1安装 Node.js
请安装 Node.js v4.0 或者更高版本,装好 Node.js 后命令行里就已经集成了 npm 工具,为了提高安装模块的速度,请使用国内的 cnpm。
3.2 iOS 环境安装
请安装 Xcode8 或者更高版本
需要安装 usbmuxd 以便于通过 USB 通道测试 iOS 真机,不需要测试真机则不用安装
$ brew install usbmuxd
应用中如含有 WebView,请安装 ios-webkit-debug-proxy
$ brew install ios-webkit-debug-proxy
备注:使用brew命令需要安装Homebrew(一款常用的 MacOS 的包管理器),请按照官网提示安装。
准备 App 包:如需要测试 iOS 应用,请使用 Scheme 设置为 debug 的 .app 包。
3.3 Android环境安装
3.3.1 安装 JDK
配置 JAVA_HOME,根据你所使用的 shell 工具修改不同的文件,比如 ~/.bashrc, ~/.bash_profile, ~/.zshrc
shell export JAVA_HOME=path/to/your/Java/Home
3.3.2安装安卓 SDK
运行 brew install android-sdk,然后安装18-24版本中的任一 SDK
shell 环境设置 ANDROID_HOME 根据你所使用的Terminal修改不同的
文件,比如~/.bashrc, ~/.bash_profile, ~/.zshrc
# 如果是通过homebrew安装的android-sdk,则路径如下export ANDROID_HOME = /usr/local/opt/android-sdk# 如果通过其他方式安装的sdk,路径设置为对应的android sdk的路径export ANDROID_HOME = path/to/your/Android/sdk
注意:准备 App 包:如需要测试 Android 应用,请使用 .apk 格式的包。
3.4 全局安装macaca
$ npm i -g macaca-cli
如果看到如下可爱的小猴子,那恭喜你安装成功啦!重新安装则会覆盖更新。
3.5安装驱动
3.6 环境检查
通过 macaca doctor 可以检查环境是否配置成功
$ macaca doctor
如上图所示则表示环境均配置正常,如果有错误,会出现红色的提示。
4 运行官方示例
将官方示例(mobile-app-sample-nodejs)克隆到本地,更多的示例请访问macaca-sample。
$ git clone https://github.com/macaca-sample/mobile-app-sample-nodejs.git --depth=1
$ cd mobile-app-sample-nodejs
$ npm i
# 更多运行方式见Makefile
$ macaca run --verbose
4.1 Android 的自动化测试
先在mobile-app-sample-nodejs/macaca-test/mobile-app-sample.test.js脚本文件中如果是ios该为Android。
var platform = process.env.platform || 'Android';
platform = platform.toLowerCase();
在mobile-app-sample-nodejs目录下执行
macaca run
测试的过程
lidongdeMacBook-Pro:mobile-app-sample-nodejs lidong$ macaca run ./macaca-test/macaca-mobile-sample.test.js
>> webdriver sdk launched
>> >> >> macaca mobile sample>> get /Users/lidong/.macaca-temp/android_app_bootstrap-debug.apk from cache
>> sha:e2ca601f9ee1ec101326d12377a2e8d4
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.android.uiautomator.client.Initialize:
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testStartServer
INSTRUMENTATION_STATUS: class=com.android.uiautomator.client.Initialize
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 1uiautomator start socket server.>> socket server ready
>> socket client ready
recive: {"cmd":"wake","args":{}}return: {"success":true,"data":{"status":0,"value":true}}recive: {"cmd":"getWindowSize","args":{}}return: {"success":true,"data":{"status":0,"value":"{\"width\":1080,\"height\":1794}"}}>> current window size {"width":1080,"height":1794}recive: {"cmd":"find","args":{"strategy":"class name","selector":"android.widget.EditText","multiple":true}}return: {"success":true,"data":{"status":0,"value":[{"ELEMENT":"1"},{"ELEMENT":"2"}]}}recive: {"cmd":"clearText","args":{"elementId":"1"}}return: {"success":true,"data":{"status":0,"value":true}}recive: {"cmd":"setText","args":{"elementId":"1","text":"中文+Test+12345678"}}return: {"success":true,"data":{"status":0,"value":true}}recive: {"cmd":"find","args":{"strategy":"class name","selector":"android.widget.EditText","multiple":true}}return: {"success":true,"data":{"status":0,"value":[{"ELEMENT":"3"},{"ELEMENT":"4"}]}}recive: {"cmd":"clearText","args":{"elementId":"4"}}return: {"success":true,"data":{"status":0,"value":true}}recive: {"cmd":"setText","args":{"elementId":"4","text":"111111"}}return: {"success":true,"data":{"status":0,"value":true}}recive: {"cmd":"find","args":{"strategy":"name","selector":"Login","multiple":true}}return: {"success":true,"data":{"status":0,"value":[{"ELEMENT":"5"}]}}recive: {"cmd":"click","args":{"elementId":"5"}}return: {"success":true,"data":{"status":0,"value":true}}>>
>> #1 should login success (19613ms)recive: {"cmd":"getSource","args":{}}return: {"success":true,"data":{"status":0,"value":true}}>> { hierarchy: { rotation: '0',node: { index: '0',class: 'android.widget.FrameLayout',package: 'com.github.android_app_bootstrap',checkable: 'false',checked: 'false',clickable: 'false',enabled: 'true',focusable: 'false',focused: 'false',scrollable: 'false','long-clickable': 'false',password: 'false',selected: 'false',bounds: '[0,0][1080,1794]',node: [Object] } } }>>
>> #2 should display home (911ms)recive: {"cmd":"find","args":{"strategy":"name","selector":"list","multiple":false}}
等等
4.2 IOS 的自动化测试
先在mobile-app-sample-nodejs/macaca-test/mobile-app-sample.test.js脚本文件中如果是Android改为ios。
var platform = process.env.platform || 'ios';
platform = platform.toLowerCase();
在mobile-app-sample-nodejs目录下执行
macaca run
测试过程
lidongdeMacBook-Pro:mobile-app-sample-nodejs lidong$ macaca run ./macaca-test/macaca-mobile-sample.test.js
>> webdriver sdk launched
>> >> >> macaca mobile sample>> get /Users/lidong/.macaca-temp/android_app_bootstrap-debug.apk from cache
>> sha:e2ca601f9ee1ec101326d12377a2e8d4
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.android.uiautomator.client.Initialize:
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testStartServer
INSTRUMENTATION_STATUS: class=com.android.uiautomator.client.Initialize
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 1uiautomator start socket server.>> socket server ready
>> socket client ready
recive: {"cmd":"wake","args":{}}return: {"success":true,"data":{"status":0,"value":true}}recive: {"cmd":"getWindowSize","args":{}}return: {"success":true,"data":{"status":0,"value":"{\"width\":1080,\"height\":1794}"}}>> current window size {"width":1080,"height":1794}recive: {"cmd":"find","args":{"strategy":"class name","selector":"android.widget.EditText","multiple":true}}return: {"success":true,"data":{"status":0,"value":[{"ELEMENT":"1"},{"ELEMENT":"2"}]}}recive: {"cmd":"clearText","args":{"elementId":"1"}}return: {"success":true,"data":{"status":0,"value":true}}
5.脚本初始化参数
5.1 常见的参数
- platformName String 当前用例运行的平台 { iOS / Android / Desktop }
- browserName String 当前测试的浏览器名称 { iOS: Safari } { Android: Chrome } { Desktop: Chrome / Electron }
5.2 App 相关参数
deviceName String 模拟器的名称,例如 ‘iPhone 6’ 或者 ‘Nexus 5x’。
app Stirng .ipa,.app 或者 .apk 文件的绝对地址或者远程地址,或者是包含上述文件格式的 Zip 文件。
- udid String 测试设备的唯一设备 ID。
5.3 Android 的参数介绍
- reuse Number 0: 启动并安装 app。{1 (默认): 卸载并重装 app。 2: 仅重装 app。3: 在测试结束后保持 app 状态。}
- package String Android app 的 package name。
- activity String 启动时的 Activity name。
5.4 iOS 的参数介绍
- reuse Number 0: 清楚数据并重装 app。 1: (默认) 卸载并重装 app。 2: 仅重装 app。 3: 在测试结束后保持 app 状态。
- bundleId String 应用的 Bundle ID,例如 com.apple.Maps。
- autoAcceptAlerts Boolean 自动接受所有的系统弹窗信息。默认是 false。
- autoDismissAlerts Boolean 自动拒绝所有的系统弹窗信息。默认是 false。
5.5 基本用法
'use strict';require('should');
var xml2map = require('xml2map');var platform = process.env.platform || 'ios';
platform = platform.toLowerCase();var pkg = require('../package');/*** download app form npm** or use online resource: https://npmcdn.com/ios-app-bootstrap@latest/build/ios-app-bootstrap.zip** npm i ios-app-bootstrap --save-dev** var opts = {* app: path.join(__dirname, '..', 'node_modules', 'ios-app-bootstrap', 'build', 'ios-app-bootstrap.zip');* };*/// see: https://macacajs.github.io/desired-capsvar iOSOpts = {deviceName: 'iPhone 5s',platformName: 'iOS',autoAcceptAlerts: false,//reuse: 3,//udid: '',//bundleId: 'xudafeng.ios-app-bootstrap',app: 'http://localhost:8087/ios-app-bootstrap.zip'
};var androidOpts = {platformName: 'Android',autoAcceptAlerts: false,// reuse: 3,// udid: '',// package: 'com.github.android_app_bootstrap',// activity: 'com.github.android_app_bootstrap.activity.WelcomeActivity',app: 'http://localhost:8087/android_app_bootstrap-debug.apk'
};const isIOS = platform === 'ios';
const infoBoardId = isIOS ? 'info' : 'com.github.android_app_bootstrap:id/info';const wd = require('macaca-wd');// override custom wd
require('./wd-extend')(wd, isIOS);describe('macaca mobile sample', function() {this.timeout(5 * 60 * 1000);const driver = wd.promiseChainRemote({host: 'localhost',port: 3456});driver.configureHttp({timeout: 600 * 1000});before(function() {return driver.init(isIOS ? iOSOpts : androidOpts);});after(function() {return driver.sleep(1000).quit();});it('#1 should login success', function() {return driver.getWindowSize().then(size => {console.log(`current window size ${JSON.stringify(size)}`);}).appLogin('中文+Test+12345678', '111111').sleep(1000);});
Macaca自动化测试Android和IOS应用,基本上说到这里就要结束。后面我们还是学习如何自己写测试脚本。
Macaca自动化测试Android和IOS应用相关推荐
- H5能取代移动app(Android和iOS)吗?
大量新生移动设备的兴起,改变了互联网的未来.在技术的发展上,HTML5会取代App应用吗?或者说能够在多大程度上取代呢?在HTML5规范中,已经加入了相机.磁力罗盘.GPS信息的支持.很多新兴浏览器也 ...
- 移动App专项性能测试(Android and iOS)
一直以来,性能测试是被一部分人遗忘,又让另一部分人无可奈何的东西.在绝大部分的创业公司,性能测试基本上都是被遗忘的,他们认为功能测试和稳定性测试才是重点,而在中等规模的公司中一部分测试人员考虑进行性能 ...
- 百度视频在Android和iOS端性能测试方法
背景介绍 一直以来,性能测试是被一部分人遗忘,又让另一部分人无可奈何的东西.在绝大部分的创业公司,性能测试基本上都是被遗忘的,他们认为功能测试和稳定性测试才是重点,而在中等规模的公司中一部分测试人员考 ...
- Android与iOS测试注意点
App测试中Android和IOS测试区别 分辨率测试: Android端种类多常见的手机分辨率: (4:3 VGA 640480 (Video Graphics Array) QVG ...
- Android、iOS如何实现自动化录屏,超实用!
阅读本文大约需要1分钟. 背景 在做移动端自动化测试的过程中,有很多场景需要录制设备的屏幕视频,比如Crash现场记录,启动/页面加载耗时类的评测等,那么如何实现Android和iOS设备的屏幕录制呢 ...
- android测试机最好的,使用 Macaca 进行 Android 多设备测试
接触 Macaca 也蛮久了,中间断断续续折腾了一阵,自动化框架还在用老牌的 Appium,迁移是大事不能一蹴而就.最近有个机会准备分享一些 Macaca 的经验,我有开始来倒腾了. 使用 Macac ...
- Android和iOS 测试五个最好的开源自动化工具
本文主要介绍Android和iOS 五个最好的开源自动化工具,这里整理了相关资料,希望能帮助测试软件的朋友,有需要的看下 自动化测试在产品测试上有着非常重要的作用.实现测试自动化有多种积极的方式,包括 ...
- 《大话移动APP测试:Android与iOS应用测试指南》
<大话移动app测试:android与ios应用测试指南> 基本信息 作者: 陈晔 出版社:清华大学出版社 ISBN:9787302368793 上架时间:2014-7-7 出版日期:20 ...
- ios android安全性分析,Android与iOS的对比分析及Android安全技术的设计与实现
摘要: 近年来科技的发展和进步极大的推动了智能手机的飞速发展,手机功能的日益强大使人们对其依赖度显著上升.作为与人们生活密不可分通讯工具,手机安全的重要性不言而喻.现如今,随着手机网络的迅猛发展和形形 ...
- Android和iOS那个好?
Android和iOS那个好? 应该先往哪个上面投入资源? 多次被人问到此类问题,笔者刚好自己的项目也需要考虑iOS版本.就索性进行了一番调研,于是有了本文(本次不讨论越狱的iOS) 首先 ...
最新文章
- 使用Django开发REST 接口
- 富士相机设置传原图_双面屏设计!富士XPro3相机外观草图曝光
- Ios之label自适应里面的文字,自动调整宽度和高度的
- C# v7.0版本中的local function
- Ubuntu安装搭建Clion环境
- parrot linux iso下载,Parrot 4.7 发布,基于Debian的数字取证和隐私保护Linux发行版
- 《强化学习》中的第11章:基于函数逼近的离轨策略方法
- php -- 魔术方法 之 自动加载:__autoload()
- Springboot项目中Pom.xml报错
- 彻底删除MySQL教程
- Exception:must implement OnFragmentInteractionListener
- JAVA实现EXCEL公式专题(七)——统计函数
- [渝粤教育] 西南科技大学 液压与气压传动 在线考试复习资料
- java爬取国家统计局省市县及编码
- 点云匹配介绍与ICP算法
- 两个PDF怎么合成在一起
- 时间换算:UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8
- Android Studio升级到3.0版本后布局不能预览解决方案
- 更改csv默认分隔符
- 软件工程 | 第四章 系统设计