Robotium体验—-白盒

Robotium体验—-白盒什么是Robotium?先说一下发音。音标类似于[rəʊbɒʃɪəm],可参照有道。Robotium是一款开源测试框架,官方定义为AndroidApp的黑盒测试框架(官方示例为白盒),适用于native/hybridapp。由于开源,该框架源码可以从github上获取,地址为https://github.com/RobotiumTech/robotium。若需要文档,j…

大家好,又见面了,我是你们的朋友全栈君。

什么是Robotium?

先说一下发音。音标类似于 [rəʊbɒʃɪəm] ,可参照有道

Robotium是一款开源测试框架,官方定义为Android App的黑盒测试框架(官方示例为白盒),适用于native/hybrid app。

由于开源,该框架源码可以从github上获取,地址为
https://github.com/RobotiumTech/robotium
若需要文档,jar包,或官网实例,也可以从WIKI中下载到,地址为
https://github.com/RobotiumTech/robotium/wiki/Downloads
到教程发布时为止,最新版本为5.6.3.

框架的特色有二,简单和录屏。
所有的功能几乎都存在于单个类(com.robotium.solo.Solo)中,结构清晰的见底!
录屏,则是通过Robotium Recorder完成的。

类似“欲练此功,必先自宫”的话,先说在前面,省得浪费时间。

框架的不足,个人总结有三!
其一,不能跨进程。
其二,签名要与测试APP一致。
其三,对于Android Studio来说,录屏功能有兼容性问题。

那么为什么要选Robotium?
理由没有绝对的。Robotium并非多高端,多流行,只是就个人而言,从Monkey到Instrumentation, 再到UIAutomator,操作从繁至简,而Robotium则到了极致。com.robotium.solo.Solo一个类,包括了所有功能接口。这对于需要快速开发的初学者而言,无疑是最便利的。

Robotium的框架结构

从Robotium文档中,可以看出框架的轻盈。总共就九个类,外加一个枚举,一个接口。

这里写图片描述

先来简单看一下各个类的用途。详细的用法,将在之后的篇幅中逐一介绍。

用途 方法
By 查询条件类,类似于UIAutomator的By类。只是,Robotium的By只用于查询WebElement对象. 例如,根据id获取web元素,或根据name获取web元素 8
Illustration 用于在屏幕上画点到点的路径 2
Illustration.Builder Illustration的工厂类 3
RobotiumUtils 用于对查找到的View列表,进行进一步的过滤和排序。 8
Solo Robotium的核心类,用于查找,滚屏,点击,等待等具体操作 216
Solo.Config Solo的内容类,用于Solo的默认设置。例如截图文件类型,log tag等,共12个成员变量 0
SystemUtils 用于控制WIFI和移动数据接口的开关 2
Timeout 用于设置/获取Timeout 4
WebElement 借由By对象查询到的WebView中的控件对象 17
Condition 接口 1
ScreenshotFileType 支持两种文件类型,JPEN和PNG 0

可见,除Solo外,其他都是辅助类。

Solo中除了构造函数外,共包含216个方法。数量虽然多,分类看一下,也便不复杂了。

这里写图片描述

架构框架清楚后,接下来的只是,对应需求,查找方法,然后正确使用。

一个简单白盒示例

Robotium在Getting-Started中提供了简单示例,分别对应不同的IDE,Eclipse和Android Studio。可以从github上下载获取,地址为:
https://github.com/RobotiumTech/robotium/wiki/Getting-Started
相应导入方法,Getting-Started也有说明,此处不再啰嗦。

需要指出的是,示例为白盒测试,且build tool和Robotium(5.6.0)版本相对较低,如果感兴趣的童鞋,可以对配置进行修改,自行调试。本段还是想从零开始。

我们用七步完成一个简单的白盒示例。
示例将打开一个Activity,并进行横竖屏旋转测试。

(1)创建工程。

创建一个名为robotiumDiary的android Project。该步骤,只需要遵循Android Studio的创建向导即可。
创建完毕后,工程目录结构如下:

这里写图片描述

其中,com.breakloop.robotiumdiary(androidTest)即为之后的工作目录。

唠叨:
androidTest目录下的测试,需要依赖设备运行环境。例如,打开某一APP,点击某一按钮等。test目录下的测试,将被运行在JVM中,无硬件或模拟环境要求。例如,测试加解密接口,查看运算结果等。

(2)为白盒测试,创建测试用Activity。

