像 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 条评论
登录 后参与评论

相关文章

来自专栏优启梦

使用Referer Meta标签控制referer 来源

本文描述了一个关于 http 协议中 referer 的 metadata 参数的提议,使用这个 metadata 参数,html 文档可以控制 http 请求...

1625
来自专栏快乐八哥

InfoPath中repeating section中赋值操作

最近项目需要自定义开发InfoPath Template,之前项目中只需要修改一些字段,所以觉得还是比较简单。只是InfoPath调试环境真的很不方便,必须每次...

2056
来自专栏me的随笔

同源策略与CORS

不同源下,浏览器不允许js操作Cookie、LocalStorage、DOM等数据或页面元素,也不允许发送ajax请求,同源下则不受影响。

924
来自专栏北京马哥教育

HTTP 协议漫谈

简介 网络上已经有不少介绍 HTTP 的好文章,对HTTP的一些细节介绍的比较好,所以本篇文章不会对 HTTP 的细节进行深究,而是从够高和更结构化的角度将 H...

27011
来自专栏Android先生

一切为了营收!如何从推广短信链接唤起 App

写这篇文章,也是缘于运营的一个需求:在 App 运营过程中,会有大量的推广短信,里面附有链接,目的是引导用户参与活动。如果用户手机没有安装我们的 App 就引导...

632
来自专栏ASP.NETCore

.NET Core第三方开源Web框架YOYOFx

YOYOFx是一个轻量级用于构建基于 HTTP 的 Web 服务,基于 .NET 和 Mono 平台。

664
来自专栏哲学驱动设计

搭建 WPF 上的 UI 自动化测试框架

简要说明 OEA 1.0-2.0 框架中,界面都是以 WPF 技术作为基础平台开发的。我们需要对开发出来的系统进行自动化测试,而 .NET 平台的自动化测试平...

21111
来自专栏JetpropelledSnake

Django学习笔记之Ajax与文件上传

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服...

581
来自专栏Golang语言社区

HTTP协议漫谈

简介 园子里已经有不少介绍HTTP的的好文章。对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将H...

32813
来自专栏Android研究院

Android组件化专题 - 组件化配置

(摘自百度百科)模块化是指解决一个复杂的问题时自顶向下逐层把系统划分为若干个模块的过程,各个模块可独立工作。

813

扫码关注云+社区