Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

Keyword:Android,Robotium,自動化測試,黑盒測試,已知id如何模擬按鍵html

純屬愛好,最近學習了Android及其自動化測試,總算對Android有了個大概的瞭解。java

畢業後就是用的C,從未用過java,而且最近4年幾乎沒怎麼摸過代碼,如今學習android仍是有點費勁;不過還好,自我以爲理解的很快,別人碰到的問題我都碰到了,不少網上都有答案。其中一個問題折騰了我好幾天,網上也沒有完整的答案,憑着本身摸索,試,總算搞定了,後面一一介紹。android

關於android的環境搭建,及robotium的測試方法網上的介紹不少,在此再也不一一贅述。這裏只對一些關鍵點作一些總結,介紹常見問題的解決辦法等等。windows

1. 須要設置的環境變量

ANDROID_HOME=D:\Android\android-sdksoracle

ANDROID_SDK_HOME=D:\Android\avdapp

JAVA_HOME= C:\Program Files\Java\jdk1.7.0_05eclipse

CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;函數

PATH=...;(追加)%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%JAVA_HOME%\bin;%CLASSPATH%工具

注意,環境設置後重啓電腦才生效。性能

若是知道環境變量是否生效?例如查看ANDROID_HOME環境變量的設置,開始->運行->cmd,在cmd下面輸入echo % ANDROID_HOME%,若是與咱們預期的一致就說明生效了。若是原樣輸出% ANDROID_HOME%就說明環境變量未生效,須要重啓操做系統。

詳細說明以下

1.1         ANDROID_HOME

ANDROID_HOME= D:\Android\android-sdks,指定sdk包含的位置,什麼是sdk?網上去搜,簡單點說就是裏面要包含AVD ManagerSDK Manager:

Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

同時,eclipse也要設置SDK的位置,最好和ANDROID_HOME設置同樣,以下

Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

1.2         ANDROID_SDK_HOME

ANDROID_SDK_HOME設置的是avd的路徑,通常默認在用戶路徑下,例如C:\Users\tanggod\.android SD卡的空間都是從這裏分配的。能夠挪到其餘目錄下,須要在環境變量裏面設置以下:

ANDROID_SDK_HOME=D:\Android\avd

如此設置後(重啓電腦讓環境變量生效 ),之後建立的AVD就會在咱們指定的目錄下了:

Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

1.3         JAVA_HOME

JDK,JAVA_HOME必須設置jdk安裝的目錄,例如:

 JAVA_HOME= C:\Program Files\Java\jdk1.7.0_05

C:\Program Files\Java\jdk1.7.0_05

查看JDK版本號?在cmd下面輸入:Java -version

 Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

PS:1.7jdk彷佛還很不穩定,有問題,建議用1.6的。

jdk下載位置:

http://www.oracle.com/technetwork/java/javase/downloads/index.html

 1.4         CLASSPATH

classpath環境變量,是當咱們在開發java程序時須要引用別人寫好的類時,要讓java解釋器知道到哪裏去找這個類。一般,sun爲咱們提供了一些額外的豐富的類包,一個是dt.jar,一個是tools.jar,這兩個jar包都位於C:\jdk1.6.0\lib目錄下,因此一般咱們都會把這兩個jar包加到咱們的classpath環境變量中set classpath=.;C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar。在系統環境變量那一欄中點->新建classpath 
         
變量名:classpath 
         
變量值:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;(注意,CLASSPATH最前面是有個「.」的,表示當前目錄,這樣當咱們運行java AClass的時候,系統就會先在當前目錄尋找AClass文件了。);

1.5         PATH

環境變量PATH設置的時候,注意是追加,不能將已有的內容清空了。

PATH = %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%JAVA_HOME%\bin;%CLASSPATH%

主要設置的是adb.exeemulator的位置(在tools或者platform-tools目錄中),已經jdk工具的路徑等等。

2.   如何簽名Sign

Android系統要求每個Android應用程序必需要通過數字簽名纔可以安裝到系統中,也就是說若是一個Android應用程序沒有通過數字簽名,是沒有辦法安裝到系統中的!

