Macaca自动化测试Android和IOS应用

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/54021946 1.Macaca简介Macaca是阿里巴巴集团开发的一套完整的自动化测试解决方案。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/54021946

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: 1

uiautomator 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: 1

uiautomator 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 常见的参数

  1. platformName String 当前用例运行的平台 { iOS / Android / Desktop }
  2. browserName String 当前测试的浏览器名称 { iOS: Safari } { Android: Chrome } { Desktop: Chrome / Electron }

5.2 App 相关参数

  1. deviceName String 模拟器的名称,例如 ‘iPhone 6’ 或者 ‘Nexus 5x’。

  2. app Stirng .ipa,.app 或者 .apk 文件的绝对地址或者远程地址,或者是包含上述文件格式的 Zip 文件。

  3. udid String 测试设备的唯一设备 ID。

5.3 Android 的参数介绍

  1. reuse Number 0: 启动并安装 app。{1 (默认): 卸载并重装 app。 2: 仅重装 app。3: 在测试结束后保持 app 状态。}
  2. package String Android app 的 package name。
  3. activity String 启动时的 Activity name。

5.4 iOS 的参数介绍

  1. reuse Number 0: 清楚数据并重装 app。 1: (默认) 卸载并重装 app。 2: 仅重装 app。 3: 在测试结束后保持 app 状态。
  2. bundleId String 应用的 Bundle ID,例如 com.apple.Maps。
  3. autoAcceptAlerts Boolean 自动接受所有的系统弹窗信息。默认是 false。
  4. 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-caps

var 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应用,基本上说到这里就要结束。后面我们还是学习如何自己写测试脚本。

相关文章
|
14天前
|
敏捷开发 测试技术 持续交付
探索自动化测试在敏捷开发中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是敏捷开发环境中的重要作用和面临的挑战。通过分析自动化测试的基本原理、实施策略以及在实际项目中的应用案例,揭示了其在提高软件质量和加速产品交付方面的巨大潜力。同时,文章也指出了自动化测试实施过程中可能遇到的技术难题、成本考量及团队协作问题,并提出了相应的解决策略,为软件开发团队提供了有价值的参考和指导。
|
4天前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
13天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
19天前
|
编解码 测试技术 开发工具
测试 iPhone 应用在不同屏幕尺寸和分辨率下的响应式效果
【10月更文挑战第23天】测试 iPhone 应用在不同屏幕尺寸和分辨率下的响应式效果是确保应用质量和用户体验的重要环节。通过手动测试、自动化测试、视觉效果评估、性能测试、用户体验测试等多种方法的综合运用,能够全面地发现应用在响应式效果方面存在的问题,并及时进行解决和优化。同时,持续的测试和优化也是不断提升应用质量和用户满意度的关键。
|
7天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
16天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
32 2
|
16天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
31 1
|
16天前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
17 1
|
17天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
27 2
|
23天前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。