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。直接运行测试代码,结果如下。 ut1会直接显示测试代码运行的结果,也可以导出到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中生成运行结果。 ut2这里可以直接查看每个类运行的情况。

###对比 对android单元测试接触的时间比较短,简单做下对比,可以根据具体需要选择。

  • AndroidTestCase需要实际的android环境,需要真机或者模拟器,一个字慢!Robolectric不需要android环境,运行起来很快。
  • Robolectric虽然可以用RuntimeEnvironment.application获取application,但是从实际的运行结果来看这里应用并没有启动,所以就无法获取当前的进程名,在AndroidTestCase中的那个例子在Robolectric中是跑不过,在测试一些与运行时有关的方法可能会有问题。而继承自AndroidTestCase的测试代码需要在实际的系统环境中运行,没有这个问题。

###可能遇到的问题 + 找不到AndroidJUnitRunner,除了在gradle中配置,也需要在android studio中检查一下是不是已经配置了 ut3+ 在android studio中代码不可用。注意检查Test Artifact选择是否正确。android studio新建一个工程默认的文件结构是
ut4
androidTest中默认是与android相关的单元测试,即Android Instrumentation test,test默认是JUnit的测试代码,使用Robolectric需要切换到unit test。

目录
相关文章
|
5月前
|
监控 安全 Android开发
【新手必读】Airtest测试Android手机常见的设置问题
【新手必读】Airtest测试Android手机常见的设置问题
186 0
|
5月前
|
Linux Android开发
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
92 0
|
1月前
|
Java 测试技术 Android开发
Android性能测试——发现和定位内存泄露和卡顿
本文详细介绍了Android应用性能测试中的内存泄漏与卡顿问题及其解决方案。首先,文章描述了使用MAT工具定位内存泄漏的具体步骤,并通过实例展示了如何分析Histogram图表和Dominator Tree。接着,针对卡顿问题,文章探讨了其产生原因,并提供了多种测试方法,包括GPU呈现模式分析、FPS Meter软件测试、绘制圆点计数法及Android Studio自带的GPU监控功能。最后,文章给出了排查卡顿问题的四个方向,帮助开发者优化应用性能。
118 4
Android性能测试——发现和定位内存泄露和卡顿
|
1月前
|
测试技术 Shell Android开发
Android 性能测试初探 (六)
本节聊聊性能测试的最后一项- 流量,当然我所指的性能测试是针对大部分应用而言的,可能还有部分应用会关注网速、弱网之类的测试,但本系列文章都不去一一探讨了。
48 6
|
1月前
|
JavaScript 测试技术 Android开发
Android 性能测试初探 (四)
本文介绍了GPU在移动端性能测试中的重要性,并详细解释了过度绘制、帧率和帧方差的概念。针对GPU测试,文章列举了三项主要测试内容:界面过度绘制、屏幕滑动帧速率和平滑度。其中,过度绘制测试需遵循特定标准,而帧速率和平滑度测试则可通过软件或硬件方法实现。在软件测试中,使用Systrace插件和高速相机是两种常用手段。对于不同机型,帧率及帧方差的测试标准也需相应调整。
39 5
|
1月前
|
测试技术 Shell Android开发
Android 性能测试初探 (三)
本文承接《Android性能测试初探(二)》,深入探讨CPU与内存测试。介绍了移动端内存测试的重要性及其测试目标,并详细列举了不同状态下应用内存消耗情况的测试项目。此外,还提供了多种内存测试方法,包括使用`procrank`等工具的具体操作步骤。最后,文章也简要提及了CPU测试的相关内容,帮助读者更好地理解Android性能测试的关键要素。
44 5
|
1月前
|
测试技术 Shell 定位技术
Android 性能测试初探 (五)
聊聊大家不常关注的测试项- 功耗
38 3
|
1月前
|
算法 测试技术 Android开发
Android 性能测试初探 (二)
上回大体介绍了下在 android 端的性能测试项,现在我们就细节测试项做一些阐述(包括如何自己 DIY 测试)
39 4
|
1月前
|
测试技术 API Android开发
Android 性能测试初探 (一)
Android 性能测试,跟pc性能测试一样分为客户端及服务器,但在客户端上的性能测试分为 2 类: 一类为 rom 版本的性能测试;一类为应用的性能测试。
45 3
|
1月前
|
Android开发
Android学习 —— 测试init.rc中的条件触发的处理顺序
Android学习 —— 测试init.rc中的条件触发的处理顺序