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

相关文章
|
1天前
|
开发工具 Android开发 iOS开发
掌握安卓与iOS应用开发:关键技术与未来展望
本文深入探讨了安卓和iOS平台下的应用开发技术,重点比较了两大平台的架构、开发工具和市场策略。通过分析最新的技术趋势和开发者社区的反馈,文章为读者提供了一个全面的对比视角,旨在帮助开发者做出更明智的平台选择和开发决策。
|
4天前
|
数据采集 人工智能 自然语言处理
探索软件测试中的人工智能应用
在当今快速发展的技术世界中,软件测试作为确保软件质量的关键环节,正经历着前所未有的变革。随着人工智能技术的不断成熟和应用,其在软件测试领域的潜力逐渐显现,为提升测试效率、准确性和自动化水平提供了新的可能性。本文将深入探讨人工智能在软件测试中的应用现状、面临的挑战以及未来的发展趋势,旨在为读者提供一个关于AI如何改变软件测试行业的全面视角。
|
3天前
|
存储 安全 Android开发
深入探索安卓与iOS的安全性对比
在这篇文章中,我们将探讨安卓和iOS两大操作系统在安全性方面的不同之处。通过分析它们的安全架构、更新机制以及用户数据保护策略,我们可以更好地理解它们各自的优势和不足。无论是对于普通用户还是专业开发者,了解这些信息都是非常有益的。
|
1天前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
1天前
|
机器学习/深度学习 人工智能 算法
软件测试中的人工智能应用与前景
随着技术的不断进步,人工智能(AI)在软件测试中的应用越来越广泛。本文将探讨AI在软件测试中的具体应用,包括自动化测试、缺陷预测及测试用例生成等方面的内容。同时,我们将讨论AI在软件测试中的优势和挑战,并展望未来的发展趋势。
|
2天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:一场永无止境的较量
在移动操作系统的世界中,安卓(Android)和iOS一直是备受关注的两大巨头。它们不仅在市场份额、用户体验和功能特性上竞争激烈,还在安全性这一关键领域展开了激烈的角逐。本文将深入探讨安卓与iOS在安全性方面的不同之处,分析两者在应对安全威胁时的策略和技术手段,并展望未来移动操作系统安全的发展趋势。通过对比分析,我们将揭示这场永无止境的较量中,究竟谁能更胜一筹,以及用户又该如何在两者之间做出明智的选择。
14 0
|
2天前
|
搜索推荐 Linux Android开发
深入解析安卓与iOS系统架构设计差异
本文旨在探讨Android和iOS两大主流操作系统在架构设计上的根本差异。通过分析两种系统的设计理念、核心组件以及实际应用表现,揭示它们如何反映不同的开发哲学和用户体验策略。我们将从系统层级结构、内存管理机制、用户界面设计三个方面入手,逐一对比Android的开放性和灵活性如何与其对手iOS的封闭性和一致性相互辉映。
|
3天前
|
Android开发 Swift iOS开发
掌握安卓与iOS应用开发:关键技术与市场趋势
本文深入探讨了安卓和iOS平台的应用开发,通过分析关键技术如Kotlin、Swift及Flutter,并结合当前市场趋势,为开发者提供全面的技术指南。同时,比较了两大平台的优劣势,帮助开发者做出更明智的决策。
|
3天前
|
存储 安全 Android开发
深入探索安卓与iOS的安全性对比
在这篇文章中,我们将深入探讨安卓和iOS两大移动操作系统的安全性。通过比较它们在架构、权限管理、加密技术以及更新机制方面的不同,我们可以更好地理解这两个系统在保护用户数据和隐私方面的表现。文章将揭示一些关键的安全特性,并分析这些特性如何影响用户的日常使用。无论是普通用户还是技术人员,都能从中获得有价值的见解。
18 0
|
4天前
|
IDE 开发工具 Android开发
安卓与iOS开发环境的深度对比
在当今科技飞速发展的时代,智能手机已成为人们日常生活中不可或缺的一部分。而作为智能手机的两大主流操作系统——安卓和iOS,它们的开发环境各自具有独特的特点和优势。本文将从开发者的角度出发,深入探讨安卓与iOS开发环境的异同点,以期为开发者提供有益的参考。
14 0