用Robotium對android進行自動化測試的探索

weixin_33807284發表於2017-05-25

一.簡介

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

二.相關背景

市面上已經有很多關於Robotium的介紹與教程,大部分都是人工編寫執行動作,對android介面進行點選,並且記錄點選結果或者進行相關判斷,很少有對app進行隨機自動點選的測試指令碼,所以本人決定嘗試編寫對app進行隨機點選的自動化測試。但中途遇見了很多坑,所以寫此部落格將相關內容記錄下來。

三.初始思路

1.對app介面基於位置進行隨機點選,即先獲得手機螢幕大小,隨機生成座標點,利用robotium的api進行點選
2.對app基於控制元件進行隨機點選,即先獲取當前介面所有控制元件,隨機選取控制元件進行點選。

考慮過後決定採用第二種方法,第一種方法開銷太大,並且效率不高

四.實現過程

由於一個app可能由多個activity組成,每個activity又可能有多個可選控制元件,如果遞迴遍歷的話會出現組合爆炸的情況,所以決定隨機選擇控制元件並點選。
Robotium提供了一些獲取控制元件的api,如
solo.getCurrentViews(),solo.getCurrentViews(Class<T> classToFilterBy, View parent)等。

但是這些api可能獲取到的並不是實際的控制元件內容,可能會有一些隱藏的控制元件也會被獲取到,所以就要對獲取到的控制元件進行一些處理,這裡主要用到了控制元件的三個屬性
isClickable
isEnable
isFocusable
isClickable為true的控制元件即為可以點選的控制元件,isEnable為true的控制元件即為有效控制元件,isFocusable的控制元件即為可以獲得焦點的控制元件,通過這三個屬性即可判斷這個控制元件是否是我們需要點選的有效的控制元件。

接下來就是要隨機選擇常用的控制元件來進行點選,這裡選擇了Button,ImageButton,EditText,ListView,CheckBox,RadioButton,RadioGroup,ActionMenuView,SeekBar,LinearLayout,TextView,ImageView,RelativeLayout,FrameLayout,CheckedTextView,Spinner這些常用的控制元件。

如果要選擇獲取某一型別的所有控制元件,可以執行以下程式碼
List<ImageButton> list1=solo.getCurrentViews(ImageButton.class);
即可獲得當前頁面的所有ImageButton

List<View> list1=solo.getCurrentViews();
則會獲得當前介面所有的控制元件

這裡對這些控制元件進行點選或者進行一些操作可能會出現另外一個問題
Method getText() must be called from UI thread
這是由於我們在測試類中呼叫了改變介面控制元件內容的方法,而這些方法只能在UI執行緒中呼叫,關於android中的UI執行緒和非UI執行緒在這裡不做過多說明,網上有很詳細的解釋。所以我們不能直接對控制元件進行操作,需要採用下面的這種方式來操作控制元件:
<pre>solo.getCurrentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
editText.setSelection(editText.getText().length(), editText.getText().length());
editText.setText("test");
}
});</pre>

五.應用場景

這種隨機自動化測試一般不會獨立存在,需要結合其他的測試方法或者工具來進行使用,比如結合影象對比等技術,這裡只是粗略的對robotium工具進行了探索與嘗試,並描述了一種隨機自動化測試的方法,以後還將進行更深入的探索。

相關文章