背景介紹
android開發(fā)過程中,每次迭代升級都需要去回歸一下之前版本功能,看看最新的修改有沒有影響到之前的正常功能。然而這個過程永遠都是在做一些繁瑣的重復的操作,大大浪費人力,所以我們決定使用自動化來做這個事情,這就引入了我們接下來要介紹的自動化測試框架——robotium。
Robotium是一款國外的Android自動化測試框架,主要針對Android平臺的應用進行黑盒自動化測試,它提供了模擬各種手勢操作(點擊、長按、滑動等)、查找和斷言機制的API,能夠?qū)Ω鞣N控件進行操作。
配置robotium
robotium配置起來也很方面。首先在build.gradle中添加依賴
compile 'com.jayway.android.robotium:robotium-solo:5.6.0'
然后需要在測試工程中的AndroidManifest.xml中做如下的配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxxx.test">
<uses-library android:name="android.test.runner" />
<instrumentation
android:targetPackage="xxx"
android:name="android.test.InstrumentationTestRunner"
/>
</manifest>
上面的package="xxxx.test"是我們測試包的名稱,下面定義的instrumentation中的tartPackage="xxx"是我們被測試工程的包名稱,這個配置很關(guān)鍵,出問題的話很容易出現(xiàn)找不到被測試包的錯誤。以上就是簡單的配置了,接下來就可以開始寫測試代碼了。
Quick Start Guide
在測試包下面創(chuàng)建一個測試類,命名規(guī)范為XxxTest,該類繼承ActivityInstrumentationTestCase2,構(gòu)造方法中需要傳入app的啟動activity。代碼如下:
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "xxxx.LuancherActivity";
private static Class<?> launcherActivityClass;
static{
//通過反射的方式獲取的
try {
DebugUtil.debug(TAG, "啟動類"+LAUNCHER_ACTIVITY_FULL_CLASSNAME);
launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public XxxTest() throws ClassNotFoundException {
super(launcherActivityClass);
}
以上就設(shè)置好了啟動的activity,然后需要重載兩個方法
public void setUp() throws Exception;
public void tearDown() throws Exception;
setUp()做一些啟動測試前的準備工作,如創(chuàng)建Solo實例,啟動activity等
@Override
public void setUp() throws Exception {
super.setUp();
//創(chuàng)建Solo實例
solo = new Solo(getInstrumentation());
//啟動activity
getActivity();
}
tearDown()中測試做一些善后的工作,如結(jié)束activity等
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
super.tearDown();
}
上述工作準備好之后,剩下的就是我們的測試主體方法了。方法格式如下:
public void testXxxx() {
}
注意測試方法必須按照如上格式,否則框架無法識別測試方法,也就無法運行了。這種形式的方法在一個類中是可以定義多個的。在setUp()中我們定義了一個Solo實例,這個實例到底有什么用呢?接下來稍微講一些Solo類的用法,如果里面有的功能無法滿足你的需求,可以自行去查看api文檔。
Solo類用法
- 點擊控件
solo.clickOnView(solo.getView(???));
-
獲取控件
solo.getView()
獲取控件api
參數(shù)說明:
int id:直接調(diào)用R.id.xxx
int index:表示該控件是該頁面的第幾個同id控件。
Object tag:控件的tag屬性
String id:xml中定義的id屬性 -
點擊按鈕(可通過點擊控件實現(xiàn))
solo.clickOnButton()
點擊按鈕
參數(shù)說明:
int index:該頁面的第幾個按鈕
String text:按鈕上的文字 -
驗證toast文字
驗證toast
toast的本質(zhì)就是一個TextView,通過上述代碼即可驗證toast中顯示的文本。
-
在輸入框輸入文本
輸入文本
參數(shù)說明:
第一種方法獲取editText可以通過2中的方法獲取,text即為待輸入文本。
第二種方法中index為該頁面上的第幾個輸入框。 -
等待對話框關(guān)閉和打開
對話框
參數(shù)說明:
long timeout:設(shè)置超時時間,單位為毫秒 -
驗證activity的加載
驗證activity加載
參數(shù)說明:
String:直接傳入activity名稱字符串即可。
int:超時事件,默認為20000,單位為毫秒
Class<? extends Activity>:直接傳入activity實例 -
獲取網(wǎng)頁元素
獲取網(wǎng)頁元素
主要說明一下By類的用法
By.id(String) 元素的id
By.xpath(String) 元素的節(jié)點路徑
By.cssSelector(String) 元素的css selector
By.name(String) 元素的name屬性
By.className(String) 元素的class屬性
By.textContent(String) 元素的textContent屬性
By.tagName(String) 元素的tag屬性 -
網(wǎng)頁元素輸入文本
網(wǎng)頁元素輸入enter
網(wǎng)頁元素輸入type
type和enter的區(qū)別在于type輸入時,相當于在輸入完后直接鍵入了一個回車,而enter沒有。
-
點擊網(wǎng)頁元素
點擊網(wǎng)頁元素
int match表示當有多個匹配時取哪一個,默認為0
boolean srcoll 表示是否要滑動,默認為true -
驗證網(wǎng)頁元素是否加載成功
驗證網(wǎng)頁元素是否加載成功
int miniumumNumberOfMatch 表示至少要找到多少個
int timeout 超時,單位為毫秒
boolean scroll 是否滑動










