Robotium

article/2025/10/3 22:25:46

本文内容:基于Android Studio 的Android自动化测试框架Robotium的开发

版权声明:本文为原创文章,未经允许不得转载

博客地址:http://blog.csdn.net/kevindgk

  • 简介
    • Robotium
    • Robotium Recorder
  • 一白盒测试
    • 创建Android项目
    • 安装Robotium插件
    • 启动插件
    • 开始录制脚本
      • 1 Runtime options 运行时配置
      • 2 Saved path - SDK和JDK路径
      • 3 License key - 证书购买后才会下发邮件
    • 保存脚本
  • 二黑盒测试
    • 开发步骤
      • 创建Android工程
      • 配置Gradle
      • 写测试代码并打包
      • 安装apk进行测试
    • 步骤分析
      • 创建Android工程
      • 配置Gradle
      • 写测试代码并打包
      • 安装apk进行测试
  • 引用
  • 联系方式

简介

Robotium

Robotium是世界领先的开源Android自动化测试框架。在2010年1月发布的第一个版本,目前最新的版本是5.6.3,增加了许多新特性和提升了很高的性能。通过使用Robotium,可以很容易的为android应用写出强大的和稳定的自动化黑盒测试用例,既支持纯Android应用,也支持混合应用(含H5页面)。

特点:

  • 支持纯Android应用、混合应用。
  • 不需要对应用有深入的了解。
  • 该框架可以自动处理多个Android 的Activity
  • 快速写出测试用例
  • 相当于标准的Instrumentation来说,测试代码的可读性得到了极大的改善
  • 由于是运行时绑定UI组件,所以测试用例具有更好的鲁棒性(健壮)
  • 测试用例执行非常快
  • 可以和Maven、Gradle以及Ant更好的结合,成为可以持续集成的测试

支持平台:Windows/Mac OSX/Linux

支持工具:Android Studio/Eclipse,推荐使用Android Studio,当成插件使用,特别方便

目前支持:录制Java脚本(收费)、使用JAR包开发测试用例(免费)

Robotium Recorder

Robotium Recorder是Robotium团队四五年以来对Robotium框架的可持续的创造和改造的成果,可以帮助我们快速的录制脚本,而且录制好的脚本个人觉得还是很棒的,经过适当的完善修改就可以输出稳定的测试用例,遗憾的是目前该服务是收费的,仅仅能体验一下。

一、白盒测试

1.创建Android项目

2.安装Robotium插件

在android studio中集成Robotium和集成其他的插件一样,File->Setting->Pluygins-Browse repositories,输入robotium,找到Robotium Recorder并点击安装,安装完重启即可。然后,该插件就会出现在Tools菜单中:

3.启动插件

安装完插件以后,使用ADB连接上手机或者模拟器,并且设备必须有外部存储。

点击Tools菜单中的Robotium Recorder,出现该插件的对话框,

此时选择有两个:

①点击”select apk”,选择APK,然后点击”Next”,最终会在本项目工程中创建一个module用来测试,此时做的就是黑盒测试;

②在中间的框内会出现本工程中包含的module,选中之后,该插件会自动打包成apk文件,点击”Next”,最终默认会在选中的module中的测试文件夹下生成测试用例,此时就是白盒测试。从测试的角度讲就是关联了源代码,从开发的角度讲,就是相当于单元测试。需要注意的时候,由于是该插件打包的,所以默认使用的是本地的原生的签名配置文件。

4.开始录制脚本

点击“Next”之后就会出现下面的对话框,先看一下Setting目录:

4.1 Runtime options 运行时配置

a.Use sleeps - 是否会使用sleeps方法,来保证回放测试用例的速度和录制的时候相同,该配置对那些带宽密集型或者混合App特别有用。简单讲,就是在生成的测试用例中调用sleep()方法来模拟用户录制时的操作间隔,如果不设置的话,该recorder只会捕捉到用户和Activity的动作,但是回放的时候会顺序瞬间执行。

b.Keep app data - 如果开启一个新的脚本录制的时候,是否保留App的数据。

c.Click and drag coordinates - 选择在点击和拖拽的时候是否录制坐标。

4.2 Saved path - SDK和JDK路径

4.3 License key - 证书(购买后才会下发邮件)

此时点击”New Robotium Test”就会自动进行开始脚本录制,流程如下:

1.打APK包adb shell am force-stop xxx
2.将APK包push到设备上adb push xxx.apk /data/local/tmp/xxx
3.从设备上安装APK包adb shell pm install -r "/data/local/tmp/xxx"
4.运行测试用例:adb shell am instrument -w -r -e debug false -e class xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

