Android UI測試之Espresso

2021-02-19 51Testing軟體測試網

Android自動化測試是應用開發中提升開發效率的一種方式,它可以在短時間內跑完所有的測試方案以及實現各種交互,從而讓開發者更加方便和直觀的知道代碼的實現效果。Android自動化測試可以分為單元測試、UI測試、Monkey測試三種,同時也分小中大三種測試。

單元測試又稱為模塊測試, 是針對程序模塊(軟體設計的最小單位)來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。Android中的單元測試是基於JUnit,可分為本地測試和Instrumented 測試。

單元測試最常用的框架就是JUnit跟Mockito組合的測試框架,其中JUnit用來跑主要的測試代碼,Mockito可以創建特定測試對象(非對象本身)並設置一些特定的屬性供測試使用。

UI測試是測試應用中的各種交互是否達到了實現的效果。常用的UI測試框架有Espresso和UIAutomator。

Espresso有三個重要的類:分別是Matchers(匹配器),ViewAction(界面行為),ViewAssertions(界面判斷),其中Matchers是常常是通過匹配條件來需找UI組件或過濾UI,而ViewAction是來模擬用戶操作界面的行為,ViewAssertions對模擬行為操作的View進行變換和結果驗證。它的執行順序如下:

在導入好包之後就可以module的AndroidTest包下開始編寫自己的UI自動化測試代碼了。

測試界面跳轉時需要用的Espresso-Intents庫,它是 Espresso 的擴展程序,支持對被測應用發出的intent進行驗證和打樁。它與Mockit 類似,但適用於Android Intent。Espresso-Intents有兩個比較重要的方法itending()和intended()。

    @Test fun validateIntentSentToPackage() {        user.clickOnView(system.getView(R.id.callButton))        intended(toPackage("com.android.phone"))    }   

Espresso測試有個很強大之處就是它在多個測試操作中是線程安全的,它會等待當前進程的消息隊列中的UI事件,並且在任何一個測試操作中會等待其中的異步任務結束才會執行下一個測試。

Espresso異步測試是要導入以下兩個包:

下面講一下異步測試的流程:

新建一個類繼承IdlingResource

public class SimpleIdlingResource implements IdlingResource {    private final String mResourceName;
private final AtomicInteger counter = new AtomicInteger(0);
private volatile ResourceCallback resourceCallback;
public SimpleIdlingResource(String resourceName) { mResourceName = resourceName; }
@Override public String getName() { return mResourceName; }
@Override public boolean isIdleNow() { return counter.get() == 0; }
@Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { this.resourceCallback = resourceCallback; }
public void increment() { counter.getAndIncrement(); }
public void decrement() { int counterVal = counter.decrementAndGet(); if (counterVal == 0) { if (null != resourceCallback) { resourceCallback.onTransitionToIdle(); } }
if (counterVal < 0) { throw new IllegalArgumentException("Counter has been corrupted!"); } }}

新建一個管理類去管理上述類

public class EspressoIdlingResource {    private static final String RESOURCE = "GLOBAL";
private static SimpleIdlingResource mCountingIdlingResource = new SimpleIdlingResource(RESOURCE);
public static void increment() { mCountingIdlingResource.increment(); }
public static void decrement() { mCountingIdlingResource.decrement(); }
public static IdlingResource getIdlingResource() { return mCountingIdlingResource; }}

將管理類插入到異步代碼中

在異步任務開始前插入代碼

 protected void onReqStart(int where) {          EspressoIdlingResource.increment();   }

異步任務結束後插入代碼

  private void onFinish() {       if(!EspressoIdlingResource.getIdlingResource().isIdleNow()){           EspressoIdlingResource.decrement();       }   }

在測試代碼中註冊IdlingRecource

@Before   public void setUp() throws Exception {              idlingresource = activityRule.getActivity().getIdlingresource();
Espresso.registerIdlingResources(idlingresource); }
@Test public void onLoadingFinished() throws Exception {
onView(withId(R.id.text)) .check(matches(withText("success!"))); }
@After public void release() throws Exception { Espresso.unregisterIdlingResources(idlingresource);   }

ViewAction()中的typeText()使用。

如果直接調用typeText(),那麼它的使用對象就一定是editText,如果是自定義的未繼承editText的view使用typeText()時,要在使用前supportsInputMethods(),否則會報錯誤。

     onView(allOf(supportsInputMethods(), isDescendantOfA(withId(R.id.test)))).perform(typeText("111111"))

在調用完typeText()後最好調用一下 closeSoftKeyboard(),否則會出現某些view在點擊時被阻擋而報錯。

自動化測試的目的不僅僅是解放雙手,它也可以讓開發者提前知道某些小bug,不用到了測試階段才被提出來,這樣就提升了開發的效率。

