-
Robotium
2016-11-21 11:19:59本文内容:基于Android Studio 的Android自动化测试框架Robotium的开发 版权声明:本文为原创文章,未经允许不得转载 博客地址:http://blog.csdn.net/kevindgk 简介 Robotium Robotium Recorder 一白盒...本文内容:基于Android Studio 的Android自动化测试框架Robotium的开发
版权声明:本文为原创文章,未经允许不得转载
简介
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 { // 启动Activity private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "***.SplashActivity"; private static Class<?> launcherActivityClass; static { try { // 通过反射的方法找到启动类的Class launcherActivityClass = 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); } @Override public void setUp() throws Exception { super.setUp(); // 创建测试的主要类Solo,并启动界面 solo = new Solo(getInstrumentation()); getActivity(); } @Override public 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() { @Override public boolean isSatisfied() { return tv_err_code.isShown(); } }, 10000); solo.sleep(1000); ... } }
4.安装apk进行测试
① 安装待测apk adb install 待测apk路径 安装完毕后,可以执行命令,来查看是否安装上了对应的InstrumentationTestRunner adb 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进行简单的黑盒测试的整个流程。
引用
联系方式
邮箱:815852777@qq.com
微信:
-
robotium
2017-10-12 18:52:54Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。 支持纯Android...Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。
- 支持纯Android应用、混合应用。
- 不需要对应用有深入的了解。
- 该框架可以自动处理多个Android 的Activity
- 快速写出测试用例
- 相当于标准的Instrumentation来说,测试代码的可读性得到了极大的改善
- 由于是运行时绑定UI组件,所以测试用例具有更好的鲁棒性(健壮)
- 测试用例执行非常快
- 可以和Maven、Gradle以及Ant更好的结合,成为可以持续集成的测试
-
robotium历史版本robotium-solo-jar
2019-04-19 18:25:01robotium-solo-5.1.jar robotium-solo-5.1-javadoc.jar -
Robotium-5.2.1
2016-10-14 11:55:19Robotium-5.2.1 -
robotium下载
2012-02-01 12:57:33android自动化测试工具robotium 3.1 -
Robotium教程
2012-08-07 13:53:21适用于初学者在Eclipse平台下运用Robotium建立起自动化测试框架 -
robotium solo的最新版本robotium5.6.2.jar包和javadoc包。
2018-05-21 10:22:11robotium solo的最新版本robotium5.6.2.jar包和javadoc包。 -
Add Robotium support
2020-12-26 02:36:28<div><p>Add a test project using Robotium and having a basic script.</p><p>该提问来源于开源项目:takimafr/androidkickstartr</p></div> -
Robotium 使用
2016-02-19 17:05:27Robotium是一个Android自动化测试框架,它具有对本地和混合应用的全面支持。对于Android应用程序 Robotium可以很容易地编写功能强大的自动化自动黑盒的UI试。Robotium支持测试用例开发人员可以编写功能,系统和用户...一开始我尝试了用espresso 对于一个Activity 里面有多个Fragment ,Fragment里面有pulltorefreshlistview 他们用到数据源还是一样的用onData非常麻烦果断放弃。google发现Robotium用得比较多果断尝试了一下 非常好用。
Robotium是一个Android自动化测试框架,它具有对本地和混合应用的全面支持。对于Android应用程序 Robotium可以很容易地编写功能强大的自动化自动黑盒的UI试。Robotium支持测试用例开发人员可以编写功能,系统和用户验收测试场景,跨越多个Activity。
github 地址: https://github.com/RobotiumTech/robotium
我是用Android studio 做的
gradle 引入:
在 dependencies 中添加 androidTestCompile'com.jayway.android.robotium:robotium-solo:5.5.4'
官方例子:
public class NotePadTest extends ActivityInstrumentationTestCase2<NotesList> { private Solo solo; public NotePadTest() { super(NotesList.class); } @Override public void setUp() throws Exception { //setUp() is run before a test case is started. //This is where the solo object is created. solo = new Solo(getInstrumentation(), getActivity()); } @Override public void tearDown() throws Exception { //tearDown() is run after a test case has finished. //finishOpenedActivities() will finish all the activities that have been opened during the test execution. solo.finishOpenedActivities(); } public void testAddNote() throws Exception { //Unlock the lock screen solo.unlockScreen(); solo.clickOnMenuItem("Add note"); //Assert that NoteEditor activity is opened solo.assertCurrentActivity("Expected NoteEditor activity", "NoteEditor"); //In text field 0, enter Note 1 solo.enterText(0, "Note 1"); solo.goBack(); //Clicks on menu item solo.clickOnMenuItem("Add note"); //In text field 0, type Note 2 solo.typeText(0, "Note 2"); //Go back to first activity solo.goBack(); //Takes a screenshot and saves it in "/sdcard/Robotium-Screenshots/". solo.takeScreenshot(); boolean notesFound = solo.searchText("Note 1") && solo.searchText("Note 2"); //Assert that Note 1 & Note 2 are found assertTrue("Note 1 and/or Note 2 are not found", notesFound); } public void testEditNote() throws Exception { //Long clicks on the second list line solo.clickLongInList(2); //Change title solo.clickOnText("Edit title"); //Hides the soft keyboard solo.hideSoftKeyboard(); //Change orientation of activity solo.setActivityOrientation(Solo.LANDSCAPE); //In first text field (0), add test solo.enterText(0, " test"); solo.setActivityOrientation(Solo.PORTRAIT); //(Regexp) case insensitive boolean noteFound = solo.waitForText("(?i).*?note 1 test"); //Assert that Note 1 test is found assertTrue("Note 1 test is not found", noteFound); } public void testRemoveNote() throws Exception { //(Regexp) case insensitive/text that contains "test" solo.clickOnText("(?i).*?test.*"); //Delete Note 1 test solo.clickOnMenuItem("Delete"); //Note 1 test should not be found boolean noteFound = solo.searchText("Note 1 test"); //Assert that Note 1 test is not found assertFalse("Note 1 Test is found", noteFound); solo.clickLongOnText("Note 2"); //Clicks on Delete in the context menu solo.clickOnText("Delete"); //Will wait 100 milliseconds for the text: "Note 2" noteFound = solo.waitForText("Note 2", 1, 100); //Assert that Note 2 is not found assertFalse("Note 2 is found", noteFound); } }
点击某个确定Id 的view
solo.clickOnView(solo.getView(R.id.text_send_to));
判断当前Actvity是否是CityListActivity
solo.assertCurrentActivity("expected CityList Activity", CityListActivity.class);
等待Tag为estates的Fragment加载好
solo.waitForFragmentByTag("estates");
等待Activity 加载完好
solo.waitForActivity(SkuDetailActivity.class);
Listview 某个Item 测试 (GridView 类似)
View view = solo.getView(R.id.city_list); ArrayList<TextView> tvs = solo.getCurrentViews(TextView.class, view); solo.clickOnView(tvs.get(0));
休眠1秒
solo.sleep(1000);
清空某个EditText
solo.clearEditText(contactEt);
填写某个EditText
solo.enterText(contactEt,"联系人");
listview 滑动到第一行
solo.scrollListToLine(lv, 1);
Listview滑动到底部
solo.scrollListToBottom(lv);
Tablayout 左滑
solo.scrollViewToSide(tabLayout, Solo.LEFT);
按返回键
solo.goBack();
-
Robotium's all-purpose ActivityMonitor breaks non-Robotium tests
2021-01-07 04:59:552. create a non-Robotium ActivityInstrumentationTestCase2 3. create an ActivityMonitor 4. make sure that the Robotium test is executed first What is the expected output? What do you see instead? both ... -
Robotium 介绍
2015-10-01 10:35:31Robotium 框架概述 Robotium是一款测试Android应用程序的开源的自动化测试框架(开源库)它是为了弥ActivityinstrumentationTestCase2(是Android单元测试框架Instrumentation的一个类)对集成测试不足而编写的。 ...Robotium 框架概述
- Robotium是一款测试Android应用程序的开源的自动化测试框架(开源库)它是为了弥ActivityinstrumentationTestCase2(是Android单元测试框架Instrumentation的一个类)对集成测试不足而编写的。
- Robotium除了在Instrumentation API的基础上提供了更多的操作控件的函数外,还通过反射等手段,通过调用系统隐藏的功能,实现Instrumentation不支持的功能。
- Robotium对Instrumentation封装比较强的地方是控件的搜索。
Instrumentation简介
- Instrumentation测试框架是Android测试环境的核心,在这个框架下测试应用可以精确的控制应用程序,Instrumentation测试框架通过将主程序和测试程序运行在同一个进程来实现控制应用程序的功能。
- Instrumentation可以直接控制Android组件的生命周期(通过调用Activity中的方法)
- Instrumentation可以发送UI事件给应用程序(sendKeyDownUp等一系列函数)
- Instrumentation可以在执行期间检查程序的状态。
InstrumentationTestRunner简介
- InstrumentationTestRunner通过解析获取和建立目标测试用例和测试集然后指导测试的运行。
- InstrumentationTestRunner会在目标应用代码运行之前调用onCreate方法,这个方法里又调用了Instrumentation的start()方法,这个方法是用来创建一个新的Instrumentation的线程来运行测试用例。
环境与搭建
- JDK的安装与设置
- 安装Eclipse+ADT插件
- 下载Robotium.jar包