这些过程在控制台都可以看得到,会输出原始的命令,有利于我们了解robotium的整个流程。

当程序成功的安装到设备上并启动之后,在插件的对话框界面就可以看到有Activity启动了,然后就可以进行一些测试的操作,你会发现在该对话框中就会记录出操作的整个过程,比如打开了那个界面、点击了某个按钮、输入了什么内容等,这些都会转换成java测试代码,下次运行测试用例的时候,就会按照这个顺序进行测试。

5.保存脚本

测试结束后,点击Save,起个名字,就会自动生成测试脚本类,保存在src/androidTest目录中。

首先简要的分析一下该类:

  • 继承了ActivityInstrumentationTestCase2类,该类在android.test包下,泛型指的是需要进行测试的类,图中为登陆的测试用例,所以第一次打开的是SplashActivity。其实Robotium内部就是对Android的Instrumentation进行了2次封装,使其变得更加方便。
  • Robotium内部集成了Junit3,所以对junit熟悉的很容易看懂一些基本特点:setUp()启动测试用例、tearDown()测试结束、testRun()就是本测试用例中的一个测试过程,更为详细的特点见下文。

二、黑盒测试

开发步骤

1.创建Android工程

​ 要和测试的APK同包名,同签名

2.配置Gradle

android {...defaultConfig {...testInstrumentationRunner "android.test.InstrumentationTestRunner"}
}dependencies {...androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.6.2'
}

3.写测试代码并打包

​ 本工程项目主要是写测试代码,所以在androidTest/java/包下写代码,Android代码不用理会。写完测试代码后,执行命令打包测试apk。

gradlew assembleAndroidTest

4.安装apk进行测试

①安装待测apk
adb install 待测apk路径
②安装用于robotium测试的apk
adb install 测试apk的路径
③开启测试
adb shell am instrument -w 包名.test/android.test.InstrumentationTestRunner

等待片刻,就会自动执行测试apk中的所有的测试用例。

步骤分析

1.创建Android工程

要求测试工程和待测应用同包名,同签名。虽然安装到手机上仍然会识别为两个应用,但是如果测试应用和待测应用同时运行,由于他们具有相同的数字签名,Android系统的Instrumentation可以将它们加载到同一个进程中运行,这样的话,测试代码就可以获取到待测应用的数据,更为详细的过程可以研究系统的测试框架Instrumentation。

2.配置Gradle

testInstrumentationRunner "android.test.InstrumentationTestRunner"

如果需要使用Robotium,就必须使用android.test.InstrumentationTestRunner。简单讲,Instrumentation框架是android测试环境 的核心,在这个框架下,测试应用程序 可以精确控制应用程序。它可以理解为 一种没有图形界面的,具有启动能力的 ,用于监控其他类的工具类,其中的关键类就是InstrumentationTestRunner。

androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.6.2'

显而易见,表示加载android测试编译器,会导入robotium包。

3.写测试代码并打包

启动Splash界面,进入到登陆页面,模拟输入手机号,点击下一步按钮就会发送验证码,跳转到输入验证码的界面,仅仅给出前半部分逻辑,如下:

/*** 登陆的单元测试类* 测试模块:登陆和退出* 测试框架:Robotium* 测试性质:黑盒测试* <p>*/
public class LoginFirstTest extends ActivityInstrumentationTestCase2 {// 启动Activityprivate static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "***.SplashActivity";private static Class<?> launcherActivityClass;static {try {// 通过反射的方法找到启动类的ClasslauncherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}private static final String TAG = "LoginFirstTest";private Solo solo;public LoginFirstTest() {super(launcherActivityClass);}@Overridepublic void setUp() throws Exception {super.setUp();// 创建测试的主要类Solo,并启动界面solo = new Solo(getInstrumentation());getActivity();}@Overridepublic void tearDown() throws Exception {LogUtil.i(TAG, "tearDown");solo.finishOpenedActivities();super.tearDown();}public void testLogin() {//Wait for activity: 'SplashActivity'assertTrue("SplashActivity is not found!", solo.waitForActivity("SplashActivity", 10000));//Wait for activity: 'LoginActivity'assertTrue("LoginActivity is not found!", solo.waitForActivity("LoginActivity", 10000));solo.sleep(1000);EditText et_phone = (EditText) solo.getView("et_phone");TextView bt_next = (TextView) solo.getView("bt_next");//Enter the text: '187***1'solo.clearEditText(et_phone);solo.typeText(et_phone, "187***");solo.sleep(1000);solo.clickOnView(bt_next);solo.sleep(1000);//Wait for activity: 'VerificationActivity'assertTrue("VerificationActivity is not found!", solo.waitForActivity("VerificationActivity", 10000));EditText et_code = (EditText) solo.getView("et_code");final TextView tv_err_code = (TextView) solo.getView("tv_err_code");solo.enterText(et_code, "1234");solo.sleep(1000);solo.waitForCondition(new Condition() {@Overridepublic boolean isSatisfied() {return tv_err_code.isShown();}}, 10000);solo.sleep(1000);...}
}

