android单元测试android环境,基于Robolectric的Android单元测试 —环境搭建与部署运行...
移动端的测试中,因为回归一些逻辑分支比较多的功能时工作量比较大,且不太适合用UI完成,尝试通过单元测试来完成。几经波折终于完成了一个功能的UT用例并在CI上部署运行,现总结如下:
一、Robolectric简介
Robolectric是一款运行在JVM之上的Android单元测试框架。传统的Android Instrumentation单元测试框架必须运行在虚拟机上,测试速度较慢,效率低。而Robolectric模拟了Android sdk的jar包,其会在JVM加载Android.jar包的时候,重写其中类的方法,让这些方法有返回值,不会抛出stub异常 ,或者利用Shadow Objects来模拟方法的实现。因此,Robolectric完全脱离了Android模拟器,用例的运行速度大幅提高。
二、本地环境搭建
在eclipse中导入或者新建被测android工程
在android工程的根目录下新建一个test文件夹,在test文件夹中新建src文件夹,用于存放测试代码
创建一个新的java工程
把java工程下默认的src移除bulid path(点击鼠标右键可见),把src删除
把android工程下的test/src文件夹,加到java工程来(点击鼠标右键,选择build path、link souce),就可以在java工程中看到测试代码了,但实质上代码是放在android工程的目录下的
Java工程,右键build path 、configure build path中,Projects里把android工程加进来,注意调整顺序使blog_android位于robolectric的下面
configure build path中,Add Library,把juint4加进来
java工程,把下面依赖的android包和robolectric包导入,可把依赖包存放在android工程的test/libs下。必须的包:android.jar、maps.jar、robolectric-2.4-jar-with-dependencies.jar
三、编写并运行用例
Robolectric是基于juint4的,所以样式类似于普通juint的单元测试,以下是一个简单的例子
@RunWith(RobolectricTestRunner.class)
@Config(emulateSdk=18)
public class ButtonTest {
ButtonActivity buttonActivity;
Button button1;
TextView textview;
@Before
public void setUp() throws Exception {
buttonActivity = Robolectric.buildActivity(ButtonActivity.class).create().get();
textview = (TextView) buttonActivity.findViewById(R.id.TextView1);
button1 = (Button) buttonActivity.findViewById(R.id.Button1);
}
@Test
public void buttontest() throws Exception {
button1.performClick();
assertEquals("你点击了开始按钮!", textview.getText().toString());
}
}
运行用例,run configuration设置,test下最下方Select选择Eclipse JUnit Launcher;Arguments里Working directory选择android工程。
当用于项目的时候还有一些需要注意的地方:
网上有的例子启动activity,使用buttonActivity = new ButtonActivity(),我试了下在robolectric-2.4-jar-with-dependencies包下是不行的;
如果配置的android sdk版本比较高,比如@Config(emulateSdk=21),运行用例会提示Robolectric还不支持;
Robolectric默认采用项目根目录下的AndroidManifest.xml和res资源文件,当采用上述方法运行用例时,则会采用android工程下的AndroidManifest.xml和res。如果不想用默认的,也可以指定文件:@Config(manifest = "",resourcesDir="")
运行用例的时候,Roblectric会先去创建Android工程的Application的实例。在实际的项目中,发现有一些清理的方法和xml的写法robolectric不识别,一种做法是在BeforeClass中把Application的class文件和需要修改的xml文件替换掉,在AfterClass中换回来。Robolectric也提供一种替换方式:@Config(application = CustomApplication.class)
四、CI部署与持续集成
采用ant编译运行测试代码,编写build构建文件。需要先编译开发代码,再编译测试代码,才能运行用例,target可以按照如下形式组织:
有几点需要注意的地方:
如果build文件没有放到android工程的根目录下且代码中没有指定res和AndroidManifest.xml,在运行测试用例前需要把android工程的res和AndroidManifest.xml拷贝到build文件的同级目录下;
classpath中junit.jar要位于android.jar之前;
编译和运行测试用例的classpath中需要包含编译开发代码的目标路径和开发代码的所有依赖jar包。
Jenkins上部署运行:虽然在本地创建了一个java工程,但其实代码源码是存放在android工程中的,因此只需要从git上更新android工程,然后ant运行build构建文件,最后再配置发送邮件。注意:生成R文件,如果运行用例的服务器是linux的,需要在工程根目录下手动创建gen文件,而windows下会自动创建。
本文来自网易实践者社区,经作者陈天昊授权发布。
android单元测试android环境,基于Robolectric的Android单元测试 —环境搭建与部署运行...相关推荐
- android美食app设计图,基于位置的Android美食地图应用的设计与实现
摘要: 随着近些年移动互联网的迅猛发展和智能手机的普及,手机应用迎来于广阔的发展空间,移动LBS应用应运而生.传统的位置服务主要以网页或单机的形式实现,已无法满足用户日益增长的移动需求.而移动LBS应 ...
- android 电视语音遥控器,基于遥控器的Android电视语音聊天系统及其方法与流程
本发明涉及,尤其涉及一种基于遥控器的Android电视语音聊天系统及其方法. 背景技术: 随着科技越来越发展,电视机的功能也越来越强大,对于电视机,相对于传统电视机的单纯看电视功能,现有技术中,还支持 ...
- android 动态更新配置文件,基于DX的Android动态更新技术
原标题:基于DX的Android动态更新技术 转自:文/Mob开发者平台 技术副总监 余勋杰 DX简介 安卓程序的主要代码是java 代码,不过由于安卓系统不直接使用sun的jvm,所以从javac编 ...
- 详解基于CentOS6.2下DNS主从复制搭建与部署
1)主从DNS--准备--DNS主从相关理论 1.什么是DNS? 简单的理解,Domain Name System,是互联网一项核心的服务,他作为一个桥梁可以将域名和IP地址相互因素的一个分布式数据库 ...
- lxc和android的双系统,基于LXC的Android系统虚拟化技术
近年来云计算[1]的快速发展,虚拟化技术[2]被广泛应用于高性能服务器,以提高系统资源的利用率.同时,随着智能手机等移动终端的普及[3],智能终端扮演着越来越重要的角色,用户对视频.微信.新闻浏览等功 ...
- android屏幕共享实现方式,基于WebRtc在Android端实现屏幕共享
注:本文默认你已经掌握了如何用WebRtc建立视频连接.如果没有,请参考https://www.jianshu.com/p/eb5fd116e6c8,这里将不再赘述. 第一步:向系统发起屏幕截取请求 ...
- android 即时通讯 xmpp,基于xmpp实现android端实现即时通讯
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 简单介绍一下asmack中常用到的方法属性 connection.getAccountManager().createA ...
- Linux配置gdal变量环境,基于GDAL库的LINUX环境下的FY-3D和FY-4A遥感数据处理
王燕婷 摘要 基于GDAL库的功能和其开源.可对栅格空间数据操作的特点,将GDAL与C++语言的完美结合,可极大得发挥其在开发遥感图像处理软件中的优势,并可跨平台应用于不同操作系统下的遥感图像数据处理 ...
- Python环境(基于Pycharm和官方python包)搭建顺序
1.下载安装包 python官网下载3.7.2 Pycharm 社区版下载安装 2.直接使用Pycharm自带virtualEnv File - Settings - Project - Projec ...
最新文章
- Nginx.代理MySQL
- CISCO与华为3COM路由器配置差别
- POJ 3278 Catch That Cow(BFS)
- Web 页面请求过程
- 从无到有整合SpringMVC-MyBatis项目(2):搭建SpringMVC项目
- visual studio开发工具的C#主流控件属性一览表
- Mac上自带的语音功能怎么用?让你的mac读给你听
- 用户体验的13条金科玉律
- 跟我从零基础学习Unity3D开发--NGUI入门基础
- html中http502怎么解决,Http Error 502 解决方法
- linux蓝牙遥控,蓝牙遥控器连接流程分析
- python 类调用不存在的方法_找不到Python方法,但在类中定义
- Tensorflow图像识别-2
- 长沙理工大学本科毕业论文答辩和论文选题PPT模板
- ng-bind、ng-value和ng-model
- 颜色转换公式大全及转换表格(31种)
- html表格单元格换行属性,CSS对表格单元格强制换行和不换行
- uniapp 微信云开发静态网站和云函数跳转小程序
- 【标准】Oracle Optimal Flexible Architecture(OFA)简介
- 中国物联网微控制器市场现状研究分析与发展前景预测报告(2022)
热门文章
- H264/H265之NALU结构(三)
- 二分查找时间复杂度分析
- Android Studio生成签名文件和自动签名
- SpringBoot设置外置tomcat
- tensorflow之安装opencv
- VMware之虚拟机迁移
- Educoder Basemap和seaborn 第三关:Basemap
- mysql longbolb_MySql基本数据类型及约束
- 车子前进档为什么往后退_「前推倒车·后拉加速」自动挡的档杆为什么设计的这么奇怪?...
- 伪元素写竖线_欧洲杯 | 让我们做个时髦伪球迷