近期因工作需要,分析了一些Android的测试框架,在这也分享下整理完的资料。
Android测试大致分三大块:
- 代码层测试
- 用户操作模拟,功能测试
- 安装部署及稳定性测试
代码层测试
对于一般java代码,采用传统的Junit测试,开发人员通常会编写重要接口和函数的白盒测试代码,不做过多讨论。
但因Android的特殊运行机制(Dalvik虚拟机),其中存在Application、Activity、Service等特殊组件,而这些组件都涉及到生命周期管理的问题。
为了对这些组件进行测试,Google提供了一套针对性的测试框架,AndroidTestFramework
官方教程链接http://developer.android.com/training/testing.html
官方apihttp://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测试。
文档地址:
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单元测试常用方法:http://blog.csdn.net/henry121212/article/details/7837074
android单元测试例子详解:http://www.360doc.com/content/12/0109/09/7635_178233787.shtml
Android单元测试初探——Instrumentation:http://www.oschina.net/question/54100_27061
如何进行Android单元测试:http://www.cnblogs.com/feisky/archive/2010/07/23/1783826.html
分享到:
相关推荐
将PC上的ExtentReports开源报告框架,移植到Android系统中运行,在解决与系统内置JDK兼容性问题后,生成HTML测试报告。.zip 适合学习/练手、毕业设计、课程设计、期末/期中/大作业、工程实训、相关项目/竞赛学习等。...
为了满足广大Android开发爱好者与从业者的学习需求,我们精心整理并上传了一份全面而实用的Android项目资源包。这份资源包内容丰富,涵盖了从基础知识到实战应用的全方位内容,旨在为开发者们提供一个便捷、高效的...
android开源链接 Docker 微信小程序 HTTP2.0 Android 性能优化 Android Hybrid&JSBridge技术 React Native 与 Weex 专题 Android插件化开发与动态加载 Android 热更新 Android 加固与反编译 Android Studio专题 ...
很好的电子书教程!...Android Android Android Android 学习方法 ① 了解什么是 Androi ② 建立开发环境 ③ 阅读 SDK 文档 ④ 背景知识 � Java � 面向对象 � 设计模式 � J2ME、Brew 、Symbian
目录一、Appium简介二、测试环境1. Appium-Client2. Appium-Server3. 移动设备三、软件配置1. Window系统配置2. Android Emulator配置2.1 移动...Appium是用于本机, 混合和移动Web应用程序的 开源测试自动化框架。它
� Android 是款开源的移动计算软件平台,组建了 google 主导的拥有众多产业界巨头的产业联盟,有利于 高效开发、降低成本。 � 由于是源代码开放的产品,对非主导厂商而言,可以避开与主导厂商在核心技术上面的差距...
· 应用程序框架 支持组件的重用与替换 · Dalvik 虚拟机 专为移动设备优化 · 集成的浏览器 基于开源的WebKit 引擎 · 优化的图形库 包括定制的2D图形库,3D图形库基于OpenGL ES 1.0 (硬件加速可选) · SQLite ...
使用google开源网络框架Volley 2.使用Bomb公司的云服务器SDK,不会服务器也能实现自己定制数据内容 3.实现第三方登录、百度定位、百度推送等功能(被QQ的sb开发平台给恶心到了,决定取消第三方登录) 4.实现类似朋友圈...
在本章的拓展思考部分,笔者提出了几个问题,旨在激发读者深入思考和学习Android的欲望。 本书特色 笔者认为,本书最大的特点在于,较全面、系统、深入地讲解了Android系统中的几大重要组成部分的工作原理...
E-Learn是一款适用于Android的漂亮的开源教育应用程序。 它是使用Dart在Google Flutter Framework之上构建的。 目录清单 演示版 屏风 探索 策划人 覆盖 影片 排行榜 全球排行榜 导航抽屉 搜索 搜索结果 轮廓 入职...
安卓orm框架,用得比较多的就GreenDao,Ormlite 安卓Json解析 Android 单元测试 Android 开源软件 Android 开发辅助工具 Android 推送(含IM) Android后端等服务 Android 应用内测平台 Android社会化分享,短信验证...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
12.6.2 s3c6410 Android overlay的测试代码346 第13章 openmax多媒体框架349 13.1 openmax基本层次结构349 13.2 分析openmax框架构成350 13.2.1 openmax总体层次结构350 13.2.2 openmax il层的结构351 ...
12.6.2 s3c6410 Android overlay的测试代码346 第13章 openmax多媒体框架349 13.1 openmax基本层次结构349 13.2 分析openmax框架构成350 13.2.1 openmax总体层次结构350 13.2.2 openmax il层的结构351 ...
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、... 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
安卓orm框架,用得比较多的就GreenDao,Ormlite 安卓Json解析 Android 单元测试 Android 开源软件 Android 开发辅助工具 Android 推送(含IM) Android后端等服务 Android 应用内测平台 Android社会化分享,短信验证...
于是分类汇总了那些不错的Android开源项目,供大家一起学习 欢迎大家推荐好的Android开源项目,请Star、Fork或在 中告诉我 :) 目前包括: 包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、...
实现用async-http 自定义的Retrofit 网络框架,用来进阶学习了解Retrofit内部原理 实现技术 反射,依赖注入,代理, 建造者模式,线程池队列, 接口回调等 用法 配置gradle >compile 'com.tamic:tamicLibrary:1.0.2'...
计算机毕业设计安卓android酒店管理系统正是为了此目的而设计的,本系统是基于springBoot框架,采用MVC开发模式,依托tomcat服务器,在MySQL数据库上实现,还采用了一些免费的辅助开源框架以及工具。系统有多用户...
安卓orm框架,用得比较多的就GreenDao,Ormlite 安卓Json解析 Android 单元测试 Android 开源软件 Android 开发辅助工具 Android 推送(含IM) Android后端等服务 Android 应用内测平台 Android社会化分享,短信验证...