在com.breakloop.robotiumdiary下创建day1 package,并在该package下创建名为MainActivity的Empty Activity。
至此,测试对象准备完毕。

(3)添加Robotium引用。

在需要的Module中加入solo dependence。为使用Robotium提供前提。

dependencies { androidTestImplementation 'com.jayway.android.robotium:robotium-solo:5.6.3' }

注:Android SDK Build-Tool 27.0.3
(4)创建测试类。

在com.breakloop.robotiumdiary(androidTest)下,创建一个名为Day1的package,并在其下创建一个测试类,名为WhiteBoxTest,声明Runner为AndroidJUnit4。

@RunWith(AndroidJUnit4.class)
public class WhiteBoxTest{
...
}

唠叨:
AndroidJUnit4兼容JUnit4,若JUnit版本进行了更新,相应的AndroidJunit也会更新。

(5)获取Solo实例。

Solo共有5个构造方法,其中4个为public,但实际都是对private 构造方法的调用。

public Solo(Instrumentation instrumentation) 
public Solo(Instrumentation instrumentation, Activity activity)
public Solo(Instrumentation instrumentation, Config config)
public Solo(Instrumentation instrumentation, Config config, Activity activity)
private Solo(Config config, Instrumentation instrumentation, Activity activity)

其中,instrumentation可视为设备信息。熟悉UIAutomator的童鞋,对它应该也不陌生。

activity为将要测试的Activity,该对象不一定为Launch Activity。由于示例为白盒测试,在指定Activity时,需要使用ActivityTestRule。指定的Activity将在@Before前启动,在@After后关闭。

使用config为Solo的设置,例如是否打印测试log(默认不打印。但即使设置打印,有些真机也不会打印debug级别的log)等。

在WhiteBoxTest类中,添加如下代码。

private static Solo solo;

@Rule
public ActivityTestRule<MainActivity> activityTestRule=new ActivityTestRule<>(MainActivity.class);

@Before
public void initSolo(){
    Solo.Config config=new Solo.Config();
    config.commandLogging=true;
    config.commandLoggingTag="BlackBoxTest";
    solo=new Solo(InstrumentationRegistry.getInstrumentation(),config,activityTestRule.getActivity());
}

@After
public void closeSolo(){
    solo.sleep(2000);
}

代码中config.commandLogging,标识solo是否输出debug log。commandLoggingTag为log的Tag。

唠叨:
@Before,@End将在每个@Test前运行。三者皆为JUnit注释。

(6)编写一个简单的脚本。

@Test
public void Test1(){
    solo.unlockScreen();//解锁屏幕
    solo.sleep(1000);//等待1s
    solo.setActivityOrientation(Solo.LANDSCAPE);//横屏,宽>高
    solo.sleep(1000);//等待1s
    solo.setActivityOrientation(Solo.PORTRAIT);//竖屏,宽<高
    solo.sleep(1000);//等待1s
}

核心代码至此已完毕,就这么简单。

(7)运行示例

看一下运行效果

这里写图片描述
看一下运行结果

12-29 12:56:24.674 I/appproc: Command=app_process /system/bin com.android.commands.am.Am instrument -w -r -e debug true -e class com.breakloop.robotiumdiary.day1.WhiteBoxTest com.breakloop.robotiumdiary.test/android.support.test.runner.AndroidJUnitRunner 
12-29 12:56:28.070 I/TestRunner: started: Test1(com.breakloop.robotiumdiary.day1.WhiteBoxTest)
12-29 12:56:28.145 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onCreate
12-29 12:56:28.201 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onStart
12-29 12:56:28.206 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onResume
12-29 12:56:28.292 D/WhiteBoxTest: Solo(com.robotium.solo.Solo$Config@622c6c1, android.support.test.runner.AndroidJUnitRunner@fa39e66, com.breakloop.robotiumdiary.day1.MainActivity@60028cb)
12-29 12:56:28.349 D/WhiteBoxTest: initialize()
12-29 12:56:28.349 D/WhiteBoxTest: Solo(android.support.test.runner.AndroidJUnitRunner@fa39e66, com.robotium.solo.Solo$Config@622c6c1, com.breakloop.robotiumdiary.day1.MainActivity@60028cb)
12-29 12:56:28.349 D/WhiteBoxTest: unlockScreen()
12-29 12:56:28.350 D/WhiteBoxTest: sleep(1000)
12-29 12:56:29.350 D/WhiteBoxTest: setActivityOrientation(0)
12-29 12:56:29.916 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onPause
12-29 12:56:29.925 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onStop
12-29 12:56:29.927 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onDestroy
12-29 12:56:29.946 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onCreate
12-29 12:56:29.983 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onStart
12-29 12:56:29.989 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onResume
12-29 12:56:29.911 D/WhiteBoxTest: sleep(1000)
12-29 12:56:30.911 D/WhiteBoxTest: setActivityOrientation(1)
12-29 12:56:31.482 D/WhiteBoxTest: sleep(1000)
12-29 12:56:31.501 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onPause
12-29 12:56:31.510 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onStop
12-29 12:56:31.511 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onDestroy
12-29 12:56:31.540 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onCreate
12-29 12:56:31.609 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onStart
12-29 12:56:31.613 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onResume
12-29 12:56:32.483 D/WhiteBoxTest: sleep(2000)
12-29 12:56:34.503 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onPause
12-29 12:56:34.540 I/TestRunner: finished: Test1(com.breakloop.robotiumdiary.day1.WhiteBoxTest)
12-29 12:56:34.836 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onStop
12-29 12:56:34.837 I/com.breakloop.robotiumdiary.day1.MainActivity: Main Activity onDestroy

