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.等待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()

  

四、实战-针对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.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为被测应用的根的包名

    <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

最基础的测试用例框架类

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
	}

}

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

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看到

时间: 2024-08-10 08:39:37

Robotium自动化测试框架实用教程(图)的相关文章

Python 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)

目录 1.      写在前面 2.      开发环境 3.      大致流程 4.      框架简介 5.      运行结果展示 6.      文件与配置 7.      测试接口实例 n      1.登陆接口 n      2.支付密码更改接口 8.      数据库设计 9.      测试用例.测试数据准备 10.        模块与类.函数设计 11.        代码实现 a)         class congfighttp.ConfigHttp b)      

移动APP自动化测试框架

简介 移动APP的UI自动化测试长久以来一直是一个难点,难点在于UI的"变", 变化导致自动化用例的大量维护.从分层测试的角度,自动化测试应该逐层进行.最大量实现自动化测试的应该是单元测试,最容易实现也最容易在早期发现问题:其次是接口级测试,以验证逻辑为目的进行自动化,由于接口的相对稳定,自动化测试成本相对也可以接受:自动化成本最大的便是UI级自动化测试,然而UI界面是直接反馈给用户的效果展示,适度的尤其是BVT级的自动化测试也是非常必要的.本文通过分析几种自动化框架的异同,使测试人员

自动化测试框架对比(UIAutomator、Appium、Robotium)

一.原理 1.UiAutomator——基于UIAutomation的用户界面自动化测试框架,可以跨应用工作,谷歌亲生的. UIAutomation在Android4.3发布时有了新版本,官方简介:http://blog.csdn.net/zhubaitian/article/details/40504827. Android4.3之前:使用inputManager或者更早的WindowsManager来注入KeyEvent Android4.3之后:使用Accessibility APIs来注

[转]Android Studio 里搭建自动化测试框架Robotium

Android的自动化测试框架可选择的不多,后来选了Robotium(https://code.google.com/p/robotium/),它的语法及易用性挺像我们用在iOS里的KIF. 官方文档里面没有提到怎么在Android Studio里搭建它,后来在Stack Overflow找到个答案:http://stackoverflow.com/questions/23275602/robotium-with-android-studio/23295849#23295849 自己分析了下,要

Windows下部署Appium教程(Android App自动化测试框架搭建)

摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,appium是跨平台的,可以用在osx,windows以及linux系统上: ----------------------------------------------appium的一些基本概念---------------------------------------------- appium

python+requests接口自动化测试框架实例详解教程

转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的是java语言,但对于一个学java,却在学python的我来说,觉得python比起java更简单些,所以,我决定自

MAC中在eclipse luna上搭建移动平台自动化测试框架(UIAutomator/Appium/Robotium/MonkeyRunner)关键点记录

这几天因为原来在用的hp laptop的电池坏掉了,机器一不小心就断电,所以只能花时间在自己的mackbook pro上重新搭建整套环境,大家都知道搭建环境是个很琐碎需要耐心的事情,特别是当你搭建的安卓平台的时候经常需要翻墙,那个慢不是常人可以忍受的,所以过程中建议大家边看书或者玩手机边搭建,省得一直瞪着屏幕导致爆血管的意外发生. 这里本人尝试把在mac上搭建移动平台自动化测试框架的一些碰到的问题和关键点给描述一下,以方便后来者可以借鉴. 1. 如果你需要的是最新的eclise,那么不要去and

【python3+request】python3+requests接口自动化测试框架实例详解教程

转自:https://my.oschina.net/u/3041656/blog/820023 前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的是java语言,但对于一个学java,却在学python的我来说,觉得python比起java更简单些,所以,我决定自己写python的接口自动化测试框架,由于本人也是刚学习python,

Java自动化测试框架-03 - TestNG之Test Group篇 - 我们一起组团打怪升级(详细教程)

简介 其实这篇文章的group宏哥在上一篇中就提到过,但是就是举例一笔带过的,因此今天专门有一篇文章来讲解Group的相关知识.希望大家茅塞顿开 ,有着更进一步认识和了解测试组. 一.Test Group(测试组) TestNG 允许你将复杂的测试方法归类为不同的组.不仅仅是可以声明某个方法属于某个组,而且还可以让组包含其他的组.这样TestNG可以调用或者请求包含一组特定的组 (或者正则表达式)而排除其他不需要组的集合.这样,如果你打算将测试分成两份的时候,就无需重新编译.这个特点,会给你在划