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

上一篇文章中我们讲解了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 {@Testpublic 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 {@Testpublic 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的货怎么样呢?修改测试函数

/*** 单元测试,测试函数*/
@Testprivate 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之前验证一下这个正则表达式,直接运行项目也可以打,但是太慢了,有什么简单的方式能够验证呢?这时候就可以使用我们的单元测试了。

  • 编码

/*** 单元测试,测试函数*/
@Testpublic 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中配置测试方法

  • 执行单元测试会重新执行apk的编译,打包,安装操作,其优势是帮你免去了手动的打开某个页面执行某个操作的步骤。

另外对产品研发技术,技巧,实践方面感兴趣的同学可以参考我的:
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


---------------------
作者:一片枫叶_刘超
来源:CSDN
原文:https://blog.csdn.net/qq_23547831/article/details/51868451
版权声明:本文为作者原创文章,转载请附上博文链接!

[转]Android产品研发(十九)相关推荐

  1. Android产品研发(十八)--webview问题集锦

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们介绍了hybrid开发相关的知识.重点介绍了hybrid开发的概念,hybrid开发的作用,Android中如何实现hybrid开发,Android中实 ...

  2. Android产品研发(十)--尽量不使用静态变量保存数据

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android开发过程中几种常见网络协议:xml,json,protobuf等,以及它们各自的优缺点,一般而言当我们的App涉及到了网络传输时都会 ...

  3. Android产品研发(十七)--Hybrid开发

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们介绍了Android开发中经常会涉及到但又常常被忽视掉的开发者模式.主要讲解了包括如何打开手机的开发者模式,开发者模式中各个菜单的意义和作用,如何清除手 ...

  4. Android产品研发(二十)--代码Review

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了如何在Android studio中进行单元测试.实际开发过程中有一些功能性的需求,比如测试工具类,测试数据存储等测试工作,如果还是通过重复执行a ...

  5. Android产品研发(二十一)--Android中的UI优化

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android产品研发过程中的代码Review.通过代码Review能够提高产品质量,增强团队成员之间的沟通,提高开发效率,所以良好的产品开发迭代 ...

  6. Android产品研发(五)--多渠道打包

    转载请标明出处:一片枫叶的专栏 国内的Android开发者还是很苦逼的,由于众所周知的原因,google play无法在国内打开(翻墙的就不在考虑之内了),所以Android系的应用市场,群雄争霸.后 ...

  7. Android产品研发(八)--App数据统计

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们介绍了Android社区中比较火的热修复功能,并介绍了目前的几个比较流行的热修复框架,以及各自的优缺点,同时也介绍了一下自身项目中对热修复功能的实践.目 ...

  8. android 仿qq相册功能,Android第四十九期 - 仿QQ空间上传功能+本地数据库存储

    最近在看撸撸代码,他自己创了一种,网上有三种,分别是OpenDroid,greenDao,sugar,Sqlite原生写法,感觉都差不多,个人使用最优的是greenDao,下面开始介绍:    1.O ...

  9. 精通Android自定义View(十九)自定义圆形炫彩加载转圈效果

    1 效果 2 源码 public class JiondongView extends View {private Paint mBackgroundPaint;private float mScal ...

最新文章

  1. linux socket 套接字状态 EAGAIN EWOULDBLOCK EINTR 与非阻塞 简介
  2. P3 Simulink仿真-《Matlab/Simulink与控制系统仿真》程序指令总结
  3. 8.0ble设备 android_【胖猴小玩闹】智能门锁与BLE设备安全Part 4:一次BLE智能手环的小玩闹...
  4. 【svn老玩家翻车了,git玩的不够6】git恢复本地误删的文件
  5. DC guide ---8
  6. SpringSecurity分布式整合之jwt和rsa说明
  7. python 闭包和装饰器详解_实力讲解,一文读懂Python闭包与装饰器!
  8. Bots Inc宣布订购1000台比特币矿机,价值400万美元
  9. 西电华为交换设备配置(6506)
  10. Web Components 系列(五)—— 关于 Templates
  11. 1.Linux性能诊断 --- 入门命令100条
  12. koa2 从入门到进阶之路 (七)
  13. 区块链 FISCO BCOS网络端口讲解
  14. win10窗口设置眼睛保护色
  15. 菜鸟网络后端java 一面总结
  16. c 易语言置入代码6,易语言置入代码 , 谁碰到这种情况_精易论坛
  17. SpringCloud熔断机制大概什么意思
  18. 测试工程师职业要求汇总(转)
  19. Chat Top10 | 给面试官手写一个 Nacos,多少 K?
  20. 如何删除卸载苹果mac电脑应用软件没有残留垃圾

热门文章

  1. Blazor University (2)布局 — 创建 Blazor 布局
  2. Avalonia跨平台入门第十一篇之自定义Window
  3. 为什么中国这么多高薪程序员,开发不出Java, Typescript, Python, Rust, Node.js这些基础设施?...
  4. .NET 6新特性试用 | TryGetNonEnumeratedCount
  5. C#元组类型System.ValueTuple
  6. Docker小白到实战之容器数据卷,整理的明明白白
  7. NET问答: JS 中有 LINQ SelectMany 方法的等价实现吗?
  8. TIOBE 3月榜单:新功能将加入,C语言仍高居榜首
  9. 如何在 ASP.NET Core 中使用 ActionFilter
  10. GraphQL:面对复杂类型