4.安装apk进行测试

① 安装待测apkadb install 待测apk路径
安装完毕后,可以执行命令,来查看是否安装上了对应的InstrumentationTestRunneradb shell pm list instrumentation
结果中会列出手机上安装的所有的instrumentation测试程序,找到自己的,看是否正确:instrumentation:包名.test/android.test.InstrumentationTestRunner (target=包名)

上图中,第一个为”百度传课”的TestRunner,第三个是我进行测试的应用的TestRunner,显示正确。如果你发现你的是类似于途中的第二个,使用的是Android.support.test.runner.AndroidJUnitRunner,则表示没有配置,这个是Android Studio默认的JUnitRunner,进行junit测试的,需要在gradle中修改掉。

② 安装用于robotium测试的apk:adb install 测试apk的路径
可以执行命令列出所有的第三方应用,查看两个包是否安装成功,其中待测spk的包名为:"包名.test"
adb shell pm list packages -3③ 开启测试:adb shell am instrument -w 包名.test/android.test.InstrumentationTestRunner
稍等片刻,首先会启动测试程序,测试程序会去启动被测应用,然后模拟点击和输入,最终给出简单的测试结果。

以上就是使用Robotium进行简单的黑盒测试的整个流程。

引用

1.Robotium官方网址

2.Robotiu GitHub

3.安卓APP自动化测试(kevin公开课专辑)

联系方式

邮箱:815852777@qq.com

微信:


http://chatgpt.dhexx.cn/article/cpAMR0Rb.shtml

相关文章

ROS笔记(4) RoboWare Studio 的安装

ROS笔记(4) RoboWare Studio 的安装 1. RoboWare Studio的下载2. RoboWare Studio的安装3. RoboWare Studio的开启4.打开工作区1. RoboWare Studio的下载 RoboWare Studio是ROS的一款IDE,基于微软开源的VSCode开发,功能比较强大,使得开发更加快速、简单,是目前较好用的R…

RoboWare Studio入门教程(一)

部分参考&#xff1a;https://blog.csdn.net/qq_41450811/article/details/80305846 应该从ROS的通信机制开始说起&#xff0c;话题通信机制和服务通信机制&#xff0c;还有一种参数管理机制本次不予展开。 本次先以服务通信机制为例子。 服务&#xff08;Service&#xff0…

RoboWare安装教程

RoboWare Studio安装教程 通常ROS的程序都是用C和Python开发的&#xff0c;为了提高开发的效率&#xff0c;我们建议用IDE来写代码。目前在Ubuntu上已经有许多IDE支持ROS开发&#xff0c;比如Eclipse、Qt Creator。不过这些IDE配置起来会比较麻烦&#xff0c;推荐一款适配ROS的…

ROS IDE - RoboWare Studio 安装与使用教程

1. 安装&#xff1a; 去官网 http://www.roboware.me/#/ 下载安装包后正常安装即可。 2. 配置&#xff1a; 安装后会提示git不是最新版本&#xff0c;依次执行下面的命令可更新至最新版&#xff1a; git --version sudo add-apt-repository ppa:git-core/ppa sudo apt-get u…

ROS IDE —— RoboWare Studio

RoboWare Studio是ROS的一款IDE&#xff0c;但是它的功能又比较强大&#xff0c;使得开发更加快速、简单。 要安装RoboWare Studio&#xff0c;首先确保你的Ubuntu版本是14.04或者16.04版本&#xff0c;目前只支持这两个版本&#xff0c;并且完成了ROS的安装和配置&#xff0c…

RoboWare Studio的安装

RoboWare是什么&#xff1f; RoboWare Studio是国人开发的一个ROS系统IDE&#xff08;集成开发环境&#xff09;&#xff0c;基于微软开源的VSCode内核开发&#xff08;因此这个界面跟VSCode非常像&#xff09;&#xff0c;功能比较强大&#xff0c;使得开发更加快…

RoboWare Studio安装教程

RoboWare官网&#xff1a;http://www.roboware.me/#/home 选择合适的版本下载&#xff0c;注意32位与64位之分。下载完以后先不要着急安装&#xff0c;为了更好地使用RoboWare Studio&#xff0c;我们需要事先安装两个比较常用的插件。 1、为了支持Python调试功能&#xff0c;…

