Android UiAutomator

  UiAutomator是一个做UI测试的自动化框架。《Android自动化测试框架》中已有详细介绍,这里就不再累赘了。

一、首先了解自动化测试流程

  • 自动化需求分析
  • 测试用例设计
  • 自动化框架搭建
  • 脚本编写
  • 测试运行
  • 结果分析

二、自动化测试框架的搭建

1.JDK 1.6以上

2.SDK (android sdk tools  revision21 or higher;android sdk platform API 16 or higher )

3.Eclipse (adt)

4.ANT

  接下来环境变量配置。1-3的环境变量配置详见《搭建Android开发环境》。这里讲一下ANT的环境变量配置。博主使用的eclipse是adt-bundle,也就是已经集成好的工具。先在Eclipse目录下搜索ant.bat,找到文件的位置。配置好变量之后,运行ant -h显示如图即配置成功。

变量名:ANT_HOME  变量值:ant.bat的路径,例如:E:\adt\eclipse\plugins\org.apache.ant_1.8.3.v201301120609

变量名:Path      变量值:%ANT_HOME%\bin;

Android UiAutomator

三、新建测试工程

1.打开eclipse,新建一个java工程->Package->Class

Android UiAutomator

2.导入android.jar和uiautomator.jar包(路径:sdk\platforms\android-20\)

Android UiAutomator

在libs文件中选择这两个jar包,点击右键出现Add to Build Path->点击即可

注:新建一个libs文件夹的目的是:将工程拷贝别人时,防止两个jar包的路径错误。

或者可以在工程名上点击右键->Properties->Java Build Path->Libraries

Android UiAutomator

四、编写脚本

用例:唤醒设备->打开设置->点击显示->设置字体->超大->截图->回到home界面

1.在SDK的tools目录下找到uiautomatorviewer.bat文件

2.Android设备通过USB连接电脑

3.运行uiautomatorviewer.bat文件,点击Device ScreenShot进行查看详情

Android UiAutomator

4.新建一个类继承UiAutomatorTestCase

5.编写脚本测试用例,方法名必须以test开头

附上脚本实例(比较简单):

package com.change.display;

import java.io.IOException;
import android.os.RemoteException;
import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase; public class Display extends UiAutomatorTestCase{
public void test1 () throws UiObjectNotFoundException, RemoteException, IOException{
//Device wake up
UiDevice.getInstance().wakeUp();
//sleep 3s
sleep(3000);
//Open the settings
Runtime.getRuntime().exec("am start -n com.android.settings/.Settings");
//Click on display
try{
UiObject display = new UiObject(new UiSelector().text("显示"));
display.click();
sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
//Select font
UiObject fs = new UiObject(new UiSelector().text("字体大小"));
fs.clickAndWaitForNewWindow();
//Change font
UiObject size = new UiObject(new UiSelector().text("超大"));
size.click();
//Screen shot
sleep(3000);
Runtime.getRuntime().exec("screencap -p /sdcard/test.png");
//Enter Home interface
sleep(3000);
getUiDevice().pressHome(); } }

注意:在代码有中文。首先需要改编码格式(UTF-8),否则会出乱码现象且不能运行。(右键点击工程名-propertise-Resource)

Android UiAutomator

五、编译运行脚本

1.创建编译文件:android create uitest-project -n <name> -t <target> -p <path>

-n <name>: name是指要生成的jar包的名字,自己定义的

-t <target>: target指的是android-sdk的ID。通过android list 查看id。

-p <path>指的是将要进行编译的工程路径。例如E:\adt\workspace\AutoTest

Android UiAutomator

注:id 所对应的API (sdk)尽量与导入的android.jar包和uiautomator.jar所在的SDK版本一致。

实例:android create uitest-project -n ChangeFont.jar -t 1 -p E:\adt\workspace\AutoTest

运行后会在AutoTest目录下生成如下图的3个文件。

Android UiAutomator

注:这里生成build.xml文件可能会出现如下图问题..Error:Could not access ....

Android UiAutomator

解决:可删除已存在的build.xml文件,再进行编译

2.编译:在AutoTest目录下cmd 中运行ant build。若编译成功,最后会显示BUILD SUCCESS且在AutoTest\bin目录下生成ChangeFont.jar文件;

反之显示BUILD FAILED。

本实例在此步骤出现的问题:显示Class not found:javac 1.8

Android UiAutomator

分析:Ant版本太低,可能与jdk 1.8不匹配。

解决:下载较新版本的Ant,配置好环境变量,重新运行ant build。编译成功

3.将打包好的jar包push到android设备中

adb  push E:\adt\workspaceAutoTest\bin\ChangeFont.jar  data/local/tmp

注:运行脚本时设备会优先到data/local/tmp下寻找jar包

4.运行,命令详解《Android “Command” from work summary

adb shell uiautomator runtest <jars> --nohup -c <packagename.classname>

实例:adb shell uiautomator runtest ChangeFont.jar --nohup -c com.change.display.Display

六、结果分析

先上图看下运行后显示的信息

Android UiAutomator

解释:numtests 运行的所有用例数量  stream 信息流与错误流

id 运行框架  test 用例名字  class 用例完整类名

current 当前正在运行第几条  CODE 状态信息

1.运行前打印当前用例信息

INSTRUMENTATION_STATUS: numtests=1  

INSTRUMENTATION_STATUS: stream=

com.change.display.Display:

INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner

INSTRUMENTATION_STATUS: test=test1

INSTRUMENTATION_STATUS: class="com".change.display.Display

INSTRUMENTATION_STATUS: current=1

INSTRUMENTATION_STATUS_CODE: 1

2.运行时打印运行信息

INSTRUMENTATION_STATUS: numtests=1

INSTRUMENTATION_STATUS: stream=.

INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner

INSTRUMENTATION_STATUS: test=test1

INSTRUMENTATION_STATUS: class="com".change.display.Display

INSTRUMENTATION_STATUS: current=1

INSTRUMENTATION_STATUS_CODE: 0

3.运行后打印结果信息

INSTRUMENTATION_STATUS: stream=

Test results for WatcherResultPrinter=.

Time: 13.147

OK (1 test)

INSTRUMENTATION_STATUS_CODE: -1

附:如果要终止测试该怎么实现呢?

@echo off
for /f "tokens=2 " %%a in ('adb shell ps -A^| findstr uiautomator') do (
adb shell kill %%a > nul
) pause

UI Testing

上一篇:python基础学习(十二)变量进阶


下一篇:编辑框等控件边框美化(继承CEdit,然后覆盖OnMouseLeave, OnSetFocus, OnPaint函数即可。原来的CEdit虽然代码不可见,但它也是有句柄的,照样随便画)