自动化测试Robotium实战学习

从什么是自动化测试开始

自动化测试就是通过一定的编程手段,自动执行本来需要手动执行的一系列测试的活动。

自动化测试和手动测试的对比:

  1. 执行速度快
  2. 可靠性高
  3. 复用性高
  4. 节省人力资源成本

移动端自动化测试工具的选择

  1. Appium:可以用来测试native、hybird和mobile web APP,最突出的一点是它既支持Android的自动化测试,也支持IOS的测试;另一方面是它支持使用不同的编程语言编写测试代码。缺点:稳定性有待提高。点此进官网
  2. Uiautomator:其是Google官方提供的一款自动化测试框架,主要特点是支持跨进程操作(这一点极大的方便了对应用外控件的操作)。缺点:只支持Android Platform、API16及以上,调试编译运行比较麻烦。具体可在官网查看
  3. Robotium:支持native和hybird的自动化测试,API使用起来方便简单,执行速度快,可根据控件ID操作;另外它既可以基于源码操作,也能基于APK测试,功能强大。缺点:不支持跨进程的操作;针对APK操作,而且需要对APK重新签名(有工具:re-sign),因此操作相对复杂。点此进官网
  4. 其他的自动化测试框架:monkey,monkeyrunner,Testdroid(商业)和Eggplant(商业)等。

Robotium版“Hello World”

基于源码自动化测试

  1. 搭建实战测试项目:在eclipse中依次选择File->New->Other->Android Test Project,一路点击next,添加Robotium.jar 5.6.3,在添加jar文件时应在java build path中查看,不然在初始化solo时容易碰到NullPointerException错误。
  2. 新建第一个测试用例:新建Java类,继承ActivityInstrumentationTestCase2< >.
    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
    //泛型写入需要测试的工程的入口activity名-LoginActivity
    public class TestCase1 extends ActivityInstrumentationTestCase2<LoginActivity> {
    private Solo solo;
    public TestCase1(){
    //LoginActivity是指启动的activity名称
    super(LoginActivity.class);
    }
    //实现测试前的初始化工作,JUnit框架下的方法
    @Override
    protected void setUp() throws Exception {
    // TODO Auto-generated method stub
    super.setUp();
    solo=new Solo(getInstrumentation(),getActivity());
    }
    //实现测试完成后的垃圾回收等工作,JUnit框架下的方法
    @Override
    protected void tearDown() throws Exception {
    // TODO Auto-generated method stub
    solo.finishOpenedActivities();
    super.tearDown();
    }
    //测试用例
    public void testTestCase1(){
    //不推荐通过index的方式找到控件,应通过ID的方式
    solo.enterText(0, "abcd");
    solo.enterText(1, "1234567");
    solo.clickOnButton(0);
    assertTrue("错误提示信息没有出现,可能出现bug",
    solo.searchText("用户名或者密码错误",true));
    }
    }

小结:在setUp()中实现一些前置动作,在tearDown()做一些恢复初始状态的动作,然后在test方法实现测试动作。

  1. 运行Robotium例子:在测试类中单击鼠标右键,选择Run As->Android JUnit Test.

基于APK的自动化测试

APK重签名:在基于APK的自动化测试过程中,需要确保被测试的APK必须与测试项目具有相同的签名。利用工具re-sign.jar,用法可自行Google。(re-sign重签名找的debug.keystore是位于C://User/.android下的,而eclipse的debug.keystore要与re-sign的一致

  1. 搭建项目和新建测试用例与上述一样

    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
    //该注解的作用是给编译器一条指令,告诉它对被注解的代码内部的某些警告保持静默
    @SuppressWarnings("rawtypes")
    public class FirstQunarTest extends ActivityInstrumentationTestCase2{
    private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME="com.Qunar.NoteActivity";
    private static Class<?> launcherActivityClass;
    /*static代码块(静态代码块):在类中独立于类成员的static语句块,可随便存放
    它不在任何的方法体中,JVM加载类时会按照它们在类中出现的先后顺序依次执行它们,
    并且只会执行一次*/
    static{
    try {
    launcherActivityClass=Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    @SuppressWarnings("unchecked")
    public FirstQunarTest(){
    super(launcherActivityClass);
    }
    private Solo solo;
    @Override
    protected void setUp() throws Exception {
    // TODO Auto-generated method stub
    solo=new Solo(getInstrumentation(),getActivity());
    }
    //测试用例:黑盒测试方式——无被测项目的源代码(基于APK)
    //robotium通过反射的方法来调用被测应用程序的代码(具体原理??)
    public void testCanOpenSettings(){
    if(solo.searchText("软件更新")){
    solo.clickOnView(solo.getView("button3"));
    }
    solo.pressMenuItem(0);
    }
    @Override
    protected void tearDown() throws Exception {
    // TODO Auto-generated method stub
    solo.finishOpenedActivities();
    super.tearDown();
    }
    }
  2. 运行Robotium例子:在测试类中单击鼠标右键,选择Run As->Android JUnit Test.

Robotium API简介

官网(http://recorder.robotium.com/javadoc/)