android 源码下载部分单元测试代码分析

引自我的博客:android 源码下载部分单元测试代码分析

最近因为业务需要,在研究android源码的下载部分。因为要考虑代码质量的问题,所以就针对源码的测试用例做了一些分析,并在源码用例的基础上添加了我们自己增加接口部分的用例。测试代码的分析比较偏门,网上也很少见,这里权作探讨,欢迎纠错。

在分析这个代码之前,能想到的一些问题:

1.下载这部分涉及到网络环境、数据库、contentprovider、广播等依赖硬件或外部环境较多的部分,如何测试;

2.网络环境复杂多变,如何能够测试全面;

3.我们了解下载系统的复杂程度,是以DownloadService为核心控制下载任务的刷新,

DownloadProvider供增删改查各种任务为基础,供app用户管理下载任务、查询下载进度和状态,真正下载的实现则在DownloadThread中——这样一个复杂的模块的测试从何下手。

然后,大体分析一下测试源码的结构,我使用EA导入代码工程的方式生成了类图,再大体调整了一下位置布局,很方便。


来仔细分析一下测试源码的类结构:

1. 以继承关系为骨架看的话,可以分为三层,很明显抽象类是不能直接作为干活的测试类的,继承关系中的叶子节点类才是真正跑用例的类。那么其余部分肯定是为跑测试做各方面的准备;

2. 最基础的 AbstractDownloadProviderFunctionalTest,是第一层的中心。左边两个是它的内部类,并且还维护着这两个内部类的实体;右面是对下载系统源码中SystemFacade的一个模拟实现类的依赖,同样维护着一个实体;在看各位组件的类名:TestContext、MockContentResolverWithNotify、FakeSystemFacade,可以说是假货一条街。总结来说,第一层就是以AbstractDownloadProviderFunctionalTest为中心的组合关系,该类维护了一系列假货的实体,那么大概齐是什么功能也能猜个八九了,具体是怎样还要读源码来验证;

3. 第二层在继承前类的同时又有拓展。该层已经有一个叶子类了,DownloadProviderFunctionalTest,从一些共有方法能看到测试用例的定义,同时根据类名也能看出一二;AbstractPublicApiTest则是它的兄弟类,继续抽象,仔细一点可以看出这里添加了一个重要的实体:DownloadManager,继续做准备吧,至于它的内部类Download结构上看不出什么,还需要看接口和源码才能了解具体功能;

4. 第三层,就都是叶子类了,也是大规模测试用例的聚集地。在前面两层的准备之后,可谓万事俱备,PublicApiFunctionalTest、ThreadingTest,看名字就知道了。

5. HelpersTest 该类是个闲散人员,不依赖任何环境的模拟。所以可以猜测是测试纯功能函数的。

了解了大体结构之后,就需要读源码了。走读一下源码,不多,大概不到1500行的样子。然后就可以拿到大体上每个类都做了什么,如下:

1. AbstractDownloadProviderFunctionalTest 是基础抽象类,这里完成了context、systemFacade、server、contentResolver等基础环境的假冒伪劣活动,同时提供了伪造服务器响应的方法供子类使用;

2. AbstractPublicApiTest 是上面那位的子类,同样是抽象的,这里封装了以DownloadID为核心的内部类Download供后续断言使用;引入了DownloadManager的工具实体,同时提供了伪造客户端请求的各种方法供子类使用;

3. DownloadProviderFunctionalTest 绕开了对DownloadManager的测试,它使用暴力插入数据库的方法添加下载,单纯的测试下载器的功能,所以它只继承了①;

4. PublicApiFunctionalTest 主要是针对DownloadManager的功能api测试,这里模拟了各种各样的下载环境,实现了各种网络情况下的功能单元测试;

5. ThreadingTest 主要针对频繁开下载服务的特殊情况进行测试;

6. HelpersTest 则是比较独立的测试,测试/module/DownloadSystem 中Util包  Helpers 工具类中的方法;

好。最后我们回到刚开始的那几个问题。通过类图解析和代码走读大概就能得到答案。

其一,android junit框架提供了对android service的测试支持,上面的所有测试类都是基于ServiceTestCase 实现的;

其二,可以找到各种mock工具来模拟各种依赖于硬件、网络的接口实现,下载测试中使用的就是 mockwebserver.jar,来模拟服务器、响应;

其三,测试代码也需要伪造相关的环境,context、resolver,包括功能源码将系统相关的信息抽象成接口,在测试的过程中测试代码可以实现测试所需要的fake版本,不得不说这就是代码可测试性良好的一个体现,目的就是绕开或模拟任何不可预期的依赖,来针对测试目标代码完成对逻辑的测试;

其四,对于各种网络环境的测试,实际上是通过模拟不同的服务器响应来实现的,绝大部分用例都是围绕这个思路来编写的。不过是否能覆盖到所有情况的下载还是未知数;

其五,针对一个复杂的功能系统来测试,整个测试代码的架构显然是需要提前设计的。庖丁解牛一般,一步一步把所有的环境都模拟好,再动手编写各个细节点的测试用例。当然,这与被测试的功能源码的结构设计、可测试性的考虑也是有关系的。这就是传说中的设计吧,路漫漫其修远兮啊。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,275评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 记得桥桥小时候,我们经常躺在床上一起憧憬,以后我们的桥桥会成长为什么样的男生呀?然后一起罗列:阳光的,善良的,正直...
    ella2016阅读 216评论 0 3
  • 昨天得闲,信步来到西单图书大厦,读完了预谋己久的《三体》。 三体的内容,我就不再复述,相信大多数人都...
    天长地久京阅读 242评论 0 2
  • 前一阶段我们各年级语文教师针对近年来期末试卷进行了分析,研究发现课本基础字词题只占38%,书写卷面占4%,...
    lily绿茶丽丽阅读 542评论 0 5