android产品研发(十九)-->android studio中的单元测试

转载请标明出处:一片枫叶的专栏

上一篇文章中我们讲解了webview中问题集锦,讲解了webview的性能优化、webview种入Cookie信息、activity退出的时候清除webview信息报错、如何通过java代码和js代码相互交互、webview如何下载文件以及腾讯的X5浏览服务等知识,这些都是我在使用webview中遇到的问题,难点,实践等,更多关于这些问题的说明,可以参考我的:android产品研发(十八)–>webview趟过的坑

本文我们将讲解如何在android studio中进行单元测试。在android开发项目中,经常会进行测试操作,而一次又一次的运行模拟器,浪费了大量时间,降低了工作效率降低,虽然最新的android studio中提供了instance run功能,来提高android studio的编译速度,但是我们还是需要了解android studio的单元测试功能,其可以很方便的为我们提供功能性测试,所以如果项目中有用到测试数据的时候,可以先进行单元测试,如果可以正常输出数据了,然后再到UI中执行,这样会提高一些工作效率。

什么是单元测试:

在讲解如何在android studio中进行单元测试之前我们先普及一下基本知识,即什么是单元测试,这里我先引用一下百科中对单元测试的描述:

是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

简单来说单元测试就是将一个软件功能拆分成N个最小的不可拆分的单元功能点,对着单元功能点的测试就是单元测试。

单元测试有什么作用:

android中的测试一般分为:功能测试,ui测试,单元测试等等;

由于app运行需要android运行环境,而我们的android的单元测试一般无法提供运行环境,所以一般像功能测试,UI测试等都需要在模拟器或者是真机上进行,但是一些功能性的需求不需要android环境的功能,如果也使用android studio重新编译运行,那么耗费的时间就太长了,一般来说一个apk文件编译,安装,运行的时间一两分钟都是普遍的,三四分钟也可能,这样为了测试一个简单的功能,就需要花费这么长的时间重新编译运行,性价比太低。

因此单元测试主要是功能测试,主要用于测试一些功能性的需求;比如网络请求,比如数据存储等等。

android studio对单元测试的支持:

新版的android studio中添加了对单元测试的支持;如图所示:

该目录下编写测试用例即可。

单元测试可以测试那些内容?

这里需要说明的是android studio的单元测试由于只是模拟android开发环境,但是其不是真正的android开发环境,所以不能测试UI功能,不能测试需要硬件支持的功能(比如蓝牙,wifi等),不能测试App跳转等等,那么其可以测试那些内容呢?

  • 测试一些数据性的功能,比如加载网络数据
  • 测试SharedPerferences,测试数据库,测试函数等
  • 工具类的测试,比如验证时间,转化格式,正则验证等等

简单的单元测试用例:

我们来看一下测试用例的写法:

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@MediumTest
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentationTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("uuch.com.android_activityanim", appContext.getPackageName());
    }
}

这是项目创建的默认的单元测试的类,可以看到其和普通的Class类无太多的区别,只是调用了相应的测试API而已,下面我们就自定义一个自己的单元测试类。

编写自定义的测试用例类:

  • 实现测试用例方法
/**
 * Created by aaron on 16/7/11.
 * 自定义的单元测试类
 */

@MediumTest
@RunWith(AndroidJUnit4.class)
public class MTest {

    @Test
    public void test1() {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();
        assertEquals("uuch.com.android_activityanim", appContext.getPackageName());

        Log.i("tag", "$$$$$$$$$$$$");
        assertEquals("result:", 123, 100 + 33);
    }
}

需要注意的是

  • 测试用例类需要使用注解:@MediumTest和@RunWith(AndroidJUnit4.class)
  • 我们所写的测试用例方法需要添加名称为Test的注解,否则的话,就找不到测试方法。

比如我们去掉注解Test的话:

再次执行的话,就找不到可执行的测试函数了。

还有一个问题,可以发现我们的函数都是这是的public的,如果我们设置我们的测试函数为private的货怎么样呢?修改测试函数

/**
 * 单元测试,测试函数
 */
@Test
    private void test2() {
        Log.i("tag", "$$$$$$$$$$$$");
        assertEquals("result:", 123, 100 + 33);
    }

执行之后可以发现:

