一、簡介
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看到