插桩测试入门

本指南介绍如何使用 Firebase Test Lab 准备和运行插桩 (instrumentation) 测试。如需使用本指南,您需要一个由您或您的团队编写的插桩测试(使用 EspressoUI Automator Android 测试框架)。插桩测试在实体设备上的运行时长上限是 45 分钟,在虚拟设备上是 60 分钟。

在稍后的步骤中,您需要将应用的 APK 和测试的 APK 上传到 Firebase。

(可选)将屏幕截图库添加到您的应用

Firebase Test Lab 包含一个 testlab-instr-lib 库,您可在运行插桩测试(例如,使用 Espresso 测试框架编写的测试)时,利用这个库处理您使用 AndroidX 的 ScreenCapture 截取的任何屏幕截图。本部分介绍了如何使用 AndroidX 库创建 ScreenCapture 对象,以及如何使用 testlab-instr-lib 处理这些对象。

插桩测试运行后,您可以在 Firebase 控制台中查看截取的屏幕截图。

试用示例应用

下载 NotePad 示例应用以试用此功能。屏幕截图功能已整合到 NotePad 项目中。

第 1 步:将屏幕截图库添加到项目

  1. 在测试项目的根级设置 Gradle 文件(settings.gradle.ktssettings.gradle)中,将 Google 的 Maven 制品库添加到每个 repositories 部分:

    pluginManagement {
        repositories {
            // Add the following line:
            google() // Google's Maven repository
            mavenCentral()
            gradlePluginPortal()
        }
    }
    dependencyResolutionManagement {
        repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
        repositories {
            // Add the following line:
            google() // Google's Maven repository
            mavenCentral()
        }
    }
    // ...
    
  2. 在您的模块(应用级)Gradle 文件(通常是 <project>/<app-module>/build.gradle.kts<project>/<app-module>/build.gradle)中,添加 Test Lab 屏幕截图库的依赖项。

    dependencies {
      // ...
      // Add Test Lab's instrumentation test screenshot library:
      androidTestImplementation("com.google.firebase:testlab-instr-lib:0.2")
      // ...
    
  3. 在测试的 AndroidManifest.xml 文件中,于 <instrumentation> 元素内的元数据标记中注册 FirebaseScreenCaptureProcessor。您也可以将该处理程序指定为 AndroidJUnitRunner 中的参数(如需了解相关说明,请参阅 AndroidJUnitRunner 参考文档)。

    <instrumentation
      // Check that you have the following line (if not, add it):
      android:name="androidx.test.runner.AndroidJUnitRunner" // Specifies AndroidJUnitRunner as the test runner
      android:targetPackage="com.your.package.name">
    
    // Add the following:
    <meta-data
      android:name="screenCaptureProcessors"
      android:value="com.google.firebase.testlab.screenshot.FirebaseScreenCaptureProcessor" />
    </instrumentation>
    ...
    
  4. 在应用的 AndroidManifest.xml 文件中的 <manifest> 元素内添加如下几行代码:

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  5. AndroidManifest.xml 文件中的 <manifest> 标记内添加如下几行代码,为您的应用指定系统权限。如果您是在 Android 10(API 级别 29)或更高版本上进行测试,请省略 WRITE_EXTERNAL_STORAGE 权限(您的应用无需使用此权限即可对设备执行屏幕截图读取和写入操作)。

    <manifest ... >
        <!-- WRITE_EXTERNAL_STORAGE is not needed on Android 10 (API level 29) or higher. -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        ...
    </manifest>

第 2 步:在测试期间截取屏幕截图

在测试中您需要对屏幕截图的任一点,调用 AndroidX 库的 Screenshot.capture() 方法。这将生成一个 ScreenCapture 对象。对 ScreenCapture 对象调用 process() 时,系统会使用 AndroidManifest.xml 中注册的 ScreenCaptureProcessor 处理该对象。请注意,如果未注册任何处理程序,则系统会使用 BasicScreenCaptureProcessor。由于您注册了 FirebaseScreenCaptureProcessor,因此系统将通过 FirebaseScreenCaptureProcessor 处理您的屏幕截图,并在您使用 Firebase Test Lab 运行测试时将其连同结果一起提供给您。

创建 ScreenCapture 的示例用例:

  • 在 API Build.VERSION_CODES.JELLY_BEAN_MR2 及更高版本上截取完整的 ScreenCapture:

    Screenshot.capture()
    
  • 在任意 API 级别截取 Activity 的 ScreenCapture。请注意,这是低于 Build.VERSION_CODES.JELLY_BEAN_MR2 的设备的唯一选项。

    @Rule
      public ActivityTestRule<MainActivity> activityRule = new ActivityTestRule<>(MainActivity.class);
    ...
    Screenshot.capture(activityRule.getActivity());
    ...
    

处理 ScreenCapture 的示例用例

  • 通过 FirebaseScreenCaptureProcessor 处理 ScreenCapture

    Screenshot.capture().process();
    
  • 通过指定的 ScreenCaptureProcessor 处理 ScreenCapture(这样您就无需注册处理程序):

    Set<ScreenCaptureProcessor> processors = new HashSet<>();
    processors.add(new FirebaseScreenCaptureProcessor());
    Screenshot.capture().process(processors);
    
  • 设置 ScreenCapture 的名称和格式,并使用注册的处理程序对其进行处理:

    Screenshot.capture().setName("myscreenshot").setFormat(CompressFormat.JPEG).process();
    

第 3 步:构建并运行测试

  1. 构建应用并测试 APK(如需了解相关说明,请参阅测试应用)。

  2. 将 APK 文件上传到 Firebase 控制台的 Test Lab 信息中心

  3. 最后,运行测试。

第 4 步:查看测试屏幕截图

完成测试后,您可以在 Firebase 控制台中查看截取的任何屏幕截图。

  1. 测试标签页中,选择已完成的测试,然后点击结果标签页。

  2. 再次选择测试,然后点击显示的屏幕截图标签页。

(可选)启用其他测试功能

在使用 Test Lab 运行测试之前,您可以在测试中启用以下功能:

启用 Orchestrator

Android Test Orchestrator 工具可以独立运行您的应用的每个插桩测试。Test Lab 始终使用最新版本的 Orchestrator。

如需为 Test Lab 启用 Orchestrator,请在插桩测试设置中点击其他选项 > 使用 Orchestrator 运行

使用 Orchestrator 可获享以下好处:

  • 没有共享状态:每个测试都在自己的插桩实例中运行,因此不会跨多个测试累积共享状态。
  • 隔离崩溃:如果某个测试崩溃,则系统只会终止该测试的插桩实例,您套件中的其他测试仍然可以运行。

请注意,当您使用 Orchestrator 时,每个测试都会运行自己的插桩实例,这意味着应用进程会在每个测试用例完成后重启。由此增加的运行时间可能会影响您的配额用量或计费时间,并可能导致您的设备超时。如果您能缩短应用的启动时间,此开销也会相应减少。

如需为 Orchestrator 设置其他选项,可通过 environmentVariables 字段指定相应的选项。例如,若要使用 clearPackageData,则可以在 gcloud 中指定该选项,如下所示:

--environment-variables clearPackageData=true

启用分片

测试分片旨在将一组测试划分为多个独立运行的子组(分片)。Test Lab 会自动使用多个设备并发运行各个分片,从而在更短的时间内完成整个测试集。

例如,如果您创建了 N 个分片,那么对于您选择的每个设备,Test Lab 会启动 N 个相同设备,并在每个设备上运行一部分测试。这意味着分片测试用例可能导致每个设备执行多个测试作业;而在非分片测试用例中,每个设备总是执行一个测试作业。如需了解 Test Lab 中的相关概念,请参阅关键概念

如需在 Firebase 控制台中启用测试分片,请按以下步骤操作:

  1. 插桩测试设置中,点击其他选项

  2. 分片部分中,输入要运行的分片数量。

测试分片的结算方式

Test Lab 利用 AndroidJUnitRunner 的内置分片机制来实现分片。 为避免因启动空分片(即没有分配测试用例的分片)而产生费用,您创建的分片数量应少于测试用例的总数。根据每个测试用例的运行时长,通常最好为每个分片分配 2-10 个测试用例。

如需详细了解结算信息,请参阅用量、配额和结算