报错了,错误说明也很详细,说的是我们的测试函数需要设置为Public的,所以我们在编写测试函数的时候需要注意两点:

  • 测试函数需要为public
  • 测试函数需要添加@Test注解

如何执行测试用例

  • 直接在源码中右键执行

编写完成之后,如何运行呢?

可以选中需要测试的方法名称,然后右击,弹出操作提示框,这是选择run 方法名就可以了,这时候就可以执行该测试方法了。

测试用例里面为我们提供了测试过程中可能需要的系统环境对象

比如:application,context等等;以后我们再次编写单元测试的时候是不是很方便了呢?

  • android studio菜单中执行测试用例

- 选择run-edit configuration

- 添加android tests用例

- 配置tests方法

点击ok,这时候run区域就已经出现了我们刚刚添加的测试用例了

一个简单的单元测试小例子:

说了这么多,我们还是举一个实力的开发例子吧。

  • 情景

    有这样的一种情况,我们在开发过程中需要使用正则表达式验证一个字符串,但是我们想在重新编译Apk之前验证一下这个正则表达式,直接运行项目也可以打,但是太慢了,有什么简单的方式能够验证呢?这时候就可以使用我们的单元测试了。

  • 编码
/**
 * 单元测试,测试函数
 */
@Test
    public void test2() {
        boolean result = "18210741899".matches("\\d{11}");
        Log.i("tag", "#####:" + result);
        /**
         * 验证邮箱
         */
        assertEquals("result:", result, true);
    }
  • 执行

这样我们就可以不启动我们的App就验证正则表达式的正确与否了。其中函数assertEquals为断言函数,用于判断结果是否正确,可以看到运行结果:1 test passed,说明我们的函数执行正确,即result为true,所以我们的正则表达式是正确的。

总结:

这样我们经过一系列的操作之后就介绍完了android studio中进行单元测试的步骤,怎么样?很简单吧,O(∩_∩)O哈哈~

  • android studio默认支持单元测试,可以在module下的androidTest下编写测试用例
  • 测试用例中提供了获取Context的API,可以通过该方法获取Context对象
  • 测试用例方法需要使用注解@Test表明,否则会报错,找不到测试方法
  • 测试方法需要定义为public,否则报错
  • 有两种执行测试方法的方式,可以直接在源码中右键执行,也可以在android studio中配置测试方法

另外对产品研发技术,技巧,实践方面感兴趣的同学可以参考我的:

android产品研发(一)–>实用开发规范

android产品研发(二)–>启动页优化

android产品研发(三)–>基类Activity

android产品研发(四)–>减小Apk大小

android产品研发(五)–>多渠道打包

android产品研发(六)–>Apk混淆

android产品研发(七)–>Apk热修复

android产品研发(八)–>App数据统计

android产品研发(九)–>App网络传输协议

android产品研发(十)–>不使用静态变量保存数据

android产品研发(十一)–>应用内跳转scheme协议

android产品研发(十二)–>App长连接实现

android产品研发(十三)–>App轮训操作

android产品研发(十四)–>App升级与更新

android产品研发(十五)–>内存对象序列化

android产品研发(十六)–>开发者选项

android产品研发(十七)–>Hybrid开发

android产品研发(十八)–>webview问题集锦



本文以同步至github中:https://github.com/yipianfengye/androidProject,欢迎star和follow


时间: 2024-12-22 15:44:14

android产品研发(十九)-->android studio中的单元测试的相关文章

android产品研发--&gt;总结(持续更新中)

转载请标明出处:一片枫叶的专栏 最近的android产品研发系列主要讲解的是android产品研发过程中涉及到的技术,技巧,实践等.前面我们讲解了android源码系列的文章,源码系列的文章东西比较多比较复杂,并且一些东西还没有讲完,这里已经更新了30篇了,后续的东西一定会更新的.考虑一直讲源码系列可能看的比较累,这里就有了产品研发系列的文章.本个系列的文章主要是讲解android产品研发过程中一些需要注意的技术技巧与实践.其主要面对产品研发,对App稳定性,友好型,兼容性要求较高的App. 下

