首先阅读 developer.android.com 上的测试您的应用。请注意,Instrumentation 测试在平台测试中的使用方式存在一些差异。
总而言之,Instrumentation 测试提供了一个特殊的测试执行环境,该环境通过 am instrument
命令启动,在该环境中,目标应用进程会重启并使用基本应用上下文进行初始化,并且 Instrumentation 线程会在应用进程 VM 中启动。您的测试代码在此 Instrumentation 线程上开始执行,并获得一个 Instrumentation
实例,该实例提供对应用上下文的访问权限以及用于操纵被测应用进程的 API。
主要概念
- Instrumentation 必须在应用软件包中声明,并且
<instrumentation>
标记嵌套在应用软件包清单的<manifest>
标记下。 - 从技术上讲,应用软件包清单可以包含多个
<instrumentation>
标记,但这种方式并不常用。 - 每个
<instrumentation>
都必须包含- 一个
android:name
属性:它应该是测试应用中包含的Instrumentation
子类的名称,这通常是正在使用的测试运行程序,例如:android.support.test.runner.AndroidJUnitRunner
- 必须定义
android:targetPackage
属性。其值应设置为被测应用软件包。
- 一个
步骤摘要
以下是针对框架服务进行密封测试的常用目标位置
frameworks/base/core/tests/coretests frameworks/base/services/tests/servicestests
如果要为组件添加全新的 Instrumentation 模块,请参阅
如果要将测试添加到上述某个位置,请遵循现有惯例。如果要设置新的测试模块,请遵循上述某个位置中的
AndroidManifest.xml
和Android.mk
的设置有关示例,请参阅 frameworks/base/core/tests/coretests/。请注意,以下代码行会安装额外的应用
<option name="test-file-name" value="FrameworksCoreTests.apk" /> <option name="test-file-name" value="BstatsTestApp.apk" />
请勿忘记将您的测试标记为
@SmallTest
、@MediumTest
或@LargeTest
使用 m 构建测试模块,例如:
m FrameworksCoreTests
运行测试
最简单的解决方案是像这样使用 Atest
atest FrameworksCoreTests
对于更复杂的测试,请使用 Trade Federation 测试框架
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
如果未使用 Tradefed,请手动安装并运行测试
- 安装生成的 apk
adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
使用各种选项运行测试
apk 包中的所有测试
adb shell am instrument -w com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
特定 Java 包下的所有测试
adb shell am instrument -w -e package android.animation \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
特定类下的所有测试
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
特定测试方法
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest#testCancel \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
您的测试可以使用 JUnit
API 显式声明通过或失败;此外,任何未捕获的异常也会导致功能性失败。
要发出性能指标,您的测试代码可以调用 Instrumentation#sendStatus
以发送键值对列表。需要注意的是
- 指标可以是整数或浮点数
- 任何非数值都将被丢弃
- 您的测试 apk 可以是功能测试或指标测试,但目前不支持两者混合使用