Robotium自動化測試框架實用教程(圖)


一、簡介

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

 

二、相關下載

源碼獲取:http://code.google.com/p/robotium/

源API文檔:http://robotium.googlecode.com/svn/doc/index.html

 robotium5.1下載和最新API文檔:http://pan.baidu.com/s/1bnlO8MF

官方例子記事本:http://pan.baidu.com/s/1qWLVL72

重簽名工具:http://pan.baidu.com/s/1i3H0tKD

 

三、常用語法

1.等待timeout毫秒一個名字為name的Activity啟動: waitForActivity(String name, int timeout) 
實例:assertTrue("無法啟動啟動類", solo.waitForActivity ("MainActivity", 30000));

2.Robotium將睡眠設置的毫秒數:sleep(int time) 
實例:solo.sleep(5000)

3.清空EditText的內容:clearEditText(android.widget.EditText editText) 
實例:solo.clearEditText((EditText)solo.getView ("edtInsertName"))

4.根據按鈕上的文字點擊按鈕:clickOnButton(String text) 
實例:solo.clickOnButton("^綠色$");

5.根據文字點擊控件:clickOnText(String text) 
實例:solo.clickOnText("控件上顯示文字");

6.輸入內容:enterText(android.widget.EditText editText, String text) 
solo.enterText((EditText)solo.getView("edtInsertName"), "說些什么好呢?");

7.返回:goBack()

8.截屏並保存為設置的名字:takeScreenshot(String name) 
默認保存在: /sdcard/Robotium-Screenshots/


9.解鎖屏幕:unlockScreen()

四、實戰-針對APK進行的測試

 被測試項目為demo1,下面是實戰的具體步驟

1. 配置ANDROID_HOME為android sdk的安卓目錄,例如:D:\android-sdk

2. 在path下添加這兩個:%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;

3. 需要把APK重新簽名,因為robotium要求被測應用和測試代碼要有一致的簽名, 所以我們需要把下載到的apk,通過re-sign.jar來產生debug key的apk,這個重新生成的apk就會跟測試項目簽名一致了

4. 下載完后,需要配置ANDROID_HOME,就是安卓SDK的位置,然后把APK拉到圖標上,就會自動生成一個debug key的apk,如果無法直接單擊re-sign.jar運行,需要切換到放置該jar文件的目錄,cmd執行java -jar re-sign.jar產生新apk的過程中會彈出一個信息框,記得截下圖,因為里面有兩個信息我們等會的代碼中需要用到

5. 安裝產生的apk。然后打開模擬器(模擬器器一定要打開才能安裝成功),然后打開命令行  adb install mitalk_debug.apk(新生成apk的名稱) , 或者雙擊apk文件也可以安裝

安裝成功就可以再模擬器里看到該應用的圖標了

6. 打開Eclipse,點擊File->New一個Android Test Project  TestDemo1, 然后點擊下一步的時候選擇This project(因為我們測試的是APK),然后選擇要在哪個android版本上測試

7. 在該項目下創建一個包,com.example.demo1.test,在該包下創建TestDemo1Apk類,如下

package com.example.demo1.test;

import com.robotium.solo.Solo;

import android.test.ActivityInstrumentationTestCase2;
import android.widget.EditText;

@SuppressWarnings("rawtypes")
public class TestDemo1Apk extends ActivityInstrumentationTestCase2 {

        private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.example.demo1.MainActivity";//啟動類

        private static Class<?> launcherActivityClass;
        static{
                try {
                        launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
                } catch (ClassNotFoundException e) {
                        throw new RuntimeException(e);
                }
        }
        
        @SuppressWarnings("unchecked")
        public TestDemo1Apk() throws ClassNotFoundException {
                super(launcherActivityClass);
        }
        
        private Solo solo;
        
        @Override
        protected void setUp() throws Exception {
                solo = new Solo(getInstrumentation(), getActivity());
        }


    	public void testcase001() throws Exception {
    		 //等待  Activity "MainActivity" 啟動
    		assertTrue("無法啟動啟動類", solo.waitForActivity("MainActivity", 30000));
            solo.sleep(5000);

          //輸入文字:"131243"
            solo.enterText((EditText)solo.getView("edtInsertName"), "說些什么好呢?");
            solo.sleep(2000);
            
            //清空輸入框的內容
            solo.clearEditText((EditText)solo.getView("edtInsertName"));
            
            
            //按下 按鈕 "綠色"
            solo.clickOnButton("^綠色$");
            solo.sleep(2000);

            //按下 按鈕 "黃色"
            solo.clickOnButton("^黃色$");
            solo.sleep(2000);

            //按下 按鈕 "藍色"
            solo.clickOnButton("^藍色$");
            solo.sleep(2000);


            //按下 TextView "看我變變變~~~"
            solo.clickOnText("^看我變變變~~~$");
            solo.sleep(5000);      
            
    	}
    	

   @Override
   public void tearDown() throws Exception {
                solo.finishOpenedActivities();

  }


}

 

8.右鍵該項目,選擇property然后選擇java build path, 選擇 Add JARs,選擇下到的robotium.jar

Add Library,點擊Junit,選擇Junit4

 

9.在跑測試用例之前,還需要修改下AndroidManifest.xml文件的android:targetPackage為被測應用的根的包名

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.demo1" />

