Android单元测试介绍
本篇介绍Android相关的单元测试, 本篇为系列教程的开篇, 对Android单元测试做一个系统介绍.
本系列教程将介绍在Android应用中如何编写本地单元测试和instrumentation测试(设备测试).并通过Android Studio和Gradle来执行这些测试.
Android单元测试分类
Android应用运行在各种各样的设备中.另外,Android框架和其他相关的开源框架都在高速发展.要保证应用正常运行,有必要去写Android应用测试.这将会有助于优化和改善我们的Android应用.
Android的单元测试分为下列两种:
- 本地单元测试 - 即测试用例运行在JVM中
- Instrumented 单元测试 - 即测试用例需要Android 系统支持,运行在真机或模拟器中
相对于在Android设备上部署和运行测试所需的时间,本地的单元测试速度要快很多.如果你需要真正的Android系统环境,应首选本地单元测试,并且仅在Android平台上运行.
如果使用本地单元测试并对Android API有依赖,应该通过模拟框架(mocking framework)来替代它们,例如Mockito.
测试分布法则
我们应该把测试的关注点放在代码的业务逻辑上,下面几条是非常好的测试分布法则:
- 70-80 % 单元测试来确保基础代码的稳定性
- 20-30 % 功能测试来确保应用程序的功能正常工作
- 如果应用程序与其他应用程序组件集成起来,则需要进行一些跨功能测试
应该至少在一个设备上测试应用,并尽可能的减少配置.另外也应该在具有最高可用配置(例如像素密度,屏幕分辨率)的设备上进行测试,以确保其在这些设备上正常工作.
Android测试工具支持
Google的Android测试支持库(ATSL)项目为Android测试提供了工具. 例如 AndroidJUnitRunner.
如果你运行本地单元测试,那么工具会创建一个特殊版本的android.jar (也被称为Android 模拟Jar包). 这个被修改后的 JAR 文件用来提供给单元测试,以便所有Android库中的字段,方法和类都可用. 在默认情况下,对Android可模拟JAR的任何调用都会导致异常,但是你可以将Android配置为返回默认值.当然最好的方式是使用一些Mock库,具体详情可以见Android Developer官方文档.
该库提供了JUnit兼容的测试运行器(AndroidJunitRunner)、Espresso测试框架和UI Automator 测试框架. Espresso测试框架可用于测试应用程序的用户界面,UI Automator 允许编写跨应用程序的功能测试.
AndroidJunitRunner 通过InstrumentationRegistery 提供了对 instrumentation API 的访问.
- InstrumentationRegistry.getInstrumentation(), 返回当前运行的Instrumentation
- InstrumentationRegistry.getContext(), 返回Instrumentation包下的Context
- InstrumentationRegistry.getTargetContext(), 返回目前应用的Context
- InstrumentationRegistry.getArguments(), 返回传递给此Instrumentation的参数Bundle的副本.当你想访问传递给你测试工具的命令行参数时非常有用
它还可以通过ActivityLifecycleMonitorRegistry访问生命周期.
Android工程测试结构
以下是你的应用和测试代码的默认目录结构:
- app/src/main/java - 主要应用程序构建的源代码
- app/src/test/java - 用于任何可以运行在JVM单元测试
- app/src/androidTest/java - 用于应该运行在Android设备上的测试
遵循上述结构,Android的构建系统就会在相应的目标(JVM或者Android设备)运行测试.
解决"error duplicate files in path"的错误
如果你收到下面的错误:"error duplicate files in path. Path in archive: LICENSE.txt",你可以将以下内容添加到app/build.gradle文件中:
android {
packagingOptions {
exclude 'LICENSE.txt'
}
}
敲行代码再睡觉