簡(jiǎn)介
Robotium是一款國(guó)外的自動(dòng)化測(cè)試框架,是一款免費(fèi)的Android UI測(cè)試工具锰茉,目前最新的版本是5.6.3,主要針對(duì)Android平臺(tái)的應(yīng)用進(jìn)行黑盒自動(dòng)化測(cè)試,它提供了模擬各種手勢(shì)操作(點(diǎn)擊佛点、長(zhǎng)按、滑動(dòng)等)、查找和斷言機(jī)制的API超营,能夠?qū)Ω鞣N控件進(jìn)行操作鸳玩。Robotium結(jié)合Android官方提供的測(cè)試框架達(dá)到對(duì)應(yīng)用程序進(jìn)行自動(dòng)化的測(cè)試。
Robotium測(cè)試腳本是用java寫的演闭,該框架使用簡(jiǎn)便不跟,支持性良好,支持native和hybird的自動(dòng)化測(cè)試米碰,API使用起來(lái)方便簡(jiǎn)單窝革,執(zhí)行速度快,可根據(jù)控件ID操作吕座,可以自動(dòng)處理多個(gè)Android 的Activity聊闯,也可以和Maven、Gradle以及Ant更好的結(jié)合米诉,成為可以持續(xù)集成的測(cè)試菱蔬;另外它既可以基于源碼操作,也能基于APK(無(wú)源碼)測(cè)試史侣,功能強(qiáng)大拴泌。
Robotium Recorder是Robotium團(tuán)隊(duì)四五年以來(lái)對(duì)Robotium框架的可持續(xù)的創(chuàng)造和改造的成果,可以幫助我們快速的錄制Java腳本(收費(fèi))惊橱,而且錄制好的腳本經(jīng)過適當(dāng)?shù)耐晟菩薷木涂梢暂敵龇€(wěn)定的測(cè)試用例蚪腐,遺憾的是目前該服務(wù)是收費(fèi)的,僅僅能體驗(yàn)一下税朴。
Robotium官網(wǎng):https://github.com/RobotiumTech/robotium
Robotium API 簡(jiǎn)介官網(wǎng):http://recorder.robotium.com/javadoc/
Robotium自動(dòng)化測(cè)試的原理
Robotium是基于instrumentation的二次封裝回季。Roboiutm分查找控件和點(diǎn)擊控件兩大類操作。查找控件的原理是:在waitter的waitForView()方法里面通過java反射獲得視圖正林,并匹配所需要的控件泡一,查找并返回控件對(duì)象。點(diǎn)擊控件的原理是:查找到的控件對(duì)象解析包裝成MotionEvent觅廓,基于Instrumentation框架鼻忠,通過InputManager注入事件。調(diào)用類組織結(jié)構(gòu)如下圖簡(jiǎn)示:
Robotium自動(dòng)化工程----黑盒(基于APK(無(wú)源碼)的自動(dòng)化測(cè)試)
測(cè)試步驟:
1.創(chuàng)建Android工程
? 要和測(cè)試的APK同包名杈绸,同簽名 , 雖然安裝到手機(jī)上仍然會(huì)識(shí)別為兩個(gè)應(yīng)用帖蔓,但是如果測(cè)試應(yīng)用和待測(cè)應(yīng)用同時(shí)運(yùn)行,由于他們具有相同的數(shù)字簽名瞳脓,Android系統(tǒng)的Instrumentation可以將它們加載到同一個(gè)進(jìn)程中運(yùn)行塑娇,這樣的話,測(cè)試代碼就可以獲取到待測(cè)應(yīng)用的數(shù)據(jù)劫侧,更為詳細(xì)的過程可以研究系統(tǒng)的測(cè)試框架Instrumentation埋酬。
Robotium框架需要被測(cè)應(yīng)用和測(cè)試工程需要使用相同的簽名,這樣才可以使用Instrumentation把被測(cè)應(yīng)用啟動(dòng)起來(lái)
APK重簽名:在基于APK的自動(dòng)化測(cè)試過程中,需要確保被測(cè)試的APK必須與測(cè)試項(xiàng)目具有相同的簽名奇瘦。利用工具re-sign.jar棘催,用法可自行baidu。(re-sign重簽名找的debug.keystore)
2.配置Gradle
工程目錄的build.gradle中添加依賴
如果需要使用Robotium耳标,就必須使用android.test.InstrumentationTestRunner醇坝。簡(jiǎn)單講,Instrumentation框架是android測(cè)試環(huán)境 的核心次坡,在這個(gè)框架下呼猪,測(cè)試應(yīng)用程序 可以精確控制應(yīng)用程序。它可以理解為 一種沒有圖形界面的砸琅,具有啟動(dòng)能力的 宋距,用于監(jiān)控其他類的工具類,其中的關(guān)鍵類就是InstrumentationTestRunner症脂。
android {
...
defaultConfig {
...
testInstrumentationRunner "android.test.InstrumentationTestRunner"
}
}
dependencies {
...
androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.6.3'
}
在瀏覽器中搜索maven倉(cāng)庫(kù)谚赎,搜索robotium,選擇最新版本诱篷,切換到gradle下壶唤,把包名:名稱:版本添加到dependencies中(以冒號(hào)分隔)
3,寫測(cè)試代碼并打包
本工程項(xiàng)目主要是寫測(cè)試代碼(針對(duì)APK)棕所,所以在androidTest/java/包下寫代碼闸盔,Android代碼不用理會(huì)。寫完測(cè)試代碼后琳省,執(zhí)行命令打包測(cè)試apk迎吵。
robotium是基于ActivityInstrumentationTestCase2的二次封裝,測(cè)試方法都需要繼承父類针贬。每個(gè)測(cè)試類都是以setUp開始击费,以tearDown結(jié)尾,中間再添加各個(gè)test case坚踩。
在測(cè)試包下面創(chuàng)建一個(gè)測(cè)試類荡灾,命名規(guī)范為XxxTest,該類繼承ActivityInstrumentationTestCase2瞬铸,構(gòu)造方法中需要傳入app的啟動(dòng)activity。
例子:在該項(xiàng)目下創(chuàng)建一個(gè)包础锐,com.example.demo1.test,在該包下創(chuàng)建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";//啟動(dòng)類
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;
以上就設(shè)置好了啟動(dòng)的activity,然后需要重載兩個(gè)方法
public void setUp() throws Exception;
public void tearDown() throws Exception;
setUp()做一些啟動(dòng)測(cè)試前的準(zhǔn)備工作皆警,如創(chuàng)建Solo實(shí)例拦宣,啟動(dòng)activity等
@Override
public void setUp() throws Exception {
super.setUp();
//創(chuàng)建Solo實(shí)例
solo = new Solo(getInstrumentation());
//啟動(dòng)activity
getActivity();
}
tearDown()中測(cè)試做一些善后的工作,如結(jié)束activity等
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
super.tearDown();
}
上述工作準(zhǔn)備好之后,剩下的就是我們的測(cè)試主體方法了摹蘑。方法格式如下:
public void testcase001() {
}
代碼整合:
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";//啟動(dòng)類
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
public void setUp() throws Exception {
super.setUp();
//創(chuàng)建Solo實(shí)例
solo = new Solo(getInstrumentation());
//啟動(dòng)activity
getActivity();
}
public void testcase001() {
//測(cè)試用例
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
super.tearDown();
}
}
實(shí)戰(zhàn)-針對(duì)工作目錄下的項(xiàng)目
最基礎(chǔ)的測(cè)試用例框架類
package com.example.demo1.test;
import com.example.demo1.MainActivity;//導(dǎo)入目標(biāo)項(xiàng)目的啟動(dòng)類
import android.test.ActivityInstrumentationTestCase2;
import com.robotium.solo.Solo;
public class TestDemo1 extends ActivityInstrumentationTestCase2<MainActivity>{//繼承目標(biāo)項(xiàng)目的啟動(dòng)類
private Solo solo;//初始化一個(gè)solo對(duì)象
public TestDemo1() {//在構(gòu)造函數(shù)處標(biāo)明繼承自目標(biāo)項(xiàng)目的啟動(dòng)類
super(MainActivity.class);
}
@Override
public void setUp() throws Exception {//在測(cè)試開始之前會(huì)調(diào)用這個(gè)方法蜂奸,這里來(lái)創(chuàng)建一個(gè)Solo對(duì)象
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
public void testcase001(){
//測(cè)試用例
}
@Override
public void tearDown() throws Exception {//一個(gè)測(cè)試用例結(jié)束的時(shí)候會(huì)調(diào)用這個(gè)方法
solo.finishOpenedActivities();//這個(gè)方法將結(jié)束掉所有在測(cè)試執(zhí)行過程中打開的activity
solo.tearDown();
}
}
4.安裝apk進(jìn)行測(cè)試
①安裝待測(cè)apk
adb install 待測(cè)apk路徑
安裝完畢后遗座,可以執(zhí)行命令,來(lái)查看是否安裝上了對(duì)應(yīng)的InstrumentationTestRunner
adb shell pm list instrumentation
結(jié)果中會(huì)列出手機(jī)上安裝的所有的instrumentation測(cè)試程序珊蟀,找到自己的,看是否正確:
instrumentation:包名.test/android.test.InstrumentationTestRunner (target=包名)
Ttips:如果你發(fā)現(xiàn)你的使用的是Android.support.test.runner.AndroidJUnitRunner外驱,則表示沒有配置 testInstrumentationRunner "android.test.InstrumentationTestRunner"育灸,這個(gè)是Android Studio默認(rèn)的JUnitRunner,進(jìn)行junit測(cè)試的昵宇,需要在gradle中修改掉磅崭。
②安裝用于robotium測(cè)試的apk
adb install 測(cè)試apk的路徑
可以執(zhí)行命令列出所有的第三方應(yīng)用,查看兩個(gè)包是否安裝成功瓦哎,其中待測(cè)spk的包名為:"包名.test"
adb shell pm list packages -3
③開啟測(cè)試
adb shell am instrument -w 包名.test/android.test.InstrumentationTestRunner
稍等片刻砸喻,首先會(huì)啟動(dòng)測(cè)試程序,測(cè)試程序會(huì)去啟動(dòng)被測(cè)應(yīng)用蒋譬,然后模擬點(diǎn)擊和輸入割岛,最終給出簡(jiǎn)單的測(cè)試結(jié)果。
Robotium自動(dòng)化工程----白盒(基于源碼操作)
1.創(chuàng)建Android項(xiàng)目
2.安裝Robotium插件
在android studio中集成Robotium和集成其他的插件一樣羡铲,F(xiàn)ile->Setting->Pluygins-Browse repositories蜂桶,輸入robotium,找到Robotium Recorder并點(diǎn)擊安裝也切,安裝完重啟即可扑媚。然后,該插件就會(huì)出現(xiàn)在Tools菜單中:
3.啟動(dòng)插件
安裝完插件以后雷恃,使用ADB連接上手機(jī)或者模擬器疆股,并且設(shè)備必須有外部存儲(chǔ)。
點(diǎn)擊Tools菜單中的Robotium Recorder倒槐,出現(xiàn)該插件的對(duì)話框旬痹,
此時(shí)選擇有兩個(gè):
①點(diǎn)擊”select apk”,選擇APK讨越,然后點(diǎn)擊”Next”两残,最終會(huì)在本項(xiàng)目工程中創(chuàng)建一個(gè)module用來(lái)測(cè)試,此時(shí)做的就是黑盒測(cè)試把跨;
②在中間的框內(nèi)會(huì)出現(xiàn)本工程中包含的module人弓,選中之后,該插件會(huì)自動(dòng)打包成apk文件着逐,點(diǎn)擊”Next”崔赌,最終默認(rèn)會(huì)在選中的module中的測(cè)試文件夾下生成測(cè)試用例意蛀,此時(shí)就是白盒測(cè)試。從測(cè)試的角度講就是關(guān)聯(lián)了源代碼健芭,從開發(fā)的角度講县钥,就是相當(dāng)于單元測(cè)試。需要注意的時(shí)候慈迈,由于是該插件打包的若贮,所以默認(rèn)使用的是本地的原生的簽名配置文件。
4.開始錄制腳本
點(diǎn)擊“Next”之后就會(huì)出現(xiàn)下面的對(duì)話框吩翻,先看一下Setting目錄:
4.1 Runtime options 運(yùn)行時(shí)配置
- Use sleeps - 是否會(huì)使用sleeps方法兜看,來(lái)保證回放測(cè)試用例的速度和錄制的時(shí)候相同,該配置對(duì)那些帶寬密集型或者混合App特別有用狭瞎。簡(jiǎn)單講细移,就是在生成的測(cè)試用例中調(diào)用sleep()方法來(lái)模擬用戶錄制時(shí)的操作間隔,如果不設(shè)置的話熊锭,該recorder只會(huì)捕捉到用戶和Activity的動(dòng)作弧轧,但是回放的時(shí)候會(huì)順序瞬間執(zhí)行。
- Keep app data - 如果開啟一個(gè)新的腳本錄制的時(shí)候碗殷,是否保留App的數(shù)據(jù)精绎。
- Click and drag coordinates - 選擇在點(diǎn)擊和拖拽的時(shí)候是否錄制坐標(biāo)。
4.2 Saved path - SDK和JDK路徑
4.3 License key - 證書(購(gòu)買后才會(huì)下發(fā)郵件)
此時(shí)點(diǎn)擊”New Robotium Test”就會(huì)自動(dòng)進(jìn)行開始腳本錄制锌妻,流程如下:
1.打APK包
adb shell am force-stop xxx
2.將APK包push到設(shè)備上
adb push xxx.apk /data/local/tmp/xxx
3.從設(shè)備上安裝APK包
adb shell pm install -r "/data/local/tmp/xxx"
4.運(yùn)行測(cè)試用例:
adb shell am instrument -w -r -e debug false -e class xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
這些過程在控制臺(tái)都可以看得到代乃,會(huì)輸出原始的命令,有利于我們了解robotium的整個(gè)流程仿粹。
當(dāng)程序成功的安裝到設(shè)備上并啟動(dòng)之后搁吓,在插件的對(duì)話框界面就可以看到有Activity啟動(dòng)了,然后就可以進(jìn)行一些測(cè)試的操作吭历,你會(huì)發(fā)現(xiàn)在該對(duì)話框中就會(huì)記錄出操作的整個(gè)過程堕仔,比如打開了那個(gè)界面、點(diǎn)擊了某個(gè)按鈕晌区、輸入了什么內(nèi)容等摩骨,這些都會(huì)轉(zhuǎn)換成java測(cè)試代碼,下次運(yùn)行測(cè)試用例的時(shí)候朗若,就會(huì)按照這個(gè)順序進(jìn)行測(cè)試恼五。
5.保存腳本
測(cè)試結(jié)束后,點(diǎn)擊Save哭懈,起個(gè)名字唤冈,就會(huì)自動(dòng)生成測(cè)試腳本類,保存在src/androidTest目錄中银伟。
首先簡(jiǎn)要的分析一下該類:
繼承了ActivityInstrumentationTestCase2類你虹,該類在android.test包下,泛型指的是需要進(jìn)行測(cè)試的類彤避,圖中為登陸的測(cè)試用例傅物,所以第一次打開的是SplashActivity。其實(shí)Robotium內(nèi)部就是對(duì)Android的Instrumentation進(jìn)行了2次封裝琉预,使其變得更加方便董饰。
Robotium內(nèi)部集成了Junit3,所以對(duì)junit熟悉的很容易看懂一些基本特點(diǎn):setUp()啟動(dòng)測(cè)試用例圆米、tearDown()測(cè)試結(jié)束卒暂、testRun()就是本測(cè)試用例中的一個(gè)測(cè)試過程,