10.最后: run as android junit test,就可以進行測試了  

源碼下載http://pan.baidu.com/s/1ybPUI

 

五、實戰-針對工作目錄下的項目

 被測試項目為demo1,下面是實戰的具體步驟

1.新建一個測試項目名為demo1Test

Eclipse-File-Project-Android Test Project

測試項目名為demo1Test,測試目標項目選擇demo1 

   

 

2.添加必要類庫,robotium和junit

(1)在項目中新建lib目錄,把robotium-solo-5.1.jar和robotium-solo-5.1-javadoc.jar拉進該目錄。

(2)添加junit4

 

3.添加robotium

 

4.創建測試用例

右鍵點擊包-New-JUnit Test Case

最基礎的測試用例框架類

package com.example.demo1.test;

import com.example.demo1.MainActivity;//導入目標項目的啟動類
import android.test.ActivityInstrumentationTestCase2;
import com.robotium.solo.Solo;


public class TestDemo1 extends ActivityInstrumentationTestCase2<MainActivity>{//繼承目標項目的啟動類

	private Solo solo;//初始化一個solo對象

	public TestDemo1() {//在構造函數處標明繼承自目標項目的啟動類
		super(MainActivity.class);
	}
	
	@Override
	public void setUp() throws Exception {//在測試開始之前會調用這個方法,這里來創建一個Solo對象
		solo = new Solo(getInstrumentation(), getActivity());
	}

	@Override
	public void tearDown() throws Exception {//一個測試用例結束的時候會調用這個方法
		solo.finishOpenedActivities();//這個方法將結束掉所有在測試執行過程中打開的activity
	}



}

在基礎測試類里面添加相關的測試方法,也就是真正在執行的測試用例

package com.example.demo1.test;

import com.example.demo1.MainActivity;//導入目標項目的啟動類
import android.test.ActivityInstrumentationTestCase2;
import android.widget.EditText;

import com.robotium.solo.Solo;


public class TestDemo1 extends ActivityInstrumentationTestCase2<MainActivity>{//繼承目標項目的啟動類

	private Solo solo;//初始化一個solo對象

	public TestDemo1() {//在構造函數處標明繼承自目標項目的啟動類
		super(MainActivity.class);
	}
	
	@Override
	public void setUp() throws Exception {//在測試開始之前會調用這個方法,這里來創建一個Solo對象
		solo = new Solo(getInstrumentation(), getActivity());
	}

	
	public void testcase001() throws Exception {
		 //等待  Activity "MainActivity" 啟動
		assertTrue("無法啟動啟動類", solo.waitForActivity("MainActivity", 30000));
        solo.sleep(5000);

      //輸入文字:"131243"
        solo.enterText((EditText)solo.getView("edtInsertName"), "說些什么好呢?");
        solo.sleep(2000);
        
        //清空輸入框的內容
        solo.clearEditText((EditText)solo.getView("edtInsertName"));
        
        
        //按下 按鈕 "綠色"
        solo.clickOnButton("^綠色$");
        solo.sleep(2000);

        //按下 按鈕 "黃色"
        solo.clickOnButton("^黃色$");
        solo.sleep(2000);

        //按下 按鈕 "藍色"
        solo.clickOnButton("^藍色$");
        solo.sleep(2000);


        //按下 TextView "看我變變變~~~"
        solo.clickOnText("^看我變變變~~~$");
        solo.sleep(5000);      
        
	}
	
	
	@Override
	public void tearDown() throws Exception {//一個測試用例結束的時候會調用這個方法
		solo.finishOpenedActivities();//這個方法將結束掉所有在測試執行過程中打開的activity
	}



}

源碼共享:http://pan.baidu.com/s/1mgKcgju

 

六、一些特殊設置的說明

1.添加到庫內需要先新建Lib目錄,再把robotium-solo-5.2.1.jar放到里面,這樣移動項目就不會找不到

2.測試項目的AndroidManifest.xml里面    <uses-sdk android:minSdkVersion="10" />需要在8以上,而且要跟被測試的項目一樣大

3.需要勾選

 

4.最細節的就是:構造方法必須是無參數的,新建的測試用例一般都是有參數的:

public TestHelloWorldCase() {
super(HerlloActivity.class);
}

 

5.測試APK的時候需要重簽名,然后再安裝進去,才可以正常測試

 

6.如何配置Robotium的幫助提示

右鍵點擊項目-Build Path-configure Build Path

 

 

7.robotium不同版本的方法不同

robotium的getCurrentListViews
1.版本3.6版本和4.1以上版本的表達方式

3.6版本:ArrayList<ListView> lw = solo.getCurrentListViews();

4.1版本以上:ArrayList<ListView> lw = solo.getCurrentViews(ListView.class);

還有如:

ArrayList<ImageView> imageList=solo.getCurrentViews(ImageView.class);得到的即是ImageView
ArrayList<ImageView> imageList=solo.getCurrentViews(ImageView.class,parentView);

 

8.如何獲取控件ID-兩種方法

(1)Android 實用工具Hierarchy Viewer實戰

  • 是隨AndroidSDK發布的工具,位置在tools文件夾下,名為hierarchyviewer.bat
  • 需要運行測試項目,在調試環境下才可以檢測到模擬器的

(2)運行命令行記錄log,然后點擊對應Activity,接着可以在logcat看到


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM