天天看點

使用Record Espresso Test功能自動生成測試代碼

上一篇文章介紹了如何使用Espresso架構編寫自動化測試代碼,算是一篇Espresso的入門文章吧,如果還不知道Espresso如何編寫測試代碼的,建議看一下上一篇文章,畢竟這篇文章是以上一篇文章為基礎的.

傳送門:Android自動化測試–Espresso架構使用

在上一篇文章文章的結尾我們說到,如果項目一旦很大,針對每個功能子產品全部手動編寫測試代碼的話,非常耗時耗力,是以如果有個能自動生成測試代碼的工具将是非常棒的事情.

自Android Studio2.2版本開始,google就在Android Studio中內建了Record Espresso Test功能,目前該功能還屬于測試階段,是以可能還不是特别好用.

關于如何使用Record Espresso Test功能,其實官網有有專門的一篇文章來介紹,我本來想把那篇文章翻譯過來當做本篇部落格的内容,但是在試着翻譯的過程中發現有很多單詞不認識,并且有時候即便知道那個單詞是什麼意思也組不成一句通順的話,是以為了不傳播錯誤知識還是不翻譯了,不過本篇文章也是在官方文檔的基礎上寫的.這裡貼出官方文檔的連結,英語好的可以直接閱讀官方文檔(需要翻牆),不用看我下面的内容了.

Create UI Tests with Espresso Test Recorder

下面開始正文:

Record Espresso Test功能位于Android Studio菜單欄中的“Run”功能菜單下.如下圖:

使用Record Espresso Test功能自動生成測試代碼

點選該功能後會彈出一個對話框讓你安裝你要測試的app,就和我們平時運作軟體一樣.

使用Record Espresso Test功能自動生成測試代碼

點選“OK”進行安裝,安裝好之後Android Studio 會彈出如下對話框:

使用Record Espresso Test功能自動生成測試代碼

該對話框中有2個地方需要說一下:

Add Assertion:添加一個斷言,這樣說可能不好了解,具體的表現就是,當你點選這個按鈕之後,Android Studio會捕獲你目前測試裝置的螢幕,然後你可以在捕獲的螢幕上進行點選操作,注意目前隻有點選操作能響應,滑動操作是不響應的,如下圖,當你點選“開始體驗”按鈕後,會有一個紅色框包裹住這個按鈕,然後點選“Save Assertion”或“Save And Add Another”按鈕,然後回到之前的對話框中,會發現界面有變化了,如下圖:

使用Record Espresso Test功能自動生成測試代碼
使用Record Espresso Test功能自動生成測試代碼

可以看到,之前的對話框中出現了一句話:Assert Button with child position 0 exists. (每個人測試顯示的結果可能不一樣).

“Complete Recording”:完成UI測試的記錄,點選這個按鈕之後,會彈出一個對話框用來命名這個測試類.根據自己的喜好命個名就行了,如下圖:

使用Record Espresso Test功能自動生成測試代碼

然後點選”Save”,Android Studio會根據你之前的操作并結合Espresso架構自動生成測試代碼,如下是我剛才點選”開始按鈕”之後,自動生成的測試代碼:

@LargeTest
@RunWith(AndroidJUnit4.class)
public class StartActivityTest {

    @Rule
    public ActivityTestRule<StartActivity> mActivityTestRule = new ActivityTestRule<>(StartActivity.class);

    @Test
    public void startActivityTest() {
        ViewInteraction button = onView(
                allOf(childAtPosition(
                        childAtPosition(
                                withId(R.id.viewPager),
                                ),
                        ),
                        isDisplayed()));
        button.check(matches(isDisplayed()));

    }

    private static Matcher<View> childAtPosition(
            final Matcher<View> parentMatcher, final int position) {

        return new TypeSafeMatcher<View>() {
            @Override
            public void describeTo(Description description) {
                description.appendText("Child at position " + position + " in parent ");
                parentMatcher.describeTo(description);
            }

            @Override
            public boolean matchesSafely(View view) {
                ViewParent parent = view.getParent();
                return parent instanceof ViewGroup && parentMatcher.matches(parent)
                        && view.equals(((ViewGroup) parent).getChildAt(position));
            }
        };
    }
}
           

可以看到除了測試用例之外,還自動生成了個私有靜态方法childAtPosition(),該方法主要用來判斷所指定的view是否正确的比對,如果沒有正确的比對,在你執行這個測試用例的時候會直接報Exception.

另外在你點選”Complete Recording”按鈕的時候可能會因為沒有在app的Gradle中內建相應的測試架構依賴,會彈出一個對話框,主要意思就是說Android Studio檢測到你沒有內建相應的測試架構依賴,是否要自動幫你內建上,然後你點選“Yes”,他就會幫你自動把相關的依賴包給你加上.

然後同步一下項目即可.

使用Record Espresso Test功能自動生成測試代碼

ok,到此為止,我們已經把如何使用Record Espresso Test功能說的差不多了(其實官網上說的比我的還詳細),講道理的話,大家應該差不多都會使用這個功能了.

下面,我們來說一說這個功能的不足,至少是在2.2版本中發現的不足:

1, 前面也已經說到,該功能不能記錄滑動事件,也就是說像上一篇文章中的ViewPager的滑動測試代碼是不能自動生成的,還是得需要我們自己手動敲上去.還有一些其他功能貌似也不支援自動生成代碼.是以這樣看來這個功能做的也挺操蛋的!!!

2,每次使用Record Espresso Test功能都要重新安裝一遍軟體,這個倒是說的過去,但是說不過去的是他總是把能記錄的所有操作都記錄了,這句話好像自相沖突,舉個例子大家就明白了:由于每次使用Record Espresso Test功能都要重新安裝一遍應用,是以每次都要從啟動界面開始,如果啟動界面有按鈕,比如像前文中的”開始體驗”按鈕什麼的,隻要你點選,它就會記錄,那麼郁悶的事情就發生了.如果我想測試軟體裡的某個界面,而這個界面恰好又藏得很深,我需要進行好些個操作才能到達這個頁面,這中間的每一步操作,他都會給你記錄上,但是本寶寶隻需要測試那個藏得很深的界面啊,其他記錄并沒有什麼用,而Record Espresso Test又沒有提供動态删除記錄的功能,你隻能等測試代碼生成完之後,然後再把多餘的代碼删掉.

以上兩點是我目前發現的不足,不知道是我的使用姿勢不對還是Android Studio确實沒有提供相關功能.不過不管怎麼說,Record Espresso Test功能都在一定程度上減少了我們編寫測試代碼的工作量.

最後在說幾句:

自動化測試這個工作有非常重要的意義,這兩篇文章其實最多也就是帶着大家入門,會編寫基本的自動化測試代碼,當你深入去了解自動化測試的時候會發現你所知道的測試知識其實隻是皮毛,你可能會感覺這兩篇文章說的連皮毛都達不到.另外如果你真的對測試感興趣想系統全面的研究的話,可以去閱讀官方的教育訓練文檔,這裡附上官網文檔位址:Test Your App 和 Best Practices for Testing

最後,Good Night!