了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

插桩测试入门

本指南介绍如何使用 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 文件 (build.gradle) 中,将 Google 的 Maven 代码库添加到每个代码库部分:

    buildscript {
    
      repositories {
        // Add the following line:
        google()  // Google's Maven repository
      }
    
      dependencies {
        // ...
    
        // Check that you have the following line (if not, add it):
        classpath 'com.google.gms:google-services:4.3.8'  // Google Services plugin
      }
    }
    
    allprojects {
      // ...
    
      repositories {
        // Add the following line:
        google()  // Google's Maven repository
        // ...
      }
    }
  2. 在您的模块(应用级)Gradle 文件(通常是 app/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 个测试用例。

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