目录
一、测试金字塔
二、单元测试工具链
三、单元测试基本规范
1. 测试用例存放目录
2. 单元测试代码规范
3. 单元测试验证标准
本篇进行Android单元测试简介。
一、测试金字塔
Google官网介绍如下:
https://developer.android.com/training/testing/fundamentals
1. Small tests是单元测试,在local JVM就可以运行。
2. Medium tests是集成测试,测试集成的几个模块,运行于真机或模拟器。
3. Large tests是UI测试,测试整个UI工作流程,运行于真机或模拟器。
Q:开发写的单元测试和测试写的集成测试区别在哪里?
A:单元测试测试的测试单元一定是远小于集成测试。
(1) 单元测试是直接去测试某个类或某几个类,因为没有走整个App正常的启动和调用流程,导致非常多的模块是没有初始化的,为了测试用例不崩溃,必须把需要用到但没初始化的类或方法mock,如果测试单元很大,需要mock的东西就非常多,很难保证不出错。而集成测试是运行在真机或模拟器,可以按照App正常的启动和调用流程,需要mock的东西不多,所以测试单元可以很大。
(2) 单元测试是白盒测试。集成测试是黑盒测试。
二、单元测试工具链
1. junit4
用于纯java代码测试,对应的还有testng,不过testng框架更多用于服务器接口测试,用于Android单测的比较少。谷歌官方也比较推荐junit4,可能是因为它跟robolectric以及其他安卓官方框架(例如AndroidJunitRunner等)兼容性更好吧。
2. mock(mockito+powermock)
mockito功能受限比较多,比如不能访问private方法,不能mock static方法,一些版本不能mock Final类,不能处理匿名内部类。而powermock支持修改和mock静态类或对象的私有方法/成员,还支持很多反射方法。所以说需要mockito+powermock配合来玩。
关于mockito不支持private方法的说明原文如下:
Mockito And Private Methods · mockito/mockito Wiki · GitHub
https://github.com/mockito/mockito/wiki/Mockito-And-Private-Methods
关于mock Final类,在2.1.0中其实也进行了支持
What's new in Mockito 2 · mockito/mockito Wiki · GitHub
3. robolectric
用于模拟Android接口,这套框架可以直接让测试case运行于JVM,不需要Android模拟器和手机。
综上,Android的单元测试需要“junit4+mockito+powermock+robolectric”完美配合。
三、单元测试基本规范
1. 测试用例存放目录
androidTest
目录应包含在真实或虚拟设备上运行的测试。此类测试包括集成测试、端到端测试,以及仅靠 JVM 无法完成应用功能验证的其他测试。也称之为"Instrumented tests"目录;test
目录应包含在本地计算机上运行的测试,如单元测试。也称之为“Local tests”目录
2. 单元测试代码规范
✓ 测试类的包名:与被测类的包名保持一致
✓ 测试类命名方式:被测类名+Test。示例:
被测类名AppDownload,则测试类名为AppDownloadTest
✓ 测试用例命名方式:test+首字母大写的被测方法名,如果同一个逻辑要测不同分支,产生多个同类测试用例的情况,用例前缀需保持一致,后面跟“_xxxx_xxxx”,xxxx明确分支意图。格式为大写开头驼峰。
Eg. 被测方法名sendRequest,则测试用例名称为testSendRequest,如有多个,则为
testSendRequest_HasLogin_Success, testSendRequest_HasLogin_Fail,…
✓ 测试类有setUp()、tearDown()方法,用于初始化和资源释放。
✓ 测试用例必须有断言。
3. 单元测试验证标准
通过代码覆盖率判断
代码覆盖率包含:行覆盖,函数覆盖,分支覆盖。