目录

一、测试金字塔

二、单元测试工具链

三、单元测试基本规范

1. 测试用例存放目录

2. 单元测试代码规范

3. 单元测试验证标准



本篇进行Android单元测试简介。 

一、测试金字塔

Google官网介绍如下:

https://developer.android.com/training/testing/fundamentals

android telecom集成 android集成测试_android telecom集成

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

android telecom集成 android集成测试_测试用例_02

关于mock Final类,在2.1.0中其实也进行了支持

What's new in Mockito 2 · mockito/mockito Wiki · GitHub

android telecom集成 android集成测试_android_03

 

 

 3. robolectric

用于模拟Android接口,这套框架可以直接让测试case运行于JVM,不需要Android模拟器和手机。

综上,Android的单元测试需要“junit4+mockito+powermock+robolectric”完美配合。

三、单元测试基本规范

1. 测试用例存放目录

android telecom集成 android集成测试_测试用例_04

 

  • 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. 单元测试验证标准

通过代码覆盖率判断
代码覆盖率包含:行覆盖,函数覆盖,分支覆盖。