请先阅读 developer.android.com 上的测试应用一文。请注意,在平台测试中使用插桩测试的方式存在一些差异。
总的来说,插桩测试提供了一种通过 am instrument 命令启动的特殊测试执行环境,其中目标应用进程会重启并使用基本的应用上下文进行初始化,并在应用进程虚拟机内启动插桩线程。您的测试代码在此插桩线程上开始执行,并附带一个 Instrumentation 实例,该实例可提供对应用上下文和 API 的访问权限,以操纵接受测试的应用进程。
主要概念
- 必须在应用软件包中声明插桩,方法是在应用软件包清单的 <manifest>标记下嵌套<instrumentation>标记。
- 从技术上来说,一个应用软件包清单可以包含多个 <instrumentation>标记,但通常不这么做。
- 每个 <instrumentation>必须包含:- android:name属性:它应该是测试应用中包含的- Instrumentation的子类的名称,该测试应用通常是正在使用的测试运行程序,例如:- android.support.test.runner.AndroidJUnitRunner
- 必须定义 android:targetPackage属性。其值应该设置为接受测试的应用软件包。
 
步骤总结
- 下面是框架服务封闭测试的常见位置: - frameworks/base/core/tests/coretests frameworks/base/services/tests/servicestests- 如果要为组件添加全新的插桩模块,请参阅 
- 如果要将测试添加到上述某个位置,请遵循现有惯例。如果要设置一个新的测试模块,请在上述某个位置按照 - 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 可以是功能测试或指标测试,但目前不支持混合这两种测试
