近期因工作需要,分析了一些Android的测试框架,在这也分享下整理完的资料。

Android测试大致分三大块:

  1. 代码层测试
  2. 用户操作模拟,功能测试
  3. 安装部署及稳定性测试

代码层测试

对于一般java代码,采用传统的Junit测试,开发人员通常会编写重要接口和函数的白盒测试代码,不做过多讨论。

但因Android的特殊运行机制(Dalvik虚拟机),其中存在Application、Activity、Service等特殊组件,而这些组件都涉及到生命周期管理的问题。

为了对这些组件进行测试,Google提供了一套针对性的测试框架,AndroidTestFramework

官方教程链接 http://developer.android.com/training/testing.html

官方api http://developer.android.com/reference/android/test/package-summary.html

其中最为常用的就是针对Activity的测试,即ActivityInstrumentationTestCase2<T>类。

继承该类后可通过getActivity()方法获取Activity的一个mock对象,从而实现各种界面元素的测试。代码如下

public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
LoginActivityTest mActivity;
Button btnLogin;
public LoginActivityTest(){
super(LoginActivity.class);//必须实现super(testclass)
}
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
btnLogin = mActivity.findViewById(R.id.btnLogin);
}
public void testGetActivity(){
assertNotNull("can't get LoginActivity" , mActivity);
assertNotNull("can't get loginButton" , btnLogin);
}
}

需要注意的是,测试代码运行的线程并不是UI线程。因此如果需要对UI元素进行setText或是click之类的操作,需要通过getActivity().runOnUiThread(action)方法执行。代码如下

getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
btnLogin.click();
}
});

用户操作模拟,功能测试

虽然AndroidTestFramework可以帮助我们完成各种界面的测试。但是,这些代码的编写非常繁琐。而且在大部分情况下,我们需要的是一个连贯性的,在多个Activity之间存在跳转的业务流程测试。这种测试比较接近传统的白盒测试,只针对可见的UI元素进行操作,模拟用户的行为来完成测试。

Google同样为我们提供了一套专门针对UI元素的测试方案,具体可见http://developer.android.com/tools/testing/testing_ui.html

可是Google的这套UI框架仍然不是很友好。为此,我寻找了一些相对成熟的测试框架来帮助我们。经过一系列分析比较和实际代码测试,在这推荐采用Robotium开源框架做为今后一段时间内的主要业务测试框架。

Robotium介绍

Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。

源码及相关资料地址:https://code.google.com/p/robotium/

Robotium具有清晰的调用方法、良好的兼容性、完善的文档和大量的实际应用案例,并且支持截屏。最为符合我们目前的实际需求。经实际测试,无需特殊配置即可兼容Jenkins系统。
下面以一段HSA项目中的实际测试代码举例。该测试用例完成从登陆、菜单选取、一直到功能界面输入验证的一个流程。

public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
Solo solo;
LoginActivity mActivity;
public LoginActivityTest(){
super(LoginActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = getActivity();//初始LoginActivity
solo = new Solo(getInstrumentation(),mActivity);//初始Robotium的主要入口,solo对象
}
public void testLogin(){
//清除用户名EditText内容
solo.clearEditText(0);
//输入"userName" 到用户名EditText
solo.enterText(0, "userName");
//清除密码EditText内容
solo.clearEditText(1);
//输入"userPass" 到密码EditText
solo.enterText(1, "userPass");
//清除站点EditText内容
solo.clearEditText(2);
//输入"siteCode" 到站点EditText
solo.enterText(2, "siteCode");
//点击登陆按钮
solo.clickOnButton("登录");
//检验当前界面为MainListActivity
solo.assertCurrentActivity("Expected MainListActivity activity", "MainListActivity");
//点击动态菜单列表中的第一项,进入下一级子菜单界面
solo.clickInList(0);
//检验当前界面为SubMenuActivity
solo.assertCurrentActivity("Expected SubMenuActivity activity", "SubMenuActivity");
//点击子菜单列表中的第一项,进入功能界面
solo.clickInList(0);
//检验当前界面为ReceiveActivity
solo.assertCurrentActivity("Expected ReceiveActivity activity", "ReceiveActivity");
//点击界面中的"使用当前人员"按钮
solo.clickOnButton("使用当前人员");
//输入重量
solo.enterText(1, "123");
//输入单号
solo.enterText(2, "21123456798");
//模拟软键盘,发送EditText的ACTION_DONE事件
solo.getCurrentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
solo.getEditText(2).onEditorAction(EditorInfo.IME_ACTION_DONE);
}
});
//寻找是否有内容为"已扫描1件"的textview, 会自动等待10秒
boolean succ = solo.searchText("已扫描1件"))
//判断成功
assertTrue(succ);
}
}