由于打开了solo的debug log开关,日志里显示了 solo的每一步操作。

从日志里,我们可以确认
(a)每次屏幕旋转,都会重绘一次Activity。
(b)MainActivity在@Before前启动。
(c)@After中只是sleep 2s,之后ActivityTestRule关闭了MainActivity。

小结

至此,对于Robotium的简单介绍完毕。相关的示例代码可以从https://github.com/SimuOn/robotiumDiary下载。本文只是一个开端,希望大家对Robitum有一个简单的认识。之后,我们将讲述如何使用Robitum进行黑盒测试。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160117.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java-Object转JSONObject

    Java-Object转JSONObject第一种方式importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;Objectimages=datum.getImages();if(null!=images){StringdoImages=(String)datum.getImages();charc=doImages.charAt(0);charb=doImages.charAt(d

    2022年4月29日
    76
  • 什么是pisa测试_PISA测试背后:哪些学校代表中国考第一

    什么是pisa测试_PISA测试背后:哪些学校代表中国考第一《21世纪经济报道》12月13日消息,在北京金融行业工作的王鑫如,去年女儿出生后就开始规划送她去哪里接受教育,留在北京,还是随着一个工作机会去香港,或者全家移民国外?她说,将来女儿读大学很大可能会去国外,但基础教育阶段有没有必要出去?中国的基础教育竞争力到底强不强?大学有各种国际排行榜单,不同国家的中小学质量要如何对比?12月3日公布的第七轮国际学生评估结果(ProgrammeforInter…

    2022年6月6日
    33
  • YUI Compressor插件压缩后war中的js/css文件未压缩的解决方法(被maven打包顶替了)

    YUI Compressor插件压缩后war中的js/css文件未压缩的解决方法(被maven打包顶替了)YUICompressorMaven插件可以压缩/合并js或css文件,经常用在Maven项目中,但最近发现在wabapp中执行了mvninstall命令进行发布之后,终端中显示插件已经执行了压缩的动作,但在输出文件夹或者war包中js和css文件都还是未压缩的原始文件。这样执行mvninstall命令之后发现虽然执行了压缩任务,但是在目标目录下和war包中的js和css…

    2022年7月18日
    22
  • java单例模式——详解JAVA单例模式及8种实现方式

    java单例模式——详解JAVA单例模式及8种实现方式##单例模式是最简单也是最基础的设计模式之一,下边一起学习一下单例模式!一.单例模式的定义:单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用

    2022年7月8日
    14
  • 安装 | MATLAB2020a (64位) 安装教程及安装包下载链接[通俗易懂]

    安装 | MATLAB2020a (64位) 安装教程及安装包下载链接[通俗易懂]博主github:https://github.com/MichaelBeechan博主CSDN:https://blog.csdn.net/u011344545Matlab2020a链接:链接:https://pan.baidu.com/s/1SfoNj2FC4XMfIbJluRuhUA提取码:解压密码:rjzkgzh<!!!!!!!!打赏后私信我,获取提取码!!!!!!!!!!!!!>打赏链接:https://blog.csdn.net/u011344545/artic

    2022年5月20日
    45
  • pycharm mac 激活码【2022.01最新】2022.03.12

    (pycharm mac 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M2OME2TZY-eyJsaWNlbnNlSWQi…

    2022年3月13日
    214

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号