获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

开始使用仪器测试

本指南介绍了如何使用 Firebase 测试实验室准备和运行仪器测试。要使用本指南,您需要一个使用EspressoUI Automator Android 测试框架的仪器测试(由您或您的团队编写)。仪器测试在物理设备上最多可运行 45 分钟,在虚拟设备上最多可运行 60 分钟。

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

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

Firebase 测试实验室包含一个库 (testlab-instr-lib),您可以使用它来处理在运行仪器测试时使用 AndroidX 的ScreenCapture截取的任何屏幕截图,例如使用Espresso 测试框架编写的测试。本节介绍如何使用 AndroidX 库创建ScreenCapture对象以及如何使用 testlab-instr-lib 处理它们。

仪器测试运行后,您可以在 Firebase 控制台中查看捕获的屏幕截图。

试用示例应用程序

下载NotePad 示例应用程序以试用此功能。截取屏幕截图的功能已经集成到 NotePad 项目中。

Step 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 )中,为测试实验室屏幕截图库添加一个依赖项。

    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 测试实验室运行测试时提供您的结果。

创建ScreenCapture的示例用例:

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

    Screenshot.capture()
    
  • 在任何 API 级别获取活动的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 控制台的测试实验室仪表板

  3. 最后,运行您的测试。

第 4 步。查看您的测试屏幕截图

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

  1. 在“测试”选项卡中,选择已完成的测试,然后单击“结果”选项卡。

  2. 再次选择您的测试,然后单击出现的屏幕截图选项卡。

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

在使用测试实验室运行测试之前,您可以在测试中启用以下功能:

启用协调器

Android Test Orchestrator是一种独立运行应用程序的每个仪器测试的工具。测试实验室始终使用最新版本的 Orchestrator。

要启用 Orchestrator for Test Lab,请在Instrumentation 测试设置中单击Additional options > Run with Orchestrator

优点和缺点

  • 好处:没有共享状态。每个测试都在其自己的检测实例中运行,因此共享状态不会在测试之间累积。
  • 好处:孤立的崩溃。如果测试崩溃,只有该仪器被终止,您套件中的其他测试仍然可以运行。
  • 缺点:运行时间更长。每个测试都运行自己的检测实例,这意味着测试过程总体上花费的时间稍长。如果不选中,增加的运行时间可能会影响您的配额使用或计费时间,并可能导致您达到设备的超时限制

启用分片

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

测试分片的工作原理

假设您创建了 N 个分片。对于您选择的每个设备,测试实验室都会启动 N 个相同的设备,并在每个设备上运行测试的子集。这意味着分片测试用例可以导致每台设备执行多次测试,这与非分片测试用例不同,非分片测试用例总是导致每台设备执行一次测试(有关测试实验室中关键概念的快速概述,请参阅关键概念)。

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

  1. Instrumentation 测试设置中,单击Additional options

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

测试分片计费

测试实验室通过利用AndroidJUnitRunner 的内置分片机制来实现您的分片。为避免因启动空分片(没有分配测试用例的分片)而被收费,您创建的分片数量应小于测试用例总数。根据每个测试用例的运行时间,通常最好为每个分片分配 2-10 个测试用例。

有关计费的更多信息,请阅读使用情况、配额和计费