Android单元测试初探
Android下有很多单元测试的框架,这里简单介绍一下我最近使用的两个,android SDK自带的单元测试框架和Robolectric。
###AndroidTestCase AndroidTestCase使用JUnit框架进行单元测试,首先需要在gradle中进入依赖
testCompile 'junit:junit:4.12' androidTestCompile 'com.android.support.test:runner:0.4'
这里一定要引入com.android.support.test:runner
。然后在gradle中配置AndroidJUnitRunner
defaultConfig { minSdkVersion 14 targetSdkVersion Integer.parseInt(System.properties['compileSdkVersion']) versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
如果运行的时候出现runner找不到的情况,检查一下这里有没有配置。然后新建一个测试类TMConfigProcessUtilsTest
,代码如下
public class TMConfigProcessUtilsTest extends AndroidTestCase { @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void testIsMainProcess() throws Exception { assertEquals(true, TMConfigProcessUtils.isMainProcess(getContext())); } }
测试代码继承自AndroidTestCase,可以在setUp()方法中初始化一些变量。如果直接使用JUnit是无法获取context的,也就无法对android的代码进行测试,继承AndroidTestCase之后可以直接使用getContext()方法获取context。然后需要将Test Artifact切换成Android Instrumentation test。直接运行测试代码,结果如下。 会直接显示测试代码运行的结果,也可以导出到html中进行查看。
###Robolectric Robolectric 是一款Android单元测试框架,它可以直接运行在JVM之上,不需要真机或者模拟器。首先需要在gradle引入Robolectric的依赖。
testCompile "org.robolectric:robolectric:3.0"
新建一个测试类TMConfigStringUtilsTest
,代码如下
@RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk=21) public class TMConfigStringUtilsTest { @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void testIsEmpty() throws Exception { Assert.assertEquals(true, TMConfigStringUtils.isEmpty("")); } }
利用注解,指定TestRunner为RobolectricGradleTestRunner,之后在@Condig指定constants和SDK版本。如果这里不指定sdk版本,并且当前sdk版本高于21时会抛出java.lang.UnsupportedOperationException异常,这里很诡异,完整的异常是
java.lang.UnsupportedOperationException: Robolectric does not support API level 22.
Robolectric不支持API Level 22,所以这里必须加上sdk=21或其它支持的版本,指定sdk的版本。然后需要将Test Artifact切换成unit test。如果需要获取application可以直接调用RuntimeEnvironment.application
。
配置完成后在命令行中运行
gradle test
就会自动运行所有测试代码,如果不希望被某一个错误用例的断言中断运行,可以在后面加上--continue
。运行完成后,会在build/reports/tests/release/index.html中生成运行结果。 这里可以直接查看每个类运行的情况。
###对比 对android单元测试接触的时间比较短,简单做下对比,可以根据具体需要选择。
- AndroidTestCase需要实际的android环境,需要真机或者模拟器,一个字慢!Robolectric不需要android环境,运行起来很快。
- Robolectric虽然可以用
RuntimeEnvironment.application
获取application,但是从实际的运行结果来看这里应用并没有启动,所以就无法获取当前的进程名,在AndroidTestCase中的那个例子在Robolectric中是跑不过,在测试一些与运行时有关的方法可能会有问题。而继承自AndroidTestCase的测试代码需要在实际的系统环境中运行,没有这个问题。
###可能遇到的问题 + 找不到AndroidJUnitRunner,除了在gradle中配置,也需要在android studio中检查一下是不是已经配置了 + 在android studio中代码不可用。注意检查Test Artifact选择是否正确。android studio新建一个工程默认的文件结构是
androidTest中默认是与android相关的单元测试,即Android Instrumentation test,test默认是JUnit的测试代码,使用Robolectric需要切换到unit test。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 推送 整合小米、个推、jpush
Android系统由google提供的推送的服务在国内并不能很好的运作,因此不能像iOS能提供统一管理的推送服务。Android端推送目前常用的都是第三方推送服务,也可以自己搭建推送服务器来实现, 为了节约开发成本,目前主流的提供第三方推送服务的有:极光推送、个推、友盟、小米推送、百度推送等。 Android端推送分为通知,透传两种,通知是有通知栏显示的,透传由用户自定义处理,可以做静默,也可以自定义通知栏显示,个性化程度较高,点击的逻辑处理也比较方便。 iOS端推送的话,应用程序在前台的时候,推送通知有程序处理,当应用程序在后台的时候,由系统统一处理推送消息,此时可以配置静默推送,来处理通知栏的显示与否,这一点和Android一样,但是由于是系统统一处理,所以到达率有保证,这一点android端就比较麻烦了。 本文将整合小米、个推、极光推送,从而提高app推送的到达率。实践发现,由于Android系统的差异性,在Android单独使用某一个推送并不能很好的完成推送服务。原因就是因为某些厂商的android系统安全性比较高,当完全杀死进程后,将无法收到推送服务(例如小米、魅族)。需要用...
- 下一篇
浅谈3D Touch(1) -- Home screen quick action
1. 背景: 随着iOS9 和 iPhone 6s的普及,苹果官方提供的3D Touch将带给我们更好玩,更便捷的操作习惯,桌面快捷菜单可谓是3D Touch功能中最实用的一个,有了它,用户不再需要进入app后做额外的操作,便能快速进入指定的页面。 2. 前期工作: 由于手头“并(wo)没(xiang)有(yao)”iPhone 6s 的设备,很多人说,那我怎么开发这个功能呢?不怕,github上早有大神写好了模拟器的解决方案。按照这个文档上的方法依次执行,你的模拟器也能唤出快捷菜单。 3. 正式接入 ①.创建UIApplicationShortcutItem 我们先来看一下每个UIApplicationShortcutItem中能够包含哪些信息 key Description required UIApplicationShortcutItemType 事件的唯一标识,可以通过这个标识来辨别你具体点击了哪个事件 Y UIApplicationShortcutItemTitle 标题,在没有子标题的情况下如果标题太长能自动换行 Y UIApplicationShortcutItemSu...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7