Robotium自动化测试框架实用教程

 一、简介

Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。

 

二、相关下载

源码获取:http://code.google.com/p/robotium/

源API文档:http://robotium.googlecode.com/svn/doc/index.html

 robotium5.1下载和最新API文档:http://pan.baidu.com/s/1bnlO8MF

官方例子记事本:http://pan.baidu.com/s/1qWLVL72

重签名工具:http://pan.baidu.com/s/1i3H0tKD

 

三、常用语法

?
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
<SPAN style= "FONT-SIZE: 14px" > 1 .等待timeout毫秒一个名字为name的Activity启动: waitForActivity(String name, int timeout) 
实例:assertTrue( "无法启动启动类" , solo.waitForActivity ( "MainActivity" , 30000 ));
  
2 .Robotium将睡眠设置的毫秒数:sleep( int time) 
实例:solo.sleep( 5000 )
  
3 .清空EditText的内容:clearEditText(android.widget.EditText editText) 
实例:solo.clearEditText((EditText)solo.getView ( "edtInsertName" ))
  
4 .根据按钮上的文字点击按钮:clickOnButton(String text) 
实例:solo.clickOnButton( "^绿色$" );
  
5 .根据文字点击控件:clickOnText(String text) 
实例:solo.clickOnText( "控件上显示文字" );
  
6 .输入内容:enterText(android.widget.EditText editText, String text) 
solo.enterText((EditText)solo.getView( "edtInsertName" ), "说些什么好呢?" );
  
7 .返回:goBack()
  
8 .截屏并保存为设置的名字:takeScreenshot(String name) 
默认保存在: /sdcard/Robotium-Screenshots/
  
  
9 .解锁屏幕:unlockScreen()</SPAN>

四、实战-针对APK进行的测试

 被测试项目为demo1,下面是实战的具体步骤

1. 配置ANDROID_HOME为android sdk的安卓目录,例如:D:\android-sdk

2. 在path下添加这两个:%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;

3. 需要把APK重新签名,因为robotium要求被测应用和测试代码要有一致的签名, 所以我们需要把下载到的apk,通过re-sign.jar来产生debug key的apk,这个重新生成的apk就会跟测试项目签名一致了

4. 下载完后,需要配置ANDROID_HOME,就是安卓SDK的位置,然后把APK拉到图标上,就会自动生成一个debug key的apk,如果无法直接单击re-sign.jar运行,需要切换到放置该jar文件的目录,cmd执行java -jar re-sign.jar产生新apk的过程中会弹出一个信息框,记得截下图,因为里面有两个信息我们等会的代码中需要用到

5. 安装产生的apk。然后打开模拟器(模拟器器一定要打开才能安装成功),然后打开命令行  adb install mitalk_debug.apk(新生成apk的名称) , 或者双击apk文件也可以安装

安装成功就可以再模拟器里看到该应用的图标了

6. 打开Eclipse,点击File->New一个Android Test Project  TestDemo1, 然后点击下一步的时候选择This project(因为我们测试的是APK),然后选择要在哪个android版本上测试

7. 在该项目下创建一个包,com.example.demo1.test,在该包下创建TestDemo1Apk类,如下

?
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package com.example.demo1.test;
  
import com.robotium.solo.Solo;
  
import android.test.ActivityInstrumentationTestCase2;
import android.widget.EditText;
  
@SuppressWarnings ( "rawtypes" )
public class TestDemo1Apk extends ActivityInstrumentationTestCase2 {
  
         private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.example.demo1.MainActivity" ; //启动类
  
         private static Class<?> launcherActivityClass;
         static {
                 try {
                         launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
                 } catch (ClassNotFoundException e) {
                         throw new RuntimeException(e);
                 }
         }
          
         @SuppressWarnings ( "unchecked" )
         public TestDemo1Apk() throws ClassNotFoundException {
                 super (launcherActivityClass);
         }
          
         private Solo solo;
          
         @Override
         protected void setUp() throws Exception {
                 solo = new Solo(getInstrumentation(), getActivity());
         }
  
  
         public void testcase001() throws Exception {
              //等待  Activity "MainActivity" 启动
             assertTrue( "无法启动启动类" , solo.waitForActivity( "MainActivity" , 30000 ));
             solo.sleep( 5000 );
  
           //输入文字:"131243"
             solo.enterText((EditText)solo.getView( "edtInsertName" ), "说些什么好呢?" );
             solo.sleep( 2000 );
              
             //清空输入框的内容
             solo.clearEditText((EditText)solo.getView( "edtInsertName" ));
              
              
             //按下 按钮 "绿色"
             solo.clickOnButton( "^绿色$" );
             solo.sleep( 2000 );
  
             //按下 按钮 "黄色"
             solo.clickOnButton( "^黄色$" );
             solo.sleep( 2000 );
  
             //按下 按钮 "蓝色"
             solo.clickOnButton( "^蓝色$" );
             solo.sleep( 2000 );
  
  
             //按下 TextView "看我变变变~~~"
             solo.clickOnText( "^看我变变变~~~$" );
             solo.sleep( 5000 );      
              
         }
          
  
    @Override
    public void tearDown() throws Exception {
                 solo.finishOpenedActivities();
  
   }
  
  
}

 

8.右键该项目,选择property然后选择java build path, 选择 Add JARs,选择下到的robotium.jar

Add Library,点击Junit,选择Junit4

 

9.在跑测试用例之前,还需要修改下AndroidManifest.xml文件的android:targetPackage为被测应用的根的包名

