欢迎参加我们将于 2022 年 10 月 18 日举办的 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 項目中已經包含了截屏功能。

步驟 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 級別獲取 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 控制台的測試實驗室信息中心

  3. 最後,運行你的測試。

第 4 步:查看您的測試截圖

測試完成後,您可以查看在 Firebase 控制台中截取的任何屏幕截圖。

  1. 在“測試”選項卡中,選擇已完成的測試,然後單擊“結果”選項卡。

  2. 再次選擇您的測試,然後單擊出現的屏幕截圖選項卡。

(可選)啟用其他測試功能

在使用測試實驗室運行測試之前,您可以在測試中啟用以下功能:

啟用 Orchestrator

Android Test Orchestrator是一個工具,可以獨立運行您應用的每個儀器測試。測試實驗室始終使用最新版本的 Orchestrator。

要為測試實驗室啟用 Orchestrator,請在檢測測試設置中單擊其他選項>使用 Orchestrator 運行

優點和缺點

  • 好處:沒有共享狀態。每個測試都在自己的檢測實例中運行,因此共享狀態不會在測試中累積。
  • 好處:孤立的崩潰。如果測試崩潰,則只有該檢測被終止,您的套件中的其他測試仍然可以運行。
  • 缺點:更長的運行時間。每個測試都運行自己的儀器實例,這意味著測試過程總體上需要稍長的時間。如果未選中,增加的運行時間可能會影響您的配額使用或計費時間,並可能導致您達到設備的超時限制

啟用分片

測試分片將一組測試分成獨立運行的子組(分片)。測試實驗室自動使用多個設備並行運行每個分片,並在更短的時間內完成整套測試。

測試分片的工作原理

假設您創建了 N 個分片。對於您選擇的每個設備,測試實驗室會啟動 N 個相同的設備並在每個設備上運行測試的子集。這意味著分片測試用例可以導致每個設備執行多個測試,這與非分片測試用例總是導致每個設備執行一個測試不同(有關測試實驗室中關鍵概念的快速概述,請參閱關鍵概念)。

您可以在 Firebase 控制台中啟用測試分片:

  1. 儀器測試設置中,單擊Additional options

  2. Sharding部分中,輸入要運行的分片數量。

測試分片計費

測試實驗室通過利用AndroidJUnitRunner 的內置分片機制來實現您的分片。為避免因旋轉空分片(未分配測試用例的分片)而被收費,您創建的分片數量應少於測試用例的總數。根據每個測試用例的運行時間,通常最好為每個分片分配 2-10 個測試用例。

有關計費的更多信息,請閱讀使用情況、配額和計費

,

本指南介紹瞭如何使用 Firebase 測試實驗室準備和運行儀器測試。要使用本指南,您需要使用EspressoUI Automator Android 測試框架的儀器測試(由您或您的團隊編寫)。儀器測試可以在物理設備上運行長達 45 分鐘,在虛擬設備上運行長達 60 分鐘。

在後面的步驟中,您會將應用的 APK 和測試的 APK 上傳到 Firebase。

(可選)將截圖庫添加到您的應用中

Firebase 測試實驗室包含一個庫 (testlab-instr-lib),您可以使用該庫處理在運行儀器測試時使用 AndroidX 的ScreenCapture拍攝的任何屏​​幕截圖,例如使用Espresso 測試框架編寫的測試。本節介紹如何使用 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 )中,為測試實驗室屏幕截圖庫添加一個依賴項。

    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 級別獲取 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 控制台的測試實驗室信息中心

  3. 最後,運行你的測試。

第 4 步:查看您的測試截圖

測試完成後,您可以查看在 Firebase 控制台中截取的任何屏幕截圖。

  1. 在“測試”選項卡中,選擇已完成的測試,然後單擊“結果”選項卡。

  2. 再次選擇您的測試,然後單擊出現的屏幕截圖選項卡。

(可選)啟用其他測試功能

在使用測試實驗室運行測試之前,您可以在測試中啟用以下功能:

啟用 Orchestrator

Android Test Orchestrator是一個工具,可以獨立運行您應用的每個儀器測試。測試實驗室始終使用最新版本的 Orchestrator。

要為測試實驗室啟用 Orchestrator,請在檢測測試設置中單擊其他選項>使用 Orchestrator 運行

優點和缺點

  • 好處:沒有共享狀態。每個測試都在自己的檢測實例中運行,因此共享狀態不會在測試中累積。
  • 好處:孤立的崩潰。如果測試崩潰,則只有該檢測被終止,您的套件中的其他測試仍然可以運行。
  • 缺點:更長的運行時間。每個測試都運行自己的儀器實例,這意味著測試過程總體上需要稍長的時間。如果未選中,增加的運行時間可能會影響您的配額使用或計費時間,並可能導致您達到設備的超時限制

啟用分片

測試分片將一組測試分成獨立運行的子組(分片)。測試實驗室自動使用多個設備並行運行每個分片,並在更短的時間內完成整套測試。

測試分片的工作原理

假設您創建了 N 個分片。對於您選擇的每個設備,測試實驗室會啟動 N 個相同的設備並在每個設備上運行測試的子集。這意味著分片測試用例可以導致每個設備執行多個測試,這與非分片測試用例總是導致每個設備執行一個測試不同(有關測試實驗室中關鍵概念的快速概述,請參閱關鍵概念)。

您可以在 Firebase 控制台中啟用測試分片:

  1. 儀器測試設置中,單擊Additional options

  2. Sharding部分中,輸入要運行的分片數。

測試分片計費

測試實驗室通過利用AndroidJUnitRunner 的內置分片機制來實現您的分片。為避免因旋轉空分片(未分配測試用例的分片)而被收費,您創建的分片數量應少於測試用例的總數。根據每個測試用例的運行時間,通常最好為每個分片分配 2-10 個測試用例。

有關計費的更多信息,請閱讀使用情況、配額和計費