像 google 一样测试系列之六: 实战篇

作者:郑小辉 团队:腾讯移动品质中心TMQ

前言

Mock和反射执行,会穿插在各章节中,因此不单独成节了。

一、purify 业务代码结构分析

Purify 架构改革后,结构不再是一般的Activity和里面事件点击了,而是加入了引擎。

目前的架构如下:

可以看到:

1、弱化了Activity

2、统一用引擎加载Page

3、在各page中定义各view组件,并在自定义组件中实现事件。

4、Activity的入口 就变成了page的入口

二、测试切入点

以上结构分析可知: 测试切入点为 page。

三、测试工程建立与创建Test

1、测试目录建立

Android studio 给每一个module已经默认建立好测试工程了,如下图:

AndroidTest目录:为Instrumented Test,Android层的测试,运行在真机或模拟器上,主要写集成用例和涉及Android组件和环境的一些用例。比如Application,Activity,Service,SharedPreferences等。

Test目录: 为Local Unit Tests,java层的测试,部分依赖Android环境的测试。主要写java的单元测试,不同链路的接口测试,依赖Android环境较单一的测试。

2、测试库依赖

工欲善其事,必先利其器。先把需要的依赖库加进来。

修改build.gradle,增加如下内容:

指定Junit4运行器

testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'

有混淆的时候,指定混淆文件:

加入依赖库:

到此,测试环境步骤已经搭建完毕。可以开始创建测试用例了。

3、创建Test

Android studio上,打开你想要写用例的业务代码,按ctrl+shift +T,就会弹出创建测试用例框,选择create new test。

在弹出框上,选择你要测试的方法。

测试环境支持如下几种:用Junit还是Testng,见前面文章说明。

建议:为了保持test和AndroidTest的统一,建议统一用Junit4。

弹出选择是创建Instrumented tests还是 local unit Tests:

(1)根据被测方法情况选择对应目录;

(2)也可以直接选androidTests,因为local unit Tests可以运行在androidTests中。

4、运行Test

(1)运行 test目录下的测试用例: 右键 选择run xx,就可以直接运行。

(2)运行androidTest目录下的测试用例: 先连接手机或模拟器,再运行。

测试代码空白处,右键,选择run xxx,就可直接运行了。快去试试你第一个测试用例吧。

四、Application级白盒测试

1、方式一:

新建Junit测试 java类。

如业务Application中含有如下方法:

则测试代码如下:

2、方式二:

因为可以调用业务代码。如果业务Application中有单列获取,则可直接调用获取。

五、Activity的白盒测试

假设Activity如图:

对应的page如图:其中 method都是private方法。都被UI层调用。

则method测试代码如下:

带参数测试:

六、异步线程的白盒测试

通常android开发中使用异步的方式有如下几种:

1、new Thread()及单例方式

2、handle.post方式

3、AsyncTask方式

4、ExecuteService方式

这里选取常见的1种方式举例:

handle.post方式

业务代码handle如图:可以看到handle是内部new的。

则测试代码如下:

七、异步回调的白盒测试

业务代码如下: 异步方法中,接收一个callback,现在要测试这个异步方法,思路见前章节。

则测试代码如下:

八、覆盖率与测试报告

1、覆盖率情况:

还未完全写完用例的情况下, 白盒测试实践模块覆盖率50%。

2、测试报告

Test和androidTests报告是分开的,不过可以开发代码合并成一个报告:

搜索微信公众号:腾讯移动品质中心TMQ,获取更多测试干货!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏chenssy

【死磕Sharding-jdbc】---异步送达JOB

当最大努力送达型监听器多次失败尝试后,把任务交给最大努力送达型异步JOB任务处理,异步多次尝试处理;核心源码在模块 sharding-jdbc-transact...

932
来自专栏云知识学习

LVM 详细介绍

LVM是逻辑盘卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和 分区之上的一个逻...

44621
来自专栏架构师小秘圈

设计和实现一款轻量级的爬虫框架

作者:王爵nice ,来自架构文摘(ID:ArchDigest) 说起爬虫,大家能够想起 Python 里赫赫有名的 Scrapy 框架, 在本文中我们参考这...

2875
来自专栏jianhuicode

蓝牙门禁Android客户端

 先来了解下Android传统蓝牙连接的大致简单的流程: ? 其中涉及到几个类依次来介绍,废话不多说,下面是从Android4.4开发指南蓝牙所用到的类的截图:...

18710
来自专栏一枝花算不算浪漫

Redis的介绍及使用实例.

3429
来自专栏Android 开发者

[译]Android 生命周期备忘录 — 第一部分:单一 Activities

1663
来自专栏皮振伟的专栏

[virt][scsi]SCSI设备虚拟化以及访问方式

前言: 之前只闻其名,不懂其理。 刚刚看了一些代码,趁热打铁。 分析: 1,architectures ? 作者绘制了下图,大概体现一下思路,见谅。 Dis...

2996
来自专栏听雨堂

VB6再回首:数据访问

  十几年前最开始用VB时,是从数据绑定开始的,后来,自己慢慢开始“不屑”这种简单的、傻瓜化的操作,逐步向sql语句过渡:几乎所有的数据库操作都用sql完成,...

17210
来自专栏Hadoop实操

Livy,基于Apache Spark的开源REST服务,加入Cloudera Labs

Hadoop生态圈的Spark(https://www.cloudera.com/products/open-source/apache-hadoop/apac...

4298
来自专栏向治洪

即时通讯软件openfire+spark+smack

所以我基本上分为三篇文章来介绍此类软件的开发: 第一篇是关于XMPP 协议是啥,IM 是啥以及一个比较有名的开源实现,该开源实现包括三个部分(Spark、Sma...

2585

扫码关注云+社区