Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

插桩测试入门

本指南介绍如何使用 Firebase Test Lab 准备和运行插桩测试。要使用本指南,您需要一个由您或您的团队编写的插桩测试(使用 EspressoUI Automator 2.0 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:
      androidTestCompile `com.google.firebase:testlab-instr-lib:02`
      // ...
    }
  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 运行

优点和缺点

  • 优点:没有共享状态。每个测试都在自己的插桩实例中运行,因此不会跨多个测试累积共享状态。
  • 优点:崩溃彼此隔离。如果某个测试崩溃,则系统只会终止该测试的插桩实例,您套件中的其他测试仍然可以运行。
  • 缺点:运行时间增加。每个测试都运行自己的插桩实例,这意味着测试过程总体耗时会略微增多。如果不加注意,增加的运行时间可能会影响您的配额用量或计费时间,并可能导致您达到设备的超时限制

启用分片

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

测试分片的工作原理

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

您可以在 Firebase 控制台中启用测试分片:

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

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

测试分片的结算方式

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

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