Robotium和Espresso大PK——速度篇
引言
Espresso和Robotium都是android UI自动化测试框架,且都是建立在Android Instrument的基础之上。对于测试人员来说,UI测试应该具备如下三个特点:1. 容易编写;2. 运行速度快;可靠性高。本文正是针对“速度”做出的讨论。
Robotium作为早期Android世界里用得最为广泛的测试框架,基于JUnit扩展了大量关于Android UI的有效测试方法。
Espresso是一个新工具,相对来说,API更加精确,有助于开发者写出更简洁的针对APP的UI测试代码。Espresso的诞生,最大的优势就在于“快”。Robotium的测试代码中,通常会有大量的Sleep,waitFor,以此来等待控件的加载,否则极有可能失败。而Espresso则没有同步的烦恼,因此极大提高了测试速度。
对于大多数基于Android Instrumentation的测试框架(Robotium)来说,测试线程与UI线程是相互独立的,而Espresso则不同,运行时自动与UI线程同步,因此,Espresso的actions和assertions操作运行飞快。
下面,就让我们一起来感受一下“飞一般的感觉“!
测试手机:VIVO X520L——CPU:四核;内存:3GB
测试对象:NotePad——Robotium带源码的样例测试应用程序

测试内容:
- 新建文本Note 1,保存;
- 新建文本Note 2,保存;
- 检查Note 1和Note 2新建成功
- 点击进入Note 1文本,使用Menu删除;
- 长按Note 2进行删除。
- 检查Note 1和Note 2删除成功
测试代码
1. Robotium测试代码
public class NotePadRbot extends ActivityInstrumentationTestCase2<NotesList>{
private Solo solo;
public NotePadRbot() {
super(NotesList.class);
}
public void testAddNote() throws Exception {
//新建Note 1和Note 2,并判断是否成功
solo.clickOnMenuItem("Add note");
solo.enterText(0, "Note 1");
solo.clickOnMenuItem("Save");
solo.clickOnMenuItem("Add note");
solo.enterText(0, "Note 2");
solo.clickOnMenuItem("Save");
boolean expected = true;
boolean actual = solo.searchText("Note 1") && solo.searchText("Note 2");
assertEquals("Note 1 and/or Note 2 are not found", expected, actual);
//删除Note 1和Note 2,并判断是否成功
solo.clickOnText("Note 1");
solo.clickOnMenuItem("Delete");
boolean expected2 = false;
solo.clickLongOnText("Note 2");
solo.clickOnText("Delete");
boolean actual2 = solo.searchText("Note 1") || solo.searchText("Note 2");
assertEquals("Note 1 and/or Note 2 are found", expected2, actual2);
}
}
Robotium测试结果

2. Espresso测试代码
public void testClickButton() throws InterruptedException {
//添加note1
onView(isRoot()).perform(ViewActions.pressMenuKey());
onView(ViewMatchers.withText("Add note")).perform(ViewActions.click());
onView(ViewMatchers.withId(R.id.note)).perform(ViewActions.typeText("Note 1"),closeSoftKeyboard());
onView(isRoot()).perform(ViewActions.pressMenuKey());
onView(ViewMatchers.withText("Save")).perform(ViewActions.click());
onView(ViewMatchers.withText("Note 1")).check(ViewAssertions.matches(isDisplayed()));
//添加note2
onView(isRoot()).perform(ViewActions.pressMenuKey());
onView(ViewMatchers.withText("Add note")).perform(ViewActions.click());
onView(ViewMatchers.withId(R.id.note)).perform(ViewActions.typeText("Note 2"));
onView(isRoot()).perform(ViewActions.pressMenuKey());
onView(ViewMatchers.withText("Save")).perform(ViewActions.click());
onView(ViewMatchers.withText("Note 1")).check(ViewAssertions.matches(isDisplayed()));
//菜单删除note1和note2
onView(ViewMatchers.withText("Note 1")).perform(ViewActions.click());
onView(isRoot()).perform(ViewActions.pressMenuKey());
onView(ViewMatchers.withText("Delete")).perform(ViewActions.click());
onView(ViewMatchers.withText("Note 1")).check(ViewAssertions.doesNotExist());
onView(ViewMatchers.withText("Note 2")).perform(ViewActions.longClick());
onView(ViewMatchers.withText("Delete")).perform(ViewActions.click());
onView(ViewMatchers.withText("Note 2")).check(ViewAssertions.doesNotExist());
}
Espresso测试结果

