本指南介绍如何使用 Firebase Test Lab 准备和运行插桩测试。如需使用本指南,您需要一个由您或您的团队编写的插桩测试(使用 Espresso 或 UI 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 步:将屏幕截图库添加到项目
在测试项目的根级设置 Gradle 文件(
settings.gradle.kts
或settings.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() } } // ...
在您的模块(应用级)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") // ...
在测试的
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> ...
在应用的
AndroidManifest.xml
文件中的<manifest>
元素内添加如下几行代码:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在
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 步:构建并运行测试
构建应用并测试 APK(如需了解相关说明,请参阅测试应用)。
将 APK 文件上传到 Firebase 控制台的 Test Lab 信息中心。
最后,运行测试。
第 4 步:查看测试屏幕截图
完成测试后,您可以在 Firebase 控制台中查看截取的任何屏幕截图。
在测试标签页中,选择已完成的测试,然后点击结果标签页。
再次选择测试,然后点击显示的屏幕截图标签页。
(可选)启用其他测试功能
在使用 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 控制台中启用测试分片,请按以下步骤操作:
在插桩测试设置中,点击其他选项。
在分片部分中,输入要运行的分片数量。
测试分片的结算方式
Test Lab 利用 AndroidJUnitRunner 的内置分片机制来实现分片。为避免因启动空分片(即没有分配测试用例的分片)而产生费用,您创建的分片数量应少于测试用例的总数。根据每个测试用例的运行时长,通常最好为每个分片分配 2-10 个测试用例。
如需详细了解结算信息,请参阅用量、配额和结算。