Roboware Studio教程 (ROS kinetic)

RoboWare Studio是一个ROS集成开发环境。它使 ROS开发更加直观、简单、并且易于操作。可进行ROS工作区及包的管理、代码编辑、构建及调试。 下载链接&#xff1a;https://pan.baidu.com/s/1D169dFyf2OD3SFBZVZy3pQ 密码&#xff1a;3iuk 准备 安装前&#xff0c;请查看系统…

roboware的使用

安装 roboware相当于一个专门适配ROS的vscode&#xff0c;功能性十分强大&#xff0c;几乎所有与ROS相关的操作都可以在IDE中完成。目前官网已经挂掉&#xff0c;可以选择百度云安装&#xff1a; https://pan.baidu.com/s/1D169dFyf2OD3SFBZVZy3pQ 密码&#xff1a;3iuk 或者去…

RoboWare Studio 安装教程与可能问题解决

一、下载RoboWare源码 途径1&#xff1a;官方GitHub连接&#xff1a;https://github.com/TonyRobotics/RoboWare 途径2&#xff1a;RoboWare官网&#xff1a;http://www.roboware.me/#/home &#xff08;我选择了途径1&#xff09; 下载完后解压&#xff0c;我们可以看到文…

round() 函数

查看更多 https://www.yuque.com/docs/share/50c54ca6-17b5-4a09-959b-d8be30a16520

RowBounds 的使用

generator 添加 查询的写法 offset偏移量 size 每页的大小

row_number() over (partition by order by desc)用法

转自https://www.cnblogs.com/linJie1930906722/p/6036053.html 分区函数Partition By的与row_number()的用法以及与排序rank()的用法详解(获取分组(分区)中前几条记录) partition by关键字是分析性函数的一部分&#xff0c;它和聚合函数不同的地方在于它能返回一个分组中的多…

row_number 语法

ROW_NUMBER()函数将针对SELECT语句返回的每一行&#xff0c;从1开始编号&#xff0c;赋予其连续的编号。在查询时应用了一个排序标准后&#xff0c;只有通过编号才能够保证其顺序是一致的&#xff0c;当使用ROW_NUMBER函数时&#xff0c;也需要专门一列用于预先排序以便于进行编…

row_number()函数

语法格式&#xff1a;row_number() over(partition by 分组列 order by 排序列 desc) SELECTROW_NUMBER() OVER(PARTITION BY sh.BUSMAIINFID ORDER BY nvl(sh.TIMESTAMP, sh.CREATEDATE) DESC)AS RN,sh.ORGID,sh.BUSMAIINFID,sh.TIMESTAMP,sh.CREATEDATE FROMREG_NETREGINFOA…

MyBatis中的RowBounds

如何分页查询 Mybatis如何分页查询&#xff1f;Mysql中可以使用limit语句&#xff0c;但limit并不是标准SQL中的&#xff0c;如果是其它的数据库&#xff0c;则需要使用其它语句。MyBatis提供了RowBounds类&#xff0c;用于实现分页查询。RowBounds中有两个数字&#xff0c;off…

row_number() over(partition by)整理

row_number() over(partition by)&#xff0c;作为oracle常用的分析函数&#xff0c;身为数据开发时必须要掌握的。不过一段时间不用&#xff0c;难免会有些忘记&#xff0c;今天整理一下一些场景下的用法。 现有表&#xff08;test_rownumber&#xff09;有如下数据&#xff…

Mybatis分页之RowBounds

Mybatis可以使用RowBounds进行分页 dao层 sql的xml文件&#xff0c;因为是java层面的分页&#xff0c;所以sql不需要分页 单元测试 因为参数是第几个开始&#xff0c;这样很不友好&#xff0c;我们一般情况分页是第几页开始&#xff0c;页大小是多少&#xff0c;所以这就需要我…

MySQL–ROW_NUMBER

MySQL–ROW_NUMBER 一、窗口函数 ​ 要讲row_number&#xff0c;首先得讲一下窗口函数。窗口函数&#xff0c;也叫OLAP函数&#xff08;Online Anallytical Processing&#xff0c;联机分析处理&#xff09;&#xff0c;可以对数据库数据进行实时分析处理。 ​ 窗口函数的基…

row_number() OVER(PARTITION BY)函数介绍

OVER(PARTITION BY)函数介绍 开窗函数 Oracle从8.1.6开始提供分析函数&#xff0c;分析函数用于计算基于组的某种聚合值&#xff0c;它和聚合函数的不同之处是&#xff1a;对于每个组返回多行&#xff0c;而聚合函数对于每个组只返回一行。 开窗函数指定了分析函…