Google 致力于为黑人社区推动种族平等。查看具体举措

插桩测试入门

本指南介绍如何使用 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 个测试用例。

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