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

简介: 一、简介Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。

一、简介

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

目录
相关文章
|
3天前
|
设计模式 前端开发 JavaScript
自动化测试框架设计原则与最佳实践####
本文深入探讨了构建高效、可维护的自动化测试框架的核心原则与策略,旨在为软件测试工程师提供一套系统性的方法指南。通过分析常见误区,结合行业案例,阐述了如何根据项目特性定制自动化策略,优化测试流程,提升测试覆盖率与执行效率。 ####
21 6
|
3天前
|
人工智能 前端开发 测试技术
探索软件测试中的自动化框架选择与优化策略####
本文深入剖析了当前主流的自动化测试框架,通过对比分析各自的优势、局限性及适用场景,为读者提供了一套系统性的选择与优化指南。文章首先概述了自动化测试的重要性及其在软件开发生命周期中的位置,接着逐一探讨了Selenium、Appium、Cypress等热门框架的特点,并通过实际案例展示了如何根据项目需求灵活选用与配置框架,以提升测试效率和质量。最后,文章还分享了若干最佳实践和未来趋势预测,旨在帮助测试工程师更好地应对复杂多变的测试环境。 ####
18 4
|
9天前
|
机器学习/深度学习 前端开发 测试技术
探索软件测试中的自动化测试框架选择与优化策略####
本文深入探讨了在当前软件开发生命周期中,自动化测试框架的选择对于提升测试效率、保障产品质量的重要性。通过分析市场上主流的自动化测试工具,如Selenium、Appium、Jest等,结合具体项目需求,提出了一套系统化的选型与优化策略。文章首先概述了自动化测试的基本原理及其在现代软件开发中的角色变迁,随后详细对比了各主流框架的功能特点、适用场景及优缺点,最后基于实际案例,阐述了如何根据项目特性量身定制自动化测试解决方案,并给出了持续集成/持续部署(CI/CD)环境下的最佳实践建议。 --- ####
|
10天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
45 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
9天前
|
测试技术 API Android开发
探索软件测试中的自动化框架选择与实践####
本文深入探讨了软件测试领域内,面对众多自动化测试框架时,如何依据项目特性和团队需求做出明智选择,并分享了实践中的有效策略与技巧。不同于传统摘要的概述方式,本文将直接以一段实践指南的形式,简述在选择自动化测试框架时应考虑的核心要素及推荐路径,旨在为读者提供即时可用的参考。 ####
|
7天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
36 3
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
59 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
239 7
Jmeter实现WebSocket协议的接口测试方法
|
2月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
247 3
快速上手|HTTP 接口功能自动化测试
|
1月前
|
JavaScript 前端开发 API
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
40 0

热门文章

最新文章