小结
|
Robotium |
Espresso |
|
32.682 s |
5.694 s |
从表格中,我们可以清晰看到,执行相同的测试用例,Espresso的速度是Robotium的5.7倍。不同于Robotium的sleep/poll机制,Espresso完全受事件驱动,测试线程与UI线程同步,速度优势显著。
Robotium和Espresso大PK——速度篇的更多相关文章
- 普通方式 分页【NOT IN】和【>】效率大PK 千万级别数据测试结果
首现创建一张表,然后插入1000+万条数据,接下来进行测试. use TTgoif exists (select * from sysobjects where name='Tonge')drop t ...
- 让Quality Center走下神坛--测试管理工具大PK(转)
让Quality Center走下神坛--测试管理工具QC/ALM 和 RQM.Jira.TP.SCTM大PK 在写完了<让QTP走下神坛>之后,现在来谈谈测试管理工具,献给所有正在或打算 ...
- Webpack 打包优化之速度篇
在前文 Webpack 打包优化之体积篇中,对如何减小 Webpack 打包体积,做了些探讨:当然,那些法子对于打包速度的提升,也是大有裨益.然而,打包速度之于开发体验和及时构建,相当重要:所以有必要 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- 设计模式之结构类模式大PK
结构类模式大PK 结构类模式包括适配器模式.桥梁模式.组合模式.装饰模式.门面模式.享元模式和代理模式.之所以称其为结构类模式,是因 ...
- 设计模式之创建类模式大PK
创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...
- 第29章 跨战区大PK
29.1 策略模式 VS 桥梁模式 29.1.1 策略模式 [编程实验]用策略模式实现邮件发送 (1)有文本和超文本两种格式的邮件,将这两种格式封装成两种不同的发送策略. (2)文本邮件和超文本邮件分 ...
- 第28章 行为型模式大PK
27.1 策略模式 VS 命令模式 27.1.1 策略模式实现压缩算法 //行为型模式大PK——策略模式和命令模式 //实例:用策略模式实现压缩算法 #include <iostream> ...
- 第27章 结构型模式大PK
27.1 代理模式 VS 装饰模式 27.1.1 代理模式 (1)场景:客人找运动员代理要求安排运动员参加比赛 (2)说明:代理人有控制权,可以拒绝客人的要求,也可以答应安排,甚至自己下去跑(因为有些 ...
随机推荐
- springboot(三)SpringDataJPA完成CRUD
参考博客—恒宇少年:https://www.jianshu.com/p/b6932740f3c0 纯洁的微笑:http://www.ityouknow.com/springboot/2016/08/2 ...
- Mybatis(四)多表操作
数据库如下: 一.创建数据库所对应的bean类 public class User { private Integer uId; private String username; private St ...
- Linux系统查看硬件信息神器,比设备管理器好用100倍!
大家都知道,当我们的 Linux 系统计算机出现问题时,需要对其排除故障,首先需要做的是找出计算机的硬件信息.下面介绍一个简单易用的应用程序--HardInfo,你可以利用它来显示你电脑的每个硬件方面 ...
- 21天学通C++(C++程序的组成部分)
C++程序被组织成类,而类由成员函数和成员变量组成. 本章学习: 1)C++程序的组成部分. 2)各部分如何协同工作. 3)函数及其用途. 4)基本输入输出操作. C++程序划分为两个部分,以#大头的 ...
- JAVA基础1(语法)
一.标识符和关键字 在程序中用于定义名称的都为标识符,如文件名称.类名称.方法名称或变量名称等. 在Java中标识符的定义格式由字母.数字._(下划线),$所组成,其中不能重复,不能以数字开头,不能是 ...
- 面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用
原文链接:原文来自公众号:C you again,欢迎关注! 1.问题描述 "如何在Integer类型的ArrayList中同时添加String.Character.Boolean等 ...
- break statement not within loop or switch报错
break statement not within loop or switch. 注意你的循环,可能多加了个分号.for语句后面?
- Oracle帐户被锁了,如何解锁
原文链接:https://jingyan.baidu.com/article/25648fc144b76b9191fd0087.html 背景:Oracle帐户在密码被连续输入错误3次的情况下就会锁定 ...
- Maven——软件开发中一个神奇的项目管理工具
由于本人是从c++转入从事JAVA工作的 所以很多东西要从头学起,相信有很多跟我一样的人吧,那么我们一起来学习. 今天我们一起来认识下Maven这个工具,很多人可能会问题了,为什么说是工具呢?不是写代 ...
- Python获取当前时间_获取格式化时间_格式化日期
Python获取当前时间_获取格式化时间: Python获取当前时间: 使用 time.time( ) 获取到距离1970年1月1日的秒数(浮点数),然后传递给 localtime 获取当前时间 #使 ...