android自动化测试Uiautomator源码分析之一

原创 2017年04月15日 11:46:03

1, 概述

Uiautomator顾名思义,就是UI自动化测试。主要用于仿真UI界面,包括单击,滑动,输入文本等操作。

主要分为三个子命令, rutest/dump/events

同其他大多数adb命令一样,Uiautomator命令也是shell脚本,system/bin 目录下有一个uiautomator文件脚本。最后三行如下

CLASSPATH=${CLASSPATH}:${jars}
export CLASSPATH
exec app_process ${base}/bin com.android.commands.uiautomator.Launcher ${args}

首先会导入jar包, 然后通过app_process来指定命令工作路径为'/system/bin/'以启动指定类com.android.commands.uiautomator.Launcher,

启动该类传入的参数就是指定的测试用例类. 最后会调用Launcher类中的main方法。

路径: frameworks\base\cmds\uiautomator\cmds\uiautomator\src\com\android\commands\uiautomator

和以前一样,先按照流程走一遍,看看是如何实现的。

2, 匹配Command

Launcher的main方法如下,

public static void main(String[] args) {
        // show a meaningful process name in `ps`
        Process.setArgV0("uiautomator");
        if (args.length >= 1) {
            Command command = findCommand(args[0]);
            if (command != null) {
                String[] args2 = {};
                if (args.length > 1) {
                    // consume the first arg
                    args2 = Arrays.copyOfRange(args, 1, args.length);
                }
                command.run(args2);
                return;
            }
        }
        HELP_COMMAND.run(args);
    }

首先findCommand方法根据输入参数args(包含测试类的详细命令)找出对应的Command类,然后调用其run方法开始运行。

如果未找到就调用默认的HELP_COMMAND的run方法。

findCommand方法如下,

private static Command findCommand(String name) {
        for (Command command : COMMANDS) {
            if (command.name().equals(name)) {
                return command;
            }
        }
        return null;
    }

遍历COMMANDS, 根据命令来匹配子COMMAND的name字符,

静态COMMANDS如下,

private static Command[] COMMANDS = new Command[] {
        HELP_COMMAND,
        new RunTestCommand(),
        new DumpCommand(),
        new EventsCommand(),
    };

4个HELP_COMMAND / RunTestCommand / DumpCommand / EventsCommand 都是Command 的子类,

对应的name变量分别是help/ runtest/ dump/ events,在构造的时候给name变量赋值, RunTestCommand构造方法如下,

public RunTestCommand() {
        super("runtest");
    }

其实runtest/ dump/ events依次对应着三个子命令。

  • runtest :对应RunTestCommand这个类,代表运行相应测试的命令
  • dump : 对应DumpCommand这个类,dump当前窗口控件信息,你在命令行运行‘uiautomator dump’就会把当前ui的hierarchy信息dump成一个文件默认放到sdcard上
  • events : 对应EventsCommand这个类,获取accessibility events,你在命令行运行'uiautomator events'然后在链接设备上操作一下就会看到相应的事件打印出来

如果不是这三个命令,就调用HELP_COMMAND的run方法, HELP_COMMAND是Launcher的内部类,如下

private static Command HELP_COMMAND = new Command("help") {
        @Override
        public void run(String[] args) {
            System.err.println("Usage: uiautomator <subcommand> [options]\n");
            System.err.println("Available subcommands:\n");
            for (Command command : COMMANDS) {
                String shortHelp = command.shortHelp();
                String detailedOptions = command.detailedOptions();
                if (shortHelp == null) {
                    shortHelp = "";
                }
                if (detailedOptions == null) {
                    detailedOptions = "";
                }
                System.err.println(String.format("%s: %s", command.name(), shortHelp));
                System.err.println(detailedOptions);
            }
        }

        @Override
        public String detailedOptions() {
            return null;
        }

        @Override
        public String shortHelp() {
            return "displays help message";
        }
    };

打印提示的log信息。

版权声明:本文为博主原创文章,未经博主允许不得转载。

uiautomatorviewer 源代码

  • 2015年12月22日 11:32
  • 31KB
  • 下载

UiAutomatorviewer 源码 Android 8.0

  • 2017年12月12日 16:35
  • 31KB
  • 下载

Android工具使用之UiAutomatorViewer

以前是用HierarchyViewer查看界面的布局层次的,其实UiAutomatorViewer用起来更方便更直观,个人更偏向后者。 UiAutomatorViewer也是Android sdk自...
  • l403040463
  • l403040463
  • 2018年02月02日 09:55
  • 23

uiautomatorviewer

  • 2017年10月18日 13:51
  • 11.07MB
  • 下载

在51testing上看到一篇非常好的介绍appium的文章--用Appium让Android功能自动化测试飞起来

转自:http://www.51testing.com/html/03/n-3719203.html,感谢原创作者的付出,本文章不做商业用途,仅为学习使用。 主要学习本文java测试用例的分层封装思...
  • tcp_westwood
  • tcp_westwood
  • 2018年02月02日 16:03
  • 42

hierarchyviewer和uiautomatorviewer获取控件原理

通过对hierarchyview的源码分析,我尝试用java写了一个测试工具,该测试工具简单的实现了连接ViewServer获取控件信息,然后根据控件信息的坐标属性来点击按钮。         ...
  • WHACKW
  • WHACKW
  • 2015年01月29日 09:50
  • 1666

UiAutomator源码分析之UiAutomatorBridge框架

上一篇文章《UIAutomator源码分析之启动和运行》我们描述了uitautomator从命令行运行到加载测试用例运行测试的整个流程,过程中我们也描述了UiAutomatorBridge这个类的重要...
  • zhubaitian
  • zhubaitian
  • 2014年10月28日 13:44
  • 7812

UIAutomator系列——UIAutomator源码分析之启动和运行(002)

通过上一篇《Android4.3引入的UiAutomation新框架官方简介》我们可以看到UiAutomator其实就是使用了UiAutomation这个新框架,通过调用AccessibilitSer...
  • wanglha
  • wanglha
  • 2015年01月08日 13:12
  • 625

uiautomator开源代码

  • 2015年07月08日 13:17
  • 87KB
  • 下载

uiautomator源码

  • 2015年01月15日 22:11
  • 100KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android自动化测试Uiautomator源码分析之一
举报原因:
原因补充:

(最多只允许输入30个字)