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

相关文章
|
2天前
|
敏捷开发 IDE 测试技术
自动化测试框架的选择与应用
【9月更文挑战第16天】在软件开发周期中,测试环节扮演着至关重要的角色。随着敏捷开发和持续集成的流行,自动化测试成为提升软件质量和效率的关键手段。本文将探讨如何根据项目需求选择合适的自动化测试框架,并通过实际案例分析展示其在软件开发过程中的应用。我们将从单元测试、集成测试到端到端测试等多个层面,讨论自动化测试的最佳实践和常见问题解决策略。
|
3天前
|
搜索推荐 Java Android开发
打造个性化安卓应用:从设计到发布的全程指南
【9月更文挑战第15天】本篇文章将带领读者踏上一段激动人心的旅程,从构思一个独特的安卓应用想法开始,直至将其变为现实并成功发布。我们将一起探索如何捕捉灵感、设计界面、编写代码以及最终将应用推向市场。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供宝贵的洞见和实用的技巧,让你的应用在竞争激烈的市场中脱颖而出。
30 17
|
5天前
|
人工智能 物联网 Android开发
探索安卓与iOS的未来发展
本文将深入探讨安卓和iOS两个主要操作系统的发展历程、当前状态以及它们未来的发展方向。我们将分析这两个平台的技术进步、市场趋势以及它们如何应对新兴技术挑战。通过对比分析,我们希望揭示出影响这两个系统未来走向的关键因素。
|
4天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:一场永无止境的较量
在移动操作系统的领域中,安卓(Android)和iOS一直以其独特的安全性特性引领着市场。本文深入探讨了两者在安全性方面的不同之处,从系统架构、隐私保护到应用生态,一一剖析双方的优势与不足。通过对比分析,我们将揭示这场看似平静却暗流涌动的安全较量,展现一个全面而细致的对比视角。同时,我们也期待这场竞争能进一步推动整个行业安全标准和技术的进步,为用户带来更加安心、便捷的移动体验。
13 1
|
5天前
|
API Android开发 iOS开发
掌握安卓与iOS应用开发中的依赖注入技术
本文探讨了在安卓和iOS应用开发中,如何有效利用依赖注入技术来提升代码的模块化、可测试性和可维护性。通过对比分析两种平台下依赖注入的实现方式与工具,本文旨在为开发者提供一套清晰、实用的依赖管理策略,助力打造高质量软件产品。
|
6天前
|
机器学习/深度学习 vr&ar Android开发
探索安卓与iOS的未来发展
本文将深入探讨安卓和iOS两大移动操作系统的未来发展,从技术创新、用户体验、生态系统等多个角度进行分析。通过对比两者的优势与不足,我们将揭示它们如何塑造智能手机市场的未来格局。无论是开发者还是普通用户,了解这些趋势都将有助于更好地适应科技的快速发展。
15 2
|
6天前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
18 1
|
2天前
|
IDE 开发工具 Android开发
安卓与iOS开发环境的深度对比
在当今科技飞速发展的时代,智能手机已成为人们日常生活中不可或缺的一部分。而作为智能手机的两大主流操作系统——安卓和iOS,它们的开发环境各自具有独特的特点和优势。本文将从开发者的角度出发,深入探讨安卓与iOS开发环境的异同点,以期为开发者提供有益的参考。
8 0
|
5天前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
16 0
|
3月前
|
安全 Java Android开发
探索Android与iOS应用开发的核心差异
【6月更文挑战第11天】在移动设备的世界中,Android和iOS两大操作系统各占半壁江山。本文将深入探讨这两个平台在应用开发上的主要区别,包括开发环境、编程语言、用户界面设计、市场策略和安全性等方面。通过比较分析,旨在为开发者提供一份清晰的指南,帮助他们根据项目需求和目标受众选择最合适的开发路径。
32 2