相關焦點

  • Google官方的UI自動化測試框架—— Espresso
    ,希望大家能更加悠閒地進行UI自動化測試。Espresso 是 Google官方提供的Android UI自動化測試的框架。使用 Espresso 能寫出簡潔,美觀,可靠的 android ui test。
  • 【轉】在Android Studio中進行單元測試和UI測試
    那是因為,位於src/tests目錄下的測試是運行在本地電腦Java虛擬機上的單元測試。編寫測試,實現功能使測試通過,然後再添加更多的測試...這種工作方式使快速迭代成為可能,我們稱之為測試驅動開發。值得注意的是,當在本地運行測試時,Gradle為你在環境變量中提供了包含Android框架的android.jar包。
  • 測試也是Android開發的重要部分,單元測試和UI測試上手實踐
    通常大型項目都是通過黑盒測試等方式來提供質量相關的保障,但同時筆者認為也需要 Android 端的單元測試以及能自動在 Android 平臺上運行的 UI 測試,這幾種測試有以下幾個優勢:/   Android測試代碼位置   /在 Android Studio 中新建新的項目時,它已自動為兩種測試類型創建了對應的代碼目錄:接下來,筆者將嘗試為自己的項目
  • Espresso淺析和使用
    Espress有3個特點:接下來,將從配置、寫用例、運行一步步介紹Espresso的使用。0.項目配置0.1 修改App的build.gradle在defaultConfig內增加,testInstrumentationRunner 「android.support.test.runner.AndroidJUnitRunner」,用來運行腳本增加packagingOptions,避免編譯時候License的衝突在dependencies中增加相關的引用(androidTestCompile
  • Android單元測試與模擬測試詳解
    Android領域中這塊還沒有普及,今天主要聊聊Android中的單元測試與模擬測試及其常用的一些庫。    一般單元測試:列出想要測試覆蓋的異常情況,進行驗證。    模擬測試: 根據需求,測試用戶真正在使用過程中,界面的反饋與顯示以及一些依賴系統架構的組件的應用測試。3.
  • Android自動化測試工具 UiAutomator使用詳解
    首先在app根目錄的build.gradle文件中加入依賴:androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2
  • Android單元測試的簡單使用
    我對測試的粗淺理解  任何軟體的開發過程中,測試絕對是不可或缺的一環,其重要程度幾乎和開發不相上下。  然鵝!  在我多年的開發經驗中(容我裝個B(。???)ノ),遇到的包含單元測試的項目或者願意主動寫測試的程式設計師卻少之又少。
  • UI設計教程之:ios與android ui適配(將IOS UI轉換成Android經驗暢談)
    內容提要:這是UI設計系列教程之ios與android ui適配經驗暢談。
  • Android Jacoco 代碼覆蓋率測試入門 | 白盒測試
    前言代碼覆蓋(Code Coverage)是軟體測試中的一種度量,描述程式中原始碼被測試的比例和程度,所得比例稱為代碼覆蓋率。在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標,甚至,用代碼覆蓋率來考核測試任務完成情況,比如,代碼覆蓋率必須達到 80% 或 90%。於是乎,測試人員會費盡心思設計案例覆蓋代碼。
  • 白盒測試 | Android jacoco 代碼覆蓋率測試入門
    前言最近同事搞了一個基於jacoco統計Android代碼覆蓋率測試的功能,可以統計每天手工測試的代碼覆蓋率.抱著好奇的心態,自己也學習一下jacoco
  • Espresso實戰:快速的Android UI自動化測試
    本文出自:Michael Evans,譯文出自:開發技術前線,譯者:desmond1121,校對者:Mr.Simple在我和很多Android開發者聊天的時候,我注意到他們在開發的過程中並不注重測試這一環節,原因是他們認為Android測試太難實現,
  • 【Android】Android Support Library與androidx的映射.含CSV格式映射下載連結
    :constraintlayoutcom.android.support.constraint:constraint-layout-solverandroidx.constraintlayout:constraintlayout-solvercom.android.support.test.espresso.idling:idling-concurrentandroidx.test.espresso.idling
  • Android架構初探 // lightSky'Blog
    UI獨立性在不變動系統其它部分的情況下,可以很方便的改變UI,比如,在沒有變動任何業務邏輯的情況下web ui可以被替換成console ui資料庫獨立性可以很自如的在Oracle,SQL Server之間切換,而不涉及業務邏輯任何外部代理模塊的獨立性
  • [Android開發 IV ]build.gradle文件詳解
    所以如果想用它來構建Android項目,需要聲明com.android.tools.build:gradle:4.1.0這個插件。+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'}plugins {id 'com.android.application'}
  • 自動化測試之小心做UI自動化一定要跨過這些坑
    1、優化測試代碼框架      無論你選擇appium、uiautomator、robotium還是espresso,剛入門時,看到的sample應該大致都是這樣的。圖二 uiautomator和espresso邏輯樣例       問題在哪裡?
  • 安卓 UI 壓力測試記錄(二)
    appetizer 文檔內提供了一種解決辦法:經過研究,uiautomator2 中 android-uiautomator-server 只是提供 selector、click 等相關的服務;atx-agent 提供執行設備端 shell 命令的功能。
  • Android Sunflower 帶您玩轉 Jetpack
    應用檢測 (方面) 使用了本地 JUnit 單元測試和 Espresso Android UI 測試。>> Kotlinhttps://developer.android.google.cn/kotlin>> Android KTXhttps://developer.android.google.cn/kotlin/ktx>> Fragmenthttps://developer.android.google.cn
  • Android:如何優雅的開發馬甲包?
    如果我們直接在主包上更新,一旦新功能不被用戶接受那就損失大了,我們前期大量投資帶來的用戶將會流失,這對很多產品開發者來說是不可承受之痛。如果使用馬甲包,則可以隨意測試新功能,好的功能就在主包上迭代,不好的也無所謂,馬甲包本身就是來背鍋的。3.導量主包和馬甲包屬於同一個平臺,用戶信息可以共享通過彈窗,廣告,Push等引導用戶下載主App。
  • Android Appium自動化測試實踐
    之前,否則android-sdk將無法安裝https://dl.google.com/android/adt/adt-bundle-windows-x86_64-20140702.zip  12.安裝android模擬器  https://pan.baidu.com/s/1pJLULXh這是Android開發所需的sdk,下載並解壓後,將解壓出的整個文件夾複製或者移動到...
  • Android 入門程序 Kotlin版(1)
    ><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myui"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher