插桩测试

请先阅读 developer.android.com 上的测试应用一文。请注意,在平台测试中使用插桩测试的方式存在一些差异。

总的来说,插桩测试提供了一种通过 am instrument 命令启动的特殊测试执行环境,其中目标应用进程会重启并使用基本的应用上下文进行初始化,并在应用进程虚拟机内启动插桩线程。您的测试代码在此插桩线程上开始执行,并附带一个 Instrumentation 实例,该实例可提供对应用上下文和 API 的访问权限,以操纵接受测试的应用进程。

主要概念

  • 必须在应用软件包中声明插桩,方法是在应用软件包清单的 <manifest> 标记下嵌套 <instrumentation> 标记。
  • 从技术上来说,一个应用软件包清单可以包含多个 <instrumentation> 标记,但通常不这么做。
  • 每个 <instrumentation> 必须包含:
    • android:name 属性:它应该是测试应用中包含的 Instrumentation 的子类的名称,该测试应用通常是正在使用的测试运行程序,例如:android.support.test.runner.AndroidJUnitRunner
    • 必须定义 android:targetPackage 属性。其值应该设置为接受测试的应用软件包。

步骤总结

  1. 下面是框架服务封闭测试的常见位置:

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

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

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