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。

时间: 2024-10-07 06:15:01

Android单元测试初探的相关文章

浅谈软件测试串的Android单元测试

如果想在android里面做单元测试,有两条基本的路子可行. 第一,就是java程序员最为熟悉和常用的JUnit, 但是由于目前android sdk (version 1.1)中只是提供了stubbed methods/classes,没有具体的实现代码,所以如果用JUnit的话,我们需要在运行单元测试时,一定要 用JDK来运行,利用java命令来启动JUnit的某个Runner.如果是用Eclipse的话,可以在Run Configuration里新建一个JUnit.但是一定要记得在Clas

Android单元测试 - Sqlite、SharedPreference、Assets、文件操作 怎么测?

前言 上篇<Android单元测试 - 几个重要问题> 讲解了"何解决Android依赖.隔离Native方法.静态方法.RxJava异步转同步"这几个Presenter单元测试中常见问题.如果读者你消化得差不多,就接着看本篇吧. 在日常开发中,数据储存是必不可少的.例如,网络请求到数据,先存本地,下次打开页面,先从本地读取数据显示,再从服务器请求新数据.既然如此重要,对这块代码进行测试,也成为单元测试的重中之重了. 笔者在学会单元测试前,也像大多数人一样,写好了sql代码

[Android]单元测试实例

转自:http://yuanzhifei89.iteye.com/blog/1122104  作者:yuanzhifei  测试相关资源 让开发自动化: 用 Eclipse 插件提高代码质量http://www.ibm.com/developerworks/cn/java/j-ap01117/index.html  代码测试覆盖率介绍:http://www.cnblogs.com/coderzh/archive/2009/03/29/1424344.html  学习android单元测试时遇到的

Android单元测试 - 验证函数参数、返回值的正确姿势

前言 读者有没发觉我写文章时,喜欢有个前言.序?真相是,一半用来装逼凑字数,一半是因为不知道接下来要写什么,先闲聊几句压压惊^_^ 哈哈哈......该说的还是要说. 上一篇<Android单元测试 - Sqlite.SharedPreference.Assets.文件操作 怎么测?> 讲了一些DAO(Data Access Object)单元测试的细节.本篇讲解参数验证. 验证参数传递.函数返回值,是单元测试中十分重要的环节.笔者相信不少读者都有验证过参数,但是你的单元测试代码真的是正确的吗

图片-Android单元测试总是出错 求大神教导

问题描述 Android单元测试总是出错 求大神教导 解决方案 http://www.51testing.com/html/65/n-848765.html

十九、Android Activity初探

原文:十九.Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供一个可视的窗口,一般情况下这个窗口会覆盖整个屏幕,但在某此情况下也会出现一些比屏幕小的窗口飘浮在另外一个窗口上面.                 接下来我们为Android应用添加一个新的Activity                  第一步.新建一个继承Activity的类,如:MainAc

android 单元测试

一.Android单元测试 基本流程 新建一个测试工程( Android Test Project),选择你要测试的工程,或者说你要测试的类所在的工程,创建测试用例,如果有需要还可以建立TestSuite来配置要测试的用例,最后右键选择测试用例类,run as – >"Android Junit Test" 即可.然后你也可以直接在被测试工程中测试,这样不需要建立测试工程. 1.建立测试工程 图 1 2.选择要测试的工程 图 2 3.选择目标平台 图 3 4.选择finish后,

Android单元测试框架 Robolectric

Android开发者们注意了,这款测试框架一定会让你们兴奋不已,因为它是一款已基本上摆脱了模拟器测试的老套路的速率单元测试框架.Robolectric可以解压Android SDK,还能直接对应用进行测试,从而帮你轻而易举地解决所遇到的任何问题. Robolectric 是一款Android单元测试框架,示例代码: @RunWith(RobolectricTestRunner.class) public class MyActivityTest { @Test public void click

Android 单元测试如何输出测试日志

问题描述 xml,html都行需要跑在Jenkins上的,我也不是特别懂具体的东西,老大要的,路过的大婶给指条明路 问题补充:可能我表达的不是很清楚,在ant进行自动化测试的时候并把测试结果用xml文档的形式输出,我的想法是这样的,不知道可行吗? 解决方案 android 单元测试 直接用junit啊 单元测试输出日志public class MyTest extends AndroidTestCase{private final static String TAG = "myTag"