爲了方便咱們開發調試程序,ADT會自動的使用debug密鑰爲應用程序簽名。debug密鑰?它在哪?debug密鑰是一個名爲debug.keystore的文件,它的位置: Ubuntu: ~/.android/debug.keystore win7c:/user/.Android/debug.keystore;  xp: C:/Documents and Settings/user/.Android/debug.keystore),user對應於你本身的windows操做系統用戶名,這也就意味着,若是咱們想擁有本身的簽名,而不是讓ADT幫咱們簽名的話,咱們也要有一個屬於本身的密鑰文件(*.keystore

Robotium作黑盒測試的時候,須要對待測試的apk去除簽名,而後本身再簽名。google網站上有個簽名工具叫作re-sign.jar,比較傻瓜化,直接將apk拖入到re-sign.jar中後自動去除簽名,從新再簽名;不少人都建議用這個工具。我剛開始也用這個,但是發現用這個工具處理後,不管是android模擬器仍是真機,都裝不上,提示沒有簽名。

我將apk解開看,確實是有簽名的。

查看簽名:

jarsigner -verify -verbose -certs D:\Android\apk\02-AndroidCalculator-sign.apk

 

因此後來,我就手工用命令行來簽名。手工簽名以前,首先須要去除原來簽名的信息,去除方法很簡單。就是將apk文件後綴改成.zip,而後從winrar中刪除META-INF文件夾,刪除後從新將文件名改爲apk的後綴,這樣就去除簽名了。而後用下面的命令進行簽名。

注意下面黃色高亮和灰色高亮的字,須要根據本身的debug.keystore的位置,和待簽名apk的位置進行設置。 

簽名AndroidCalculator

> jarsigner -keystore D:\Android\avd\.android\debug.keystore -storepass android -keypass android D:\Android\apk\02-AndroidCalculator-unsign.apk androiddebugkey

> zipalign 4 D:\Android\apk\02-AndroidCalculator-unsign.apk D:\Android\apk\02-AndroidCalculator-sign.apk

 zipalign可以使apk文件中未壓縮的數據在4個字節邊界上對齊(4個字節是一個性能很好的值)

例如簽名Plingm

>jarsigner -keystore D:\Android\avd\.android\debug.keystore -storepass android -keypass android D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkandroiddebugkey

> zipalign 4 D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkD:\Android\apk\plingm\com.freephoo.android_1180-sign.apk

 對於jdk 1.7版本,簽名稍有區別,須要加上參數:-digestalg SHA1 -sigalg MD5withRSA,例如

 

>jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore D:\Android\avd\.android\debug.keystore -storepass android -keypass android D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkandroiddebugkey

> zipalign 4 D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkD:\Android\apk\plingm\com.freephoo.android_1180-sign.apk

簽名後如何安裝到模擬器中?命令以下

>emulator -avd android4.1

>adb install D:\Android\apk\plingm\com.freephoo.android_1180-sign.apk

 若是是安裝到真機中,就不須要上面第一條命令啓動模擬器了,直接usb鏈接上手機,執行adb install便可。

 

在進行黑盒測試以前,須要知道待測試apk的包及activity信息。查看某個apkpackage name,能夠用aapt看:

platform-tools目錄下使用以下命令aapt dump badging XXX.apk

aapt dump badgingD:\Android\apk\plingm\com.freephoo.android_1180-sign.apk

 也能夠用re-sign.jar看,結果以下:package: name='com.freephoo.android'

 Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

3.   真機調試

  •   設置android手機爲USB調試模式。步驟: menu---> 設置 ---> 應用程序 ---> 開發 , 選擇【USB調試】 

  • USB鏈接手機和電腦,並確保成功。步驟: windows下執行c:/adb devices 查看手機是否已經鏈接成功。

鏈接不成功:

Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】
鏈接成功
Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

  • 設置應用程序爲調試模式(這個彷佛不要也能夠)。操做: 編輯AndroidManifest.xml 增長調試參數android:debuggable="true", 以下:

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">

  • 查看具體異常信息:

執行:./adb logcat 能夠查看到更多的系統異常消息。在這些消息中要注意查看Caused by: 頭的行,這些行指明瞭在哪行代碼出的錯誤

4.   已知控件id,如何模擬按鍵

咱們知道,android每一個控件都有一個相似R.id.xxxx字符串id。在作白盒測試的時候,將被測試的代碼包import一下,直接調用R.id.xxxx就能夠了。

可是在黑盒測試的時候,咱們只有apk,沒有源代碼,怎麼獲取控件的id呢?

java已經給咱們提供了這個工具。只須要在cmd下面輸入hierarchyviewer便可調出控件查看工具(若是cmd不認識你的hierarchyviewer,說明你的環境變量沒有配置正確)

 Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

選中須要查看的應用,點擊:"Load View Hierarchy"

以下id/後面的"Button01"即爲buttonid
Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

 好了,已知控件的id,在Robotium中如何模擬按鍵呢?這裏經常使用的有2種方法:

1. 根據button上面的文字。這個很簡單,直接solo.clickOnButton("Multiply");便可。

2. 根據控件的座標。hierarchyviewer是能夠查看每一個點的座標的。可是使用起來不是很直觀,尤爲是對不一樣分辨率屏幕的手機時,使用起來可能還存在兼容性問題。

 

若是控件上沒有文字,clickOnButton就用不了,例如不少應用用圖片做爲button的說明,clickOnButton就不奏效。用座標又很麻煩不直觀。能否用控件的id呢?

怎麼用id,我也糾纏這個問題好幾天,網上中文資料搜不到,搜英文,英文搜不到換關鍵字搜,始終找不到一個比較完整的使用說明。我只好本身一個個命令的試,搞了2天總算找到一個方法,這個方法對於java高手可能不值一提,但對我從未用過java的人來講,確實費了很多周折。

個人方法以下,先獲取到控件的view

solo.getCurrentActivity().getResources().getIdentifier

而後再用solo.clickOnView便可。

 

我在使用的時候,簡單的封裝了下,封裝函數以下:

 Android及Robotium學習總結【環境變量,真機調試及根據id模擬按鍵】

private int clickCtrlById(String s, int t ){

     intctrl;

     View v;


     if( s == ""){

          return -1;

     }

     ctrl = solo.getCurrentActivity().getResources().getIdentifier(s,"id",TARGET_PACKAGE_ID);

    

     v = solo.getView(ctrl);

     solo.clickOnView(v);

     solo.sleep(t);        

     return 0;

}

    

例如已知某個控件的id(字符串格式)爲"btn_dialpad_5",調用方法以下:

clickCtrlById("btn_dialpad_5",400);

相關文章
相關標籤/搜索