移動(dòng)端自動(dòng)化測(cè)試----Robotium和Robotium Recorder

簡(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)示:

image.png

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)

重簽名工具:re-sign.jar

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)分隔)

image.png

3,寫測(cè)試代碼并打包

本工程項(xiàng)目主要是寫測(cè)試代碼(針對(duì)APK)棕所,所以在androidTest/java/包下寫代碼闸盔,Android代碼不用理會(huì)。寫完測(cè)試代碼后琳省,執(zhí)行命令打包測(cè)試apk迎吵。

image.png

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();
    }
 
 
 
}
image.png

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=包名)

image.png

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菜單中:

image.png

3.啟動(dòng)插件

安裝完插件以后雷恃,使用ADB連接上手機(jī)或者模擬器疆股,并且設(shè)備必須有外部存儲(chǔ)。

點(diǎn)擊Tools菜單中的Robotium Recorder倒槐,出現(xiàn)該插件的對(duì)話框旬痹,

image.png

此時(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目錄:


image.png

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ā)郵件)

image.png

此時(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è)試過程,

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娄帖,一起剝皮案震驚了整個(gè)濱河市也祠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌近速,老刑警劉巖诈嘿,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異削葱,居然都是意外死亡奖亚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門析砸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)昔字,“玉大人,你說我怎么就攤上這事首繁∽鞴” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蛮瞄,是天一觀的道長(zhǎng)所坯。 經(jīng)常有香客問我,道長(zhǎng)挂捅,這世上最難降的妖魔是什么芹助? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮闲先,結(jié)果婚禮上状土,老公的妹妹穿的比我還像新娘。我一直安慰自己伺糠,他們只是感情好蒙谓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著训桶,像睡著了一般累驮。 火紅的嫁衣襯著肌膚如雪酣倾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天谤专,我揣著相機(jī)與錄音躁锡,去河邊找鬼。 笑死置侍,一個(gè)胖子當(dāng)著我的面吹牛映之,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜡坊,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杠输,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了秕衙?” 一聲冷哼從身側(cè)響起蠢甲,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灾梦,沒想到半個(gè)月后峡钓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡若河,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年能岩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萧福。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拉鹃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲫忍,到底是詐尸還是另有隱情膏燕,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布悟民,位于F島的核電站坝辫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏射亏。R本人自食惡果不足惜近忙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望智润。 院中可真熱鬧及舍,春花似錦、人聲如沸窟绷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兼蜈。三九已至攘残,卻和暖如春拙友,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肯腕。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工献宫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人实撒。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涉瘾,于是被迫代替她去往敵國(guó)和親知态。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容