请先阅读 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 可以是功能测试或指标测试,但目前不支持混合这两种测试