可见,Robotium通过一个solo对象来进行各种事件的模拟,代码清晰易懂,并且完全兼容原生AndroidTestFramework

安装部署及稳定性测试

安卓系统最为让人诟病的问题就是碎片化,这点在中国比较明显。大致上,2.3.X 和 4.x 的系统各占半壁江山,此外还存在大量的山寨定制系统。

因此在这推荐两款云端测试工具,Testin和百度云测试。

两个框架测试都很简单,在官网注册账号后上传apk即可,网站会用大量的真机进行安装部署和monkey测试。测试完成后会发送一份测试给注册邮箱。

Testin支持Robotium框架的代码测试,同时上传项目apk和测试apk(相同签名)即可。

Testin地址: http://www.testin.cn/

百度云测试: http://mtc.baidu.com/

其他测试框架

Monkey测试

Android SDK开发包中自带一个monkeyrunner的工具,可用来进行monkey测试。
文档地址:

  • http://developer.android.com/tools/help/monkeyrunner_concepts.html
  • http://developer.android.com/tools/help/monkey.html

Robolectric

一款基于JVM运行的Android测试框架,最大特点就是不需要启动模拟器,因此速度非常快!
目前已支持大部分原生SDK功能的测试,支持Resource,但对于一些特殊硬件上的模拟还存在欠缺。期待进一步的完善
示例代码:

// Test class for MyActivity
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
@Test
public void clickingButton_shouldChangeResultsViewText() throws Exception {
Activity activity = Robolectric.buildActivity(MyActivity.class).create().get();
Button pressMeButton = (Button) activity.findViewById(R.id.press_me_button);
TextView results = (TextView) activity.findViewById(R.id.results_text_view);
pressMeButton.performClick();
String resultsText = results.getText().toString();
assertThat(resultsText, equalTo("Testing Android Rocks!"));
}
}

地址: http://robolectric.org/index.html

Google Espresso

Google于2013年10月开源的一款测试框架。据称在Google内部已通过多个项目的实际验证,并可能在未来加入到默认AndroidSDK中。
设计上接近Robotium,主要用于业务端的模拟行为测试。相较Robotium,具有更为强大的UI元素匹配寻找功能和更快的运行速度。
不过经过本人的实际使用,发现该框架的代码编写相对复杂,远不如Robotium来的轻巧。此外,该框架无法运行在默认AndroidTestFramework中(可认为是升级版),且因刚开源,缺少文档和应用案例等资料,导致测试代码编写效率相对低下,故暂时不予采用。
地址: https://code.google.com/p/android-test-kit/wiki/Espresso

Mockito

一款用于Mock测试的主流框架
地址: https://code.google.com/p/mockito/

  List mockedList = mock(List.class);
when(mockedList.get(0)).thenReturn("first");
System.out.println(mockedList.get(0));

总结

如无意外,接下来一段时间内,Android项目会采用以下的方案搭建测试框架:

  • 代码级: AndroidTestFramework + Junit
  • UI业务模拟: Robotium
  • 安装部署: Testin
  • CI: Jenkins

有兴趣的同学也可关注下Robolectric和Espresso两个框架的进展。

分类: Android

