这两天在看原生的uiautomator的测试,之前也有使用,但是只是把Android官方的例子简单的实现一样,并没有什么实际的测试意思,Android官方的uiautomator例子的实现,今天结合最近正在做的自动化项目,简单的使用uiautomator来实现了一下,只是做了一个小例子,但是基本上都如何编译jar与运行调通了,这里也简单的记录一下。 之前也有使用别人封装好的python做过,那个写起来也比较简单,使用uiautomator的python封装进行android的UI测试

新建一个java工程

新建工程的时候要注意编码要是utf-8的,不然后面使用ant编译jar文件的时候会有问题. 引入JUnit与android.jar和uiautomator.jar,我使用的是api-16的jar,这个16要记住,后面生成build.xml有用 引入相应的库文件

创建测试类

新建的类要继承UiAutomatorTestCase类 我这个操作要用到am命令来启动手机急救箱和关闭急救箱,所以我创建一个util类来封了两个方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.yangyanxing.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiSelector;

public class TestUtil {
    
    public static String doCmdshell(String commond){
        String s = null;
        try
        {
            Process p = Runtime.getRuntime().exec(commond);
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

            String result = "";
            while ((s = stdInput.readLine()) != null)
            {
                result = result + s + "\n";
            }
            while ((s = stdError.readLine()) != null)
            {
                System.out.println(s);
            }
            return result;
        }
        catch (Exception e)
        {
            return "Exception occurred";
        }
    }
    
    //这个方法是在timeout的时间内等待ui元素的出现,出现了返回真,异常了或者超时了返回假
    public static Boolean waitForUiselectorAppears(UiSelector selector,int timeout)
    {
        UiObject uiObject = new UiObject(selector);     
        return uiObject.waitForExists(timeout*1000);
    }
    

}


写具体的测试方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.yangyanxing.test;

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 UitestRunner extends UiAutomatorTestCase {
    //初始化一个UiDevice
    private UiDevice mDevice = UiDevice.getInstance();
    
    public UitestRunner(){
        super();
    }
    
     
    
    //写setUp()方法
    public void setUp() throws Exception{
        super.setUp();
        //每次测试的时候都需要启动急救箱,所以将这个方法放到setUp里
        TestUtil.doCmdshell("am start com.qihoo.mkiller/com.qihoo.mkiller.ui.index.AppEnterActivity");      
    }
    
    //写tearDown方法,将急救箱force-stop
    public void tearDown() throws Exception{
        super.tearDown();
        TestUtil.doCmdshell("am force-stop com.qihoo.mkiller");
    }
    
    //检测急救箱启动后是否有"开始扫描"按钮

    public void test_startScanButton() throws UiObjectNotFoundException{
        UiSelector scanButton = new UiSelector().className("android.widget.Button").text("开始扫描");
        if(TestUtil.waitForUiselectorAppears(scanButton, 20)){
            UiObject scanoObject = new UiObject(scanButton);
            if (scanoObject.click()) {
                System.out.println("开始扫描 按钮被点击了!");
            }else{
                System.out.println("开始扫描 按钮点击失败了");
            }
        }else {
            System.out.println("急救箱启动失败");
        }
        
        UiSelector exitbutton = new UiSelector().className("android.widget.Button").text("退出");
        
        assertEquals(Boolean.TRUE, TestUtil.waitForUiselectorAppears(exitbutton, 120));
    }
}


使用android.bat生成build.xml文件

到android sdk目录的tools目录下,使用

android create uitest-project -n mkillerTest -t 2 -p D:\EclipseWorkPlace\uiautomatorTest`

命令生成build.xml

-n 为最终生成的jar包的名字,随意起 -t 为android targets的id,稍后说怎么获得 -p 为刚才创建的工程目录

-t 的值可以通过 sdk/tools 目录下的android list 来获得 android target的获取

刚才使用的uiautomator的api版本为16,那么对应这里的id值就是2

使用ant build…生成mkillerTest.jar文件

刷新eclipse里的工程目录,这个build.xml就会出来了, 右键build.xml选择Run as->Ant build…. 在Targets标签里勾选build[from imort${sdk.dir}/tools/ant/uibuild.xml] 然后点击run,如果没有错误的话最终会生成BUILD SUCCESSFUL的提示并且把jar文件位置打印出来 成功生成jar文件

将生成的jar push到手机里进行测试

使用adb push 命令将这个mkillerTest.jar推到手机的/data/local/tmp/目录下

adb push mkillerTest.jar /data/local/tmp/

运行测试

adb shell 到手机里,cd到/data/local/tmp目录下,也可以不cd 到这个目录(只要前面将.jar文件push到/data/local/tmp目录下也行),运行uiautomator命令进行测试

uiautomator runtest mkillerTest.jar

或者

uiautomator runtest mkillerTest.jar -c com.yangyanxing.test.UitestRunner

-c 命令为指定类来跑,当有多个类的时候可以选择只跑部分用例

运行结果

基本的流程就是这样,以后再扩展吧。

扩展

Uiautomator中watcher的使用