编辑推荐: |
本文来自于博客园,介绍了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
三、常用语法
<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类,如下
package com.example.demo1.test;
import com.robotium.solo.Solo;
import android.test. Activity Instrumentation
TestCase2;
import android.widget .EditText;
@SuppressWarnings ("rawtypes")
public class TestDemo1Apk extends Activity Instrumentation
TestCase2 {
private static final String LAUNCHER _ ACTIVITY
_ FULL _ CLASSNAME = "com.example .demo1.MainActivity";
//启动类
private static Class <?> launcherActivity
Class;
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. wait ForActivity
(" 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为被测应用的根的包名
<instrumentation
android:name = "android.test .InstrumentationTest
Runner "
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
最基础的测试用例框架类
package com.example.demo1.test;
import com.example.demo1.MainActivity; //导入目标项目的启动类
import android.test.Activity Instrumentation Test
Case 2;
import com.robotium .solo.Solo;
public class TestDemo1 extends ActivityInstrumentation
TestCase2 <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
}
} |
在基础测试类里面添加相关的测试方法,也就是真正在执行的测试用例
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 Activity Instrumentation
TestCase2 <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 ("
edtInsert Name " ) );
//按下 按钮 "绿色"
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 = s olo.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看到 |