Instrumentation 测试

首先阅读 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 属性。其值应设置为被测应用软件包。

步骤摘要

  1. 以下是针对框架服务进行密封测试的常用目标位置

    frameworks/base/core/tests/coretests
    frameworks/base/services/tests/servicestests
    

    如果要为组件添加全新的 Instrumentation 模块,请参阅

  2. 如果要将测试添加到上述某个位置,请遵循现有惯例。如果要设置新的测试模块,请遵循上述某个位置中的 AndroidManifest.xmlAndroid.mk 的设置

  3. 有关示例,请参阅 frameworks/base/core/tests/coretests/。请注意,以下代码行会安装额外的应用

    <option name="test-file-name" value="FrameworksCoreTests.apk" />
    <option name="test-file-name" value="BstatsTestApp.apk" />
    
  4. 请勿忘记将您的测试标记为 @SmallTest@MediumTest@LargeTest

  5. 使用 m 构建测试模块,例如:

    m FrameworksCoreTests
    
  6. 运行测试

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. 如果未使用 Tradefed,请手动安装并运行测试

    1. 安装生成的 apk
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. 使用各种选项运行测试

      1. apk 包中的所有测试

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. 特定 Java 包下的所有测试

        adb shell am instrument -w -e package android.animation \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      3. 特定类下的所有测试

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      4. 特定测试方法

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest#testCancel \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        

您的测试可以使用 JUnit API 显式声明通过或失败;此外,任何未捕获的异常也会导致功能性失败。

要发出性能指标,您的测试代码可以调用 Instrumentation#sendStatus 以发送键值对列表。需要注意的是

  1. 指标可以是整数或浮点数
  2. 任何非数值都将被丢弃
  3. 您的测试 apk 可以是功能测试或指标测试,但目前不支持两者混合使用