日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Espresso浅析和使用

發布時間:2023/12/31 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 Espresso浅析和使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎大家前往騰訊云社區,獲取更多騰訊海量技術實踐干貨哦~


Espresso是一個Google官方提供的Android應用UI自動化測試框架。Google希望,當Android的開發者利用Espresso寫完測試用例后,能一邊看著測試用例自動執行,一邊享受一杯香醇Espresso(濃咖啡)。
Espress有3個特點:

第一個收錄在Android Testing Supporting Library底下的測試框架
模擬用戶的操作
自動等待,直到UI線程Idle,才會執行測試代碼

接下來,將從配置、寫用例、運行一步步介紹Espresso的使用。

0. 項目配置

0.1 修改App的build.gradle

在defaultConfig內增加,testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”,用來運行腳本
增加packagingOptions,避免編譯時候License的沖突
在dependencies中增加相關的引用(androidTestCompile只有在編譯測試用例時候才會運行,普通編譯不會)
下面是build.gradle中涉及到Espresso配置的內容

android {
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
       }
    }
    packagingOptions {
        exclude 'LICENSE.txt'
    }
}
dependencies {
    // Espresso 相關的引用
    compile 'com.android.support:support-annotations:22.1.1'
    androidTestCompile 'com.android.support:support-annotations:22.1.1'
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.1'){
        exclude group: 'javax.inject'
    }
    androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.1'
    androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.1'
    androidTestCompile 'com.android.support.test:runner:0.2'
}

0.2 添加TestRunner

點擊頂欄菜單Run->Edit Configurations,出現如下的窗口后,點擊左上角的”+”,選擇”Android Tests”;

修改新Configuration的名字,選中App Module,輸入Runner,選擇”Show chooer dialog”,點擊”OK”完成

1. 寫測試用例

1.1 三步曲

寫UI自動化測試用例,歸結起來就是3步:

定位View控件
操作View控件
校驗View控件的狀態
對應Espresso,就是以下3個方法的調用:

onView(ViewMatcher)
  .perform(ViewAction)
  .check(ViewAssertion);

其中,onView是用來定位View控件的,perform是操作控件的,check是校驗View控件的狀態。他們各自都需要再傳入對應的參數分別如下:

ViewMatcher,有withId、withText、withClassName等等方法來定位View控件
ViewAction,有click()、longClick()、pressBack()、swipeLeft()等等方法來操作View控件
ViewAssertion,有isEnabled()、isLeftOf()、isChecked()等等方法來校驗View控件狀態
這里有ViewMatcher、ViewAction、ViewAssertion的Cheat Sheet。

1.2 完整測試用例代碼

這是一個非常簡單的測試用例,通過R.id.button定位控件,對它調用了一下click,最后校驗控件是不是enabled狀態。這里面有一些注解,@Rule修飾的是被測試的Activity,@Test修飾的方法是測試用例。

@RunWith(AndroidJUnit4.class)public class MainActivityTest {    @Rule
    public ActivityTestRule mActivityRule = new ActivityTestRule(MainActivity.class);    @Test
    public void testTextViewDisplay() {
        onView(withId(R.id.button))
            .perform(click())
            .check(matches(isEnabled()));
    }
}

1.3 注意

Getting Started With Espresso 2.0這個視頻中提到了2個寫測試用例時的注意項:

避免Activity的層級跳轉,測試用例盡量只在單個Activity內完成。Activity層級跳轉越多,越容易出錯
強烈不推薦,直接獲取View的對象,調用View的方法來模擬用戶操作。應該統一使用Espresso提供的方法
測試用例,特別是UI自動化測試用例,應該盡量保持邏輯簡單,覆蓋關鍵路徑就足矣。因為UI變動是很頻繁的,越復雜,維護成本就越高,投入產出比就會自然降低了。

2. 運行用例

在運行菜單中選擇步驟0.2中設置的TestRunner,點擊執行
測試用例模擬用戶操作自動運行
測試用例執行完成,在Android Studio的控制臺上,能看到如下的結果輸出

其中,看到”Done 3 of 3”標識,一共3個檢查點,都檢查通過了。如果有檢查不通過的話,右上角的綠色能量條會變成紅色。

3. 進階

3.1 onData的使用

對于ListView,如果要操作其中的某一個item,特別是不可見狀態的item,是不能通過上述的ViewMatch來定位的。我們都知道ListViewView是復用的,不可見狀態的item并沒有把內容繪制到View上。Espresso針對AdapterViewListView的父類),提供了onData來支持。

onData(ObjectMatcher)
  .DataOptions
  .perform(ViewAction)
  .check(ViewAssertion);

onData傳入的是一個ObjectMather。首先假設ListView的Adapter中的Item的定義如下:

public static class Item {
    private final int value;
    public Item(int value) {
        this.value = value;
    }
    public String toString() {
        return String.valueOf(value);
    }
}

下面定義一個withValue()的方法,返回一個BoundedMatcher。而其中的matchesSafely()方法是用來判斷match與否的,判斷的邏輯實現都放在這里。



public static Matcher<Object> withValue(final int value) {
    return new BoundedMatcher<Object,
            MainActivity.Item>(MainActivity.Item.class) {
        @Override public void describeTo(Description description) {
            description.appendText("has value " + value);
        }
        @Override public boolean matchesSafely(
                MainActivity.Item item) {
            return item.toString().equals(String.valueOf(value));
        }
    };
}

