移动端的测试中,因为回归一些逻辑分支比较多的功能时工作量比较大,且不太适合用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单元测试 —环境搭建与部署运行...相关推荐

  1. android美食app设计图,基于位置的Android美食地图应用的设计与实现

    摘要: 随着近些年移动互联网的迅猛发展和智能手机的普及,手机应用迎来于广阔的发展空间,移动LBS应用应运而生.传统的位置服务主要以网页或单机的形式实现,已无法满足用户日益增长的移动需求.而移动LBS应 ...

  2. android 电视语音遥控器,基于遥控器的Android电视语音聊天系统及其方法与流程

    本发明涉及,尤其涉及一种基于遥控器的Android电视语音聊天系统及其方法. 背景技术: 随着科技越来越发展,电视机的功能也越来越强大,对于电视机,相对于传统电视机的单纯看电视功能,现有技术中,还支持 ...

  3. android 动态更新配置文件,基于DX的Android动态更新技术

    原标题:基于DX的Android动态更新技术 转自:文/Mob开发者平台 技术副总监 余勋杰 DX简介 安卓程序的主要代码是java 代码,不过由于安卓系统不直接使用sun的jvm,所以从javac编 ...

  4. 详解基于CentOS6.2下DNS主从复制搭建与部署

    1)主从DNS--准备--DNS主从相关理论 1.什么是DNS? 简单的理解,Domain Name System,是互联网一项核心的服务,他作为一个桥梁可以将域名和IP地址相互因素的一个分布式数据库 ...

  5. lxc和android的双系统,基于LXC的Android系统虚拟化技术

    近年来云计算[1]的快速发展,虚拟化技术[2]被广泛应用于高性能服务器,以提高系统资源的利用率.同时,随着智能手机等移动终端的普及[3],智能终端扮演着越来越重要的角色,用户对视频.微信.新闻浏览等功 ...

  6. android屏幕共享实现方式,基于WebRtc在Android端实现屏幕共享

    注:本文默认你已经掌握了如何用WebRtc建立视频连接.如果没有,请参考https://www.jianshu.com/p/eb5fd116e6c8,这里将不再赘述. 第一步:向系统发起屏幕截取请求 ...

  7. android 即时通讯 xmpp,基于xmpp实现android端实现即时通讯

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 简单介绍一下asmack中常用到的方法属性 connection.getAccountManager().createA ...

  8. Linux配置gdal变量环境,基于GDAL库的LINUX环境下的FY-3D和FY-4A遥感数据处理

    王燕婷 摘要 基于GDAL库的功能和其开源.可对栅格空间数据操作的特点,将GDAL与C++语言的完美结合,可极大得发挥其在开发遥感图像处理软件中的优势,并可跨平台应用于不同操作系统下的遥感图像数据处理 ...

  9. Python环境(基于Pycharm和官方python包)搭建顺序

    1.下载安装包 python官网下载3.7.2 Pycharm 社区版下载安装 2.直接使用Pycharm自带virtualEnv File - Settings - Project - Projec ...

最新文章

  1. Nginx.代理MySQL
  2. CISCO与华为3COM路由器配置差别
  3. POJ 3278 Catch That Cow(BFS)
  4. Web 页面请求过程
  5. 从无到有整合SpringMVC-MyBatis项目(2):搭建SpringMVC项目
  6. visual studio开发工具的C#主流控件属性一览表
  7. Mac上自带的语音功能怎么用?让你的mac读给你听
  8. 用户体验的13条金科玉律
  9. 跟我从零基础学习Unity3D开发--NGUI入门基础
  10. html中http502怎么解决,Http Error 502 解决方法
  11. linux蓝牙遥控,蓝牙遥控器连接流程分析
  12. python 类调用不存在的方法_找不到Python方法,但在类中定义
  13. Tensorflow图像识别-2
  14. 长沙理工大学本科毕业论文答辩和论文选题PPT模板
  15. ng-bind、ng-value和ng-model
  16. 颜色转换公式大全及转换表格(31种)
  17. html表格单元格换行属性,CSS对表格单元格强制换行和不换行
  18. uniapp 微信云开发静态网站和云函数跳转小程序
  19. 【标准】Oracle Optimal Flexible Architecture(OFA)简介
  20. 中国物联网微控制器市场现状研究分析与发展前景预测报告(2022)

热门文章

  1. H264/H265之NALU结构(三)
  2. 二分查找时间复杂度分析
  3. Android Studio生成签名文件和自动签名
  4. SpringBoot设置外置tomcat
  5. tensorflow之安装opencv
  6. VMware之虚拟机迁移
  7. Educoder Basemap和seaborn 第三关:Basemap
  8. mysql longbolb_MySql基本数据类型及约束
  9. 车子前进档为什么往后退_「前推倒车·后拉加速」自动挡的档杆为什么设计的这么奇怪?...
  10. 伪元素写竖线_欧洲杯 | 让我们做个时髦伪球迷