adndroid 开元框架相关推荐

  1. 开元系统2.0框架平台

    开元系统2.0框架平台发布. 用这个中间框架平台能够非常方便的搭建大型软件系统.功能模块都是以插件形式载入的.用时加载,不用时会自动释放内存,系统效率非常高.每个功能都能动态插拔,扩展性强.用这个中间 ...

  2. 阻焊机器人系统_开元阻焊公司成功中标烟台凌云和丹阳荣嘉机器人点焊工作站项目...

    2018年1月5日,开元阻焊公司成功中标烟台凌云9BYX门槛内板.外板点焊机器人工作站项目.迎来2018年度开门红! 2018年1月9日,又成功签署了丹阳荣嘉SV51点焊机器人工作站项目,创出开元阻焊 ...

  3. 我们离得开Spring框架吗?

    后端程序员,尤其是Java后端程序员,离得开Spring框架吗? 毫无疑问,答案是否定的.Spring 早已成为 Java 后端开发事实上的行业标准,无数的公司选择 Spring 作为基础的开发框架. ...

  4. 开源中国,开元软件和插件

    各种开元软件和插件 开源中国 里面又各种框架,各种插件,各种库

  5. R语言系统自带及附属包开元可用数据集汇总

    R语言系统自带及附属包开元可用数据集汇总 目录 R语言系统自带及附属包开元可用数据集汇总 #R自带数据集 #R的各种包自带数据集 #R自带数据集 向量 euro #欧元汇率,长度为11,每个元素都有命 ...

  6. 为全面硬件升级做好准备 鑫谷开元T1全塔机箱评测

    ▼前言 作为一个新手图文作者,奶爸大多数时间都是使用用笔记本+手机码字,台式机基本没在用,不过最近因为有学习视频制作的想法,工作室确实有一台几年前的老旧主机,除了硬件过时外没什么大毛病,但因为使用率低 ...

  7. 普元框架-那些年一起走过的坑

    普元框架-那些年一起走过的坑 普元框架一直因为网上指导性文章较少遭人病诟(当然,是相对于主流开源框架),本人一边学习一边自我反思,简单总结下来一些少见.无头绪的小问题,写下来以供留档,未免以后忘记. ...

  8. 计算机新教师汇报课报道,提升专业促成长—开元路小学开展新教师汇报课记实...

    (记者 张伟) 高效课堂是学生成长的保障,为不断提升教师的课堂教学能力和教学水平,促进青年教师成长,惠济区开元路小学于2020年10月,开展了新教师汇报课系列活动. 语文学科 在语文学科中,王慧娜老师 ...

  9. 中旅投资计划战略入股开元森泊,成为其第二大股东

    12月23日,中国旅游集团投资运营有限公司暨香港中旅国际投资有限公司(以下简称:"中旅投资")与开元旅业集团有限公司(以下简称:"开元旅业")在杭州开元森泊度假 ...

最新文章

  1. 使用SSH和Nginx做内网HTTP映射
  2. Tomaso A.Poggio教授丨人工智能的下一个突破点在何处?
  3. bootstrape实战案例_第二百五十二节,Bootstrap项目实战-首页
  4. 如何实现linux+windows双系统启动
  5. 《C和指针》学习备忘
  6. OCM备考 三. Managing Database Availability 之RMAN高级操作
  7. Apache JMeter:随心所欲进行负载测试
  8. C++ primer 第10章 泛型算法
  9. matlab gpu deep learning_优秀!这个库帮你使用GPU加速传统机器学习方法和Pandas数据处理...
  10. 设置UITableView Section的背景颜色和字体颜色
  11. WPS中表格中上下线的磅数调整问题-三线表制作
  12. 商品管理系统数据库设计--SQL Server
  13. python胶水语言融合其他语言_1. Python中如何使用其他语言?(python的胶水作用,python又叫胶水语言)...
  14. 用JS写一个《俄罗斯方块》小游戏
  15. 小鲲Python嘎嘎炫~day2
  16. 电脑文件管理,教你一键将大量文件夹名称翻译成英文
  17. 网络拨测DialTest简单介绍
  18. SQL数据库常用约束及建表、插入数据时注意事项
  19. 树莓派--seafile搭建私人网盘
  20. python中os库用法详解(总结)

热门文章

  1. 图像分类CNN经典网络(一)AlexNet与VGG
  2. Cropping multiple images the same way
  3. nfs-service
  4. ubuntu 修复grub
  5. 《学做智能车——卓晴》学习笔记(1)——智能汽车智能控制器方案设计
  6. android 获取剪切内容,Android Q 获取剪切板内容
  7. Android进阶之路 - Citypicker 五分钟内快速实现地址选择器
  8. excel批量添加超链接
  9. Diagnostic Log and Trace——dlt的编译和安装
  10. ICRA2021论文阅读-多传感器融合语义slam