?
1
2
3
<instrumentation
     android:name= "android.test.InstrumentationTestRunner"
     android:targetPackage= "com.example.demo1" />

10.最后: run as android junit test,就可以进行测试了  

源码下载http://pan.baidu.com/s/1ybPUI

 

五、实战-针对工作目录下的项目

 被测试项目为demo1,下面是实战的具体步骤

1.新建一个测试项目名为demo1Test

Eclipse-File-Project-Android Test Project

测试项目名为demo1Test,测试目标项目选择demo1 

   

 

2.添加必要类库,robotium和junit

(1)在项目中新建lib目录,把robotium-solo-5.1.jar和robotium-solo-5.1-javadoc.jar拉进该目录。

(2)添加junit4

 

3.添加robotium

 

4.创建测试用例

右键点击包-New-JUnit Test Case

最基础的测试用例框架类

?
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
package com.example.demo1.test;
  
import com.example.demo1.MainActivity; //导入目标项目的启动类
import android.test.ActivityInstrumentationTestCase2;
import com.robotium.solo.Solo;
  
  
public class TestDemo1 extends ActivityInstrumentationTestCase2<MainActivity>{ //继承目标项目的启动类
  
     private Solo solo; //初始化一个solo对象
  
     public TestDemo1() { //在构造函数处标明继承自目标项目的启动类
         super (MainActivity. class );
     }
      
     @Override
     public void setUp() throws Exception { //在测试开始之前会调用这个方法,这里来创建一个Solo对象
         solo = new Solo(getInstrumentation(), getActivity());
     }
  
     @Override
     public void tearDown() throws Exception { //一个测试用例结束的时候会调用这个方法
         solo.finishOpenedActivities(); //这个方法将结束掉所有在测试执行过程中打开的activity
     }
  
  
  
}

在基础测试类里面添加相关的测试方法,也就是真正在执行的测试用例

?
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
54
55
56
57
58
59
60
61
62
63
64
package com.example.demo1.test;
  
import com.example.demo1.MainActivity; //导入目标项目的启动类
import android.test.ActivityInstrumentationTestCase2;
import android.widget.EditText;
  
import com.robotium.solo.Solo;
  
  
public class TestDemo1 extends ActivityInstrumentationTestCase2<MainActivity>{ //继承目标项目的启动类
  
     private Solo solo; //初始化一个solo对象
  
     public TestDemo1() { //在构造函数处标明继承自目标项目的启动类
         super (MainActivity. class );
     }
      
     @Override
     public void setUp() throws Exception { //在测试开始之前会调用这个方法,这里来创建一个Solo对象
         solo = new Solo(getInstrumentation(), getActivity());
     }
  
      
     public void testcase001() throws Exception {
          //等待  Activity "MainActivity" 启动
         assertTrue( "无法启动启动类" , solo.waitForActivity( "MainActivity" , 30000 ));
         solo.sleep( 5000 );
  
       //输入文字:"131243"
         solo.enterText((EditText)solo.getView( "edtInsertName" ), "说些什么好呢?" );
         solo.sleep( 2000 );
          
         //清空输入框的内容
         solo.clearEditText((EditText)solo.getView( "edtInsertName" ));
          
          
         //按下 按钮 "绿色"
         solo.clickOnButton( "^绿色$" );
         solo.sleep( 2000 );
  
         //按下 按钮 "黄色"
         solo.clickOnButton( "^黄色$" );
         solo.sleep( 2000 );
  
         //按下 按钮 "蓝色"
         solo.clickOnButton( "^蓝色$" );
         solo.sleep( 2000 );
  
  
         //按下 TextView "看我变变变~~~"
         solo.clickOnText( "^看我变变变~~~$" );
         solo.sleep( 5000 );      
          
     }
      
      
     @Override
     public void tearDown() throws Exception { //一个测试用例结束的时候会调用这个方法
         solo.finishOpenedActivities(); //这个方法将结束掉所有在测试执行过程中打开的activity
     }
  
  
  
}

源码共享:http://pan.baidu.com/s/1mgKcgju

 

六、一些特殊设置的说明

1.添加到库内需要先新建Lib目录,再把robotium-solo-5.2.1.jar放到里面,这样移动项目就不会找不到

2.测试项目的AndroidManifest.xml里面    <uses-sdk android:minSdkVersion="10" />需要在8以上,而且要跟被测试的项目一样大

3.需要勾选

 

4.最细节的就是:构造方法必须是无参数的,新建的测试用例一般都是有参数的:

public TestHelloWorldCase() {
super(HerlloActivity.class);
}

 

5.测试APK的时候需要重签名,然后再安装进去,才可以正常测试

 

6.如何配置Robotium的帮助提示

右键点击项目-Build Path-configure Build Path

 

 

7.robotium不同版本的方法不同

robotium的getCurrentListViews
1.版本3.6版本和4.1以上版本的表达方式

3.6版本:ArrayList<ListView> lw = solo.getCurrentListViews();

4.1版本以上:ArrayList<ListView> lw = solo.getCurrentViews(ListView.class);

还有如:

ArrayList<ImageView> imageList=solo.getCurrentViews(ImageView.class);得到的即是ImageView
ArrayList<ImageView> imageList=solo.getCurrentViews(ImageView.class,parentView);

 

8.如何获取控件ID-两种方法

(1)Android 实用工具Hierarchy Viewer实战

  • 是随AndroidSDK发布的工具,位置在tools文件夹下,名为hierarchyviewer.bat
  • 需要运行测试项目,在调试环境下才可以检测到模拟器的

(2)运行命令行记录log,然后点击对应Activity,接着可以在logcat看到

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值