有了上面的鋪墊,測試用例寫起來就水到渠成了。在id是R.id.listAdapterView中找到數據項是27,然后執行click()操作。

@Test
public void clickItem() {
    onData(withValue(27))
            .inAdapterView(withId(R.id.list))
            .perform(click());
    //Do the assertion here.
}

最后需要注意的是,onData()并不適用于RecyclerView,因為它不是繼承自AdapterView。Espresso提供專門給RecyclerView使用的RecyclerViewActions

@Test 
public void clickItem() {
    onView(withId(R.id.recycler_view))
            .perform(
                    RecyclerViewActions.actionOnItemAtPosition(27, click()));
}

3.2 Idling Resource的使用

應用開發中很常見的一個場景是,點擊某個按鈕,發起網絡請求,等請求回來后解析數據,更新界面。Espresso針對這種測試場景,提供了原生的支持。
假設被測Activity初始化后有一個耗時的數據加載過程,activity.isSyncFinished()方法判斷數據加載是否已經完成。代碼如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    //模擬耗時的數據加載
    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            mIsSyncFinished = true;
        }
    }, 5000);
}

private volatile boolean mIsSyncFinished = false;
public boolean isSyncFinished() {
    return mIsSyncFinished;
}

這種情況,Espresso提供了IdlingResource來保證數據加載完成了才開始執行測試用例代碼。首先,需實現IdlingResource接口:

getName()方法返回的String是作為注冊回調的Key,所以要確保唯一性
registerIdleTransitionCallback()的參數ResourceCallback會用做isIdleNow()時候的回調
isIdleNow()是否已經處于空閑狀態,這里調用activity.isSyncFinished()方法來判斷數據加載是否完成

private static class MyIdlingResource implements IdlingResource {
    private ResourceCallback mCallback = null;
    private MainActivity mActivity;

    MyIdlingResource(MainActivity activity) {
        mActivity = activity;
    }

    @Override
    public String getName() {
        return "MyIdlingResource";
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback callback) {
        mCallback = callback;
    }

    @Override
    public boolean isIdleNow() {
        boolean isIdle = mActivity != null && mActivity.isSyncFinished();
        if (isIdle && mCallback != null) {
            mCallback.onTransitionToIdle();
        }
        return isIdle;
    }
}

MyIdlingResource需要在恰當的時機注冊和反注冊。@Before@After是依照JUnit4的慣例,分別在用例執行之前和之后去注冊和反注冊。那么,如下測試用例執行的過程是:

測試用例啟動,注冊MyIdlingResource
啟動被測Activity
Activity初始化,啟動數據加載過程
Activity數據加載完成,執行測試用例方法testTextViewDisplay()
測試用例結束,反注冊MyIdlingResource
可見,IdlingResource能夠保證流轉到Idle狀態,才會執行測試代碼:

@Test
public void testTextViewDisplay() {
    onView(withText("Show SnackBar")).check(ViewAssertions.matches(isDisplayed()));
}

@Before
public void registerIntentServiceIdlingResource() {
    Activity activity = mActivityRule.getActivity();
    idlingResource = new MyIdlingResource((MainActivity) activity);
    Espresso.registerIdlingResources(idlingResource);
}

@After
public void unregisterIntentServiceIdlingResource() {
    Espresso.unregisterIdlingResources(idlingResource);
}

3.3. 執行原理

本文開頭提到Espresso其中一個特點,無需主動寫Sleep等待UI事件的執行和UI的繪制。原因是,Espresso的用例運行過程是只有當UI線程IDLE和UI隊列沒有需要執行的事件時,Espresso的測試代碼才會被執行。使用方無需寫Sleep邏輯等待UI繪制完成。以下是Espresso測試用例執行簡易的流程圖,幫助理解:

寫在最后

引用官方介紹的一段話,Espresso的目標受眾是開發者。希望更多的團隊能夠實現Google的期許最大化利用Espresso,把Bug扼殺在搖籃中。

Target Audience
Espresso is targeted at developers, who believe that automated testing is an integral part of the development lifecycle. While it can be used for black-box testing, Espresso’s full power is unlocked by those who are familiar with the codebase under test.

引用

Getting Started With Espresso 2.0:https://www.youtube.com/watch?v=TGU0B4qRlHY
Advanced Android Espresso:https://realm.io/news/chiu-ki-chan-advanced-android-espresso-testing/
Android Espresso 測試框架探究:http://blog.csdn.net/weijianfeng1990912/article/details/51540468
Android自動化測試-AdapterView的測試:https://segmentfault.com/a/1190000004392396
Android單元測試研究與實踐:http://tech.meituan.com/Android_unit_test.html

文章來自: QQ音樂技術團隊 公眾號

相關閱讀

網頁加速特技之 AMP

表格行與列邊框樣式處理的原理分析及實戰應用

「騰訊云游戲開發者技術沙龍」11月24 日深圳站報名開啟 暢談游戲加速

此文已由作者授權騰訊云技術社區發布,轉載請注明原文出處

原文鏈接:https://cloud.tencent.com/community/article/520289?utm_source=bky

海量技術實踐經驗,盡在騰訊云社區!

總結

以上是生活随笔為你收集整理的Espresso浅析和使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。