android产品研发(九)--&gt;App网络传输协议

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了App的数据统计,其主要分为两种:使用第三方服务统计和自身实现数据统计.一般而言我们使用第三方统计服务已经可以很好的满足我们的也无需求了,只是部分数据敏感性App,可能自身实现数据统计服务是一个更好的选择. 而本文中将要介绍的是App端的网络传输协议.那么这里首先需要明确一点的是什么是网络传输协议呢?这里首先套用一段百度百科的定义: 网络传输协议或简称为传送协议(Communications Protocol[1] ),是指计算机通信的共同语

android产品研发(十六)--&gt;开发者选项

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了android中内存对象的序列化方式.由于android开发涉及到不同Activity的数据传递,对于基本数据类型数据的传递是没有问题的,但是一旦涉及到复杂数据类型,就需要将数据序列化以便传输,在文章中我们主要讲解了两种数据序列化的方式:实现Serializable接口和实现Parcelable接口,同时也比较了它们各自的优缺点和实现方式.具体关于内存对象序列化方面的知识可参考:android产品研发(十五)–>内存对象序列化 本文主要介绍A

android产品研发(十五)--&gt;内存对象序列化

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了android app中的升级更新操作,app的升级更新操作算是App的标配了,升级操作就是获取App的升级信息,更新操作是下载,安装,更新app,其中我们既可以使用app store获取应用的升级信息,也可以在应用内通过请求本地服务器获取应用的升级信息,并通过与本地app的版本号对比判断应用是否需要升级. 升级信息是app更新的基础,只有我们的app的升级信息指明需要更新,我们才可以开始后续的更新操作–也就是下载安装更新app.这里强调一点

android产品研发(十四)--&gt;App升级与更新

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了android app中的轮训操作,讲解的内容主要包括:我们在App中使用轮训操作的情景,作用以及实现方式等.一般而言我们使用轮训操作都是通过定时任务的形式请求服务器并更新用户界面,轮训操作都有一定的使用生命周期,即在一定的页面中启动轮操作,然后在特定的情况下关闭轮训操作,这点需要我们尤为注意,我们还介绍了使用Timer和Handler实现轮训操作的实例,更多关于App中轮训操作的信息,可参考我的:android产品研发(十三)–>App轮训

android产品研发(十二)--&gt;App长连接实现

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了android应用内页面跳转协议-scheme协议,通过该协议我们可以跳转至指定的Activity,并在该Activity中解析scheme用于跳转到指定的页面,我们可以利用scheme协议实现应用内页面跳转.H5页面与Native页面相互跳转.通知栏消息跳转相应页面等,具体可参考:android产品研发(十一)–>使用scheme实现页面跳转. 而本文中我们将讲解一下App的长连接实现.一般而言长连接已经是App的标配了,推送功能的实现基础

android产品研发(十)--&gt;不使用静态变量保存数据

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android中的几种常见网络协议:xml,json,protobuf等,以及各自的优缺点,一般而言主要我们的App涉及到了网络传输都会有这方面的内容,具体可根据项目的需求确定各自的网络传输协议.这里可参考android产品研发(九)–>App网络传输协议 而本文讲解的其实并不是一个技术方面,而是一个android产品研发过程中的技巧:尽量不使用静态变量保存核心数据.这是为什么呢?这是因为android的进程并不是安全的,包括applicat

android产品研发(十七)--&gt;Hybird开发

转载请标明出处:一片枫叶的专栏 上一篇文章中我们介绍了android开发中经常会涉及到但又常常被忽视掉的开发者模式.主要讲解了包括如何打开手机的开发者模式,开发者模式中各个菜单的意义和作用,如何清除手机App数据,以及清除手机App数据具体清除那些数据等知识点,具体关于android中开发者模式的知识,可参考我的:android产品研发(十六)–>开发者选项 本文将介绍android中hybird开发相关的知识点.hybird开发实际上是混合开发的意思,这里的混合是H5开发与Native开发混合

android产品研发(十三)--&gt;App轮训操作

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了android app实现长连接的几种方式,各自的优缺点以及具体的实现,一般而言使用第三方的推送服务已经可以满足了基本的业务需求,当然了若是对技术有追求的可以通过NIO或者是MINA实现自身的长连接服务,但是自己实现的长连接服务一来比较复杂耗时比较多,而且可能过程中有许多坑要填,一般而言推荐使用第三方的推送服务,稳定简单,具体管理长连接部分的模块可参考:android产品研发(十二)–>App长连接实现. 而本文将讲解app端的轮训请求服务,