Android開源測試框架學習

eex2 9年前發布 | 21K 次閱讀 Android Android開發 移動開發

Android測試大致分三大塊:

  1. 代碼層測試
  2. 用戶操作模擬,功能測試
  3. 安裝部署及穩定性測試
  4. </ol>

     代碼層測試

    對于一般java代碼,采用傳統的Junit測試,開發人員通常會編寫重要接口和函數的白盒測試代碼,不做過多討論。

    但因Android的特殊運行機制(Dalvik虛擬機),其中存在Application、Activity、Service等特殊組件,而這些組件都涉及到生命周期管理的問題。

    為了對這些組件進行測試,Google提供了一套針對性的測試框架,AndroidTestFramework

    官方教程鏈接 http://developer.android.com/training/testing.html

    官方api http://developer.android.com/reference/android/test/package-summary.html

    其中最為常用的就是針對Activity的測試,即ActivityInstrumentationTestCase2<T>類。

    繼承該類后可通過getActivity()方法獲取Activity的一個mock對象,從而實現各種界面元素的測試。代碼如下

    public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
            LoginActivityTest mActivity;
            Button btnLogin; public LoginActivityTest(){ super(LoginActivity.class);//必須實現super(testclass)  }

    @Override protected void setUp() throws Exception { super.setUp();
        mActivity = getActivity();
                btnLogin = mActivity.findViewById(R.id.btnLogin);
    } public void testGetActivity(){
           assertNotNull("can't get LoginActivity" , mActivity);
           assertNotNull("can't get loginButton" , btnLogin);
        }
    

    }</pre>

    需要注意的是,測試代碼運行的線程并不是UI線程。因此如果需要對UI元素進行setText或是click之類的操作,需要通過getActivity().runOnUiThread(action)方法執行。代碼如下

    getActivity().runOnUiThread(new Runnable() {
                @Override public void run() {
                     btnLogin.click();
                }
            });

     用戶操作模擬,功能測試

    雖然AndroidTestFramework可以幫助我們完成各種界面的測試。但是,這些代碼的編寫非常繁瑣。而且在大部分情況下,我們需要的是一個連貫性的,在多個Activity之間存在跳轉的業務流程測試。這種測試比較接近傳統的白盒測試,只針對可見的UI元素進行操作,模擬用戶的行為來完成測試。

    Google同樣為我們提供了一套專門針對UI元素的測試方案,具體可見http://developer.android.com/tools/testing/testing_ui.html

    可是Google的這套UI框架仍然不是很友好。為此,我尋找了一些相對成熟的測試框架來幫助我們。經過一系列分析比較和實際代碼測試,在這推薦采用Robotium開源框架做為今后一段時間內的主要業務測試框架。

     Robotium介紹

    Robotium是一款國外的Android自動化測試框架,主要針對Android平臺的應用進行黑盒自動化測試,它提供了模擬各種手勢操作(點擊、長按、滑動等)、查找和斷言機制的API,能夠對各種控件進行操作。Robotium結合Android官方提供的測試框架達到對應用程序進行自動化的測試。另外,Robotium 4.0版本已經支持對WebView的操作。Robotium 對Activity,Dialog,Toast,Menu 都是支持的。

    源碼及相關資料地址:https://code.google.com/p/robotium/

    Robotium具有清晰的調用方法、良好的兼容性、完善的文檔和大量的實際應用案例,并且支持截屏。最為符合我們目前的實際需求。經實際測試,無需特殊配置即可兼容Jenkins系統。
    下面以一段HSA項目中的實際測試代碼舉例。該測試用例完成從登陸、菜單選取、一直到功能界面輸入驗證的一個流程。

    public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
        Solo solo;
        LoginActivity mActivity; public LoginActivityTest(){ super(LoginActivity.class);
        }
    
        @Override protected void setUp() throws Exception { super.setUp();
    
            mActivity = getActivity();//初始LoginActivity solo = new Solo(getInstrumentation(),mActivity);//初始Robotium的主要入口,solo對象  } public void testLogin(){ //清除用戶名EditText內容 solo.clearEditText(0); //輸入"userName" 到用戶名EditText solo.enterText(0, "userName"); //清除密碼EditText內容 solo.clearEditText(1); //輸入"userPass" 到密碼EditText solo.enterText(1, "userPass"); //清除站點EditText內容 solo.clearEditText(2); //輸入"siteCode" 到站點EditText solo.enterText(2, "siteCode"); //點擊登陸按鈕 solo.clickOnButton("登錄"); //檢驗當前界面為MainListActivity solo.assertCurrentActivity("Expected MainListActivity activity", "MainListActivity"); //點擊動態菜單列表中的第一項,進入下一級子菜單界面 solo.clickInList(0); //檢驗當前界面為SubMenuActivity solo.assertCurrentActivity("Expected SubMenuActivity activity", "SubMenuActivity"); //點擊子菜單列表中的第一項,進入功能界面 solo.clickInList(0); //檢驗當前界面為ReceiveActivity solo.assertCurrentActivity("Expected ReceiveActivity activity", "ReceiveActivity"); //點擊界面中的"使用當前人員"按鈕 solo.clickOnButton("使用當前人員"); //輸入重量 solo.enterText(1, "123"); //輸入單號 solo.enterText(2, "21123456798"); //模擬軟鍵盤,發送EditText的ACTION_DONE事件 solo.getCurrentActivity().runOnUiThread(new Runnable() {
                @Override public void run() {
                    solo.getEditText(2).onEditorAction(EditorInfo.IME_ACTION_DONE);
                }
            }); //尋找是否有內容為"已掃描1件"的textview, 會自動等待10秒 boolean succ = solo.searchText("已掃描1件")) //判斷成功  assertTrue(succ);
        }
    }

    可見,Robotium通過一個solo對象來進行各種事件的模擬,代碼清晰易懂,并且完全兼容原生AndroidTestFramework

    安裝部署及穩定性測試

    安卓系統最為讓人詬病的問題就是碎片化,這點在中國比較明顯。大致上,2.3.X 和 4.x 的系統各占半壁江山,此外還存在大量的山寨定制系統。

    因此在這推薦兩款云端測試工具,Testin和百度云測試。

    兩個框架測試都很簡單,在官網注冊賬號后上傳apk即可,網站會用大量的真機進行安裝部署和monkey測試。測試完成后會發送一份測試給注冊郵箱。

    Testin支持Robotium框架的代碼測試,同時上傳項目apk和測試apk(相同簽名)即可。

    Testin地址: http://www.testin.cn/

    百度云測試: http://mtc.baidu.com/

    其他測試框架

    Monkey測試

    Android SDK開發包中自帶一個monkeyrunner的工具,可用來進行monkey測試。
    文檔地址:

    Robolectric

    一款基于JVM運行的Android測試框架,最大特點就是不需要啟動模擬器,因此速度非常快!
    目前已支持大部分原生SDK功能的測試,支持Resource,但對于一些特殊硬件上的模擬還存在欠缺。期待進一步的完善
    示例代碼:

    // Test class for MyActivity @RunWith(RobolectricTestRunner.class) public class MyActivityTest {
    
      @Test public void clickingButton_shouldChangeResultsViewText() throws Exception {
        Activity activity = Robolectric.buildActivity(MyActivity.class).create().get();
    
        Button pressMeButton = (Button) activity.findViewById(R.id.press_me_button);
        TextView results = (TextView) activity.findViewById(R.id.results_text_view);
    
        pressMeButton.performClick();
        String resultsText = results.getText().toString();
        assertThat(resultsText, equalTo("Testing Android Rocks!"));
      }
    }

    地址: http://robolectric.org/index.html

    Google Espresso

    Google于2013年10月開源的一款測試框架。據稱在Google內部已通過多個項目的實際驗證,并可能在未來加入到默認AndroidSDK中。
    設計上接近Robotium,主要用于業務端的模擬行為測試。相較Robotium,具有更為強大的UI元素匹配尋找功能和更快的運行速度。
    不過經過本人的實際使用,發現該框架的代碼編寫相對復雜,遠不如Robotium來的輕巧。此外,該框架無法運行在默認 AndroidTestFramework中(可認為是升級版),且因剛開源,缺少文檔和應用案例等資料,導致測試代碼編寫效率相對低下,故暫時不予采用。
    地址: https://code.google.com/p/android-test-kit/wiki/Espresso

    Mockito

    一款用于Mock測試的主流框架
    地址: https://code.google.com/p/mockito/

      List mockedList = mock(List.class);
      when(mockedList.get(0)).thenReturn("first");
      System.out.println(mockedList.get(0));

     總結

    如無意外,接下來一段時間內,Android項目會采用以下的方案搭建測試框架:

    • 代碼級: AndroidTestFramework + Junit
    • UI業務模擬: Robotium
    • 安裝部署: Testin
    • CI: Jenkins

    有興趣的同學也可關注下Robolectric和Espresso兩個框架的進展。

 本文由用戶 eex2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!