當前位置:首頁 » 安卓系統 » android自動化

android自動化

發布時間: 2022-01-09 23:57:50

① 如何利用jenkins來做android自動化

jenkins來做android自動化首先要環境配置並啟動Jenkins。
具體步驟如下:
1、 安裝jdk建議1.6或以上版本,配置好環境變數。
2、 安裝tomcat 安裝完調試下tomcat是否正常。
3、 安裝ant 載zip包,解壓後配置好環境變數。
4、 安裝jenkins war包,命名為Jenkins,拷貝到tomcat/webapps目錄下。
5、 安裝Android SDK 安裝,完成後配置好Android_SDK_HOME環境變數。此步驟主要用於進行android自動化測試,若不進行此項可略過。

安裝完成後啟動tomcat/bin/startup.bat文件(linux下是startup.sh),在瀏覽器輸入localhost:8080/jenkins,8080為tomcat埠,即可訪問jenkins伺服器。

接下來配置Jenkins:
1、 JDK配置 新增JDK,指定JDK名字和java_HOME
2、 ANT配置 新增ANT,指定ANT名字和ANT_HOME
3、 Maven配置 從略,本文未使用到Maven,具體配置方法參考Google。
4、 Subversion 選擇1.6版本SVN,勾選Update default Subversion credentials cache after successful authentication
5、 通知 填寫SMTP server、Default user E-mail suffix、System Admin E-mail Address、Jenkins URL、勾選Use SMTP Authentication,填寫User Name、Password、Use SSL、SMTP port、Chareset(UTF-8) 、Default Content Type(默認)、Default Recipients(默認收件人),配置完成後可進行測試。
6、 Jenkins URL 配置該URL,用於別人訪問。
最後是插件管理

1、 Hudson Subversion Plug-in,jenkins的svn插件。
2、 Android Emulator Plugin,android模擬器插件。
3、 JUnit Attachments Plugin,junit測試報告附件插件。
4、 Email-ext plugin,擴展插件。此處說明下,默認Jenkins只會發送構建失敗的,需安裝此插件才能自定義不同場景。
5、 Deploy to container Plugin遠程發布插件。

② 怎樣使用Appium進行Android自動化測試

1、Robotium——安卓測試工具 Robotium是安卓系統最常用的自動化測試工具,並且是一款免費的安卓UI測試工具。它適合於各種不同的安卓版本及其下行版本。軟體開發者經常把它稱作安卓。Robotium創建的測試使用Java寫的。事實上,Robotium是一個個體測試資料庫。 但是Robotium需要花費很長時間努力去創建測試,就像為了自動化程序創建的源代碼。它不適合互動的軟體系統,不能鎖住和解鎖智能手機。Robotium沒有記錄和播放功能,它不支持截屏。 2、MonkeyRunner——安卓App測試工具 MonkeyRunner是最流行的有自動化功能的安卓軟體測試工具。MonkeyRunner比起Robotium要低端一些。它並不處理源代碼。測試創建是用Python寫的,其中可能使用記錄工具,為了創建測試。MonkeyRunner可以在連接狀態的PC或者模擬器上運行測試。它有一個應用程序介面可以控制智能手機或者模擬器。但手機APP測試工具的最大缺陷是每個設備都要編寫腳本。另一個缺陷就是,每次測試程序發生改變時都要調整。 3、Ranorex——安卓App測試工具 Ranorex是一個不錯的自動化測試工具,不僅最新版本,Android 2.2.以上版本都是可以的。Ranorex的好處在於它有詳細的截屏報告。他可以通過WiFi上網連接智能手機或者平板電腦。通過這個 Android 工具,自動化的測試工程師可以詳細描述數據驅動測試,但不包括 XML 數據格式。Ranorex可以很輕松地創建測試,自動化測試工程師只需點擊滑鼠。Ranorex允許附加的程序模塊。這個模塊可以被用於開發更為復雜的測試場景中。Ranorex是一個商業化的移動應用程序的工具;其許可價格是 1990歐元/年。Ranorex搜索相當慢;它需要 30 秒的時間來執行操作。其中一個必須為Ranorex文書的 APK 文件。否則它不能通過這個工具進行自動化測試,它只能在APK 文件下工作。 4、Appium——安卓自動化測試工具 Appium是為iOS和安卓系統創建的自動化測試框架,是一個免費工具。它支持 2.3 及更高版本的 Android 系統。Appium利用WebDriver界面運行測試。它支持許多編程語言,如 Java、 C#、Ruby和其他的WebDriver資料庫。它可以在移動設備上控制 Safari 和Chrome。但是,一些自動化的測試工程師抱怨它提供的報告不足。它的缺點也減少了對於XPath在移動設備上的支持。 5、UI Automator——安卓自動化測試 谷歌最近推出了這一工具。它支持從4.1開始的安卓版本。我們應該選擇另一個更早期的安卓應用程序進行自動化測試。UI Automator能夠與各類安卓系統兼容,包括系統的應用程序。這使得UI Automator可以鎖定和解鎖智能手機或平板電腦。通過該工具創建的腳本可以在許多不同的安卓平台上執行。它允許復制用戶的操作復雜的序列。UI Automator也可以利用外部按鈕的裝置調節,打開和關閉設備的按鈕。 UI Automator可以與測試框架TestNG集成。在這種情況下,用戶界面自動可以生成內容豐富和詳細的報告,類似於由Ranorex生成的報告。此工具搜索速度還非常快。在許多安卓平台上測試後,軟體測試專家認為UI Automator是質量最好的移動應用程序。它是安卓做好的應用程序之一,它由谷歌推出。 通常大約 80%的新軟體的 bug 都會重現支持的平台。其餘 20%出現在其他平台上。這意味著,在大多數情況下,事先測試軟體產品比盲目使用更好。 目前, Android 4.1 版本安裝了約 66%操作系統的設備。這就是為什麼許多自動化的測試工程師經常決定UI Automator是最合適的解決方案。

③ Android自動化測試工具有哪些

1、 Robotium 安卓測試工具

Robotium是一款經常使用的自動化測試工具軟體,支持Android。
Robotium是一個免費的Android UI測試工具。它適用於為不同的安卓版本和子版本測試自動化。軟體開發人員經常把它描述為Android Selenium。Robotium測試是用java寫的。事實上,Robotium是一個單元測試庫。
但通過Robotium創建測試需要花費很多時間和努力,因為為了自動化測試還需要修改程序源代碼。該工具也不適合與系統軟體的交互,它不能鎖定和解鎖智能手機或平板電腦。Robotium也沒有錄制回放功能,也不提供截圖。
2、MonkeyRunner 安卓應用測試

Monkeyrunner是一款流行的Android測試工具,用於自動化功能測試。
這個工具比Robotium更低一層次。這個不必處理源代碼來做自動化測試。這個測試可以用Python寫,並且可以使用錄制工具來創建測試。
Monkeyrunner可以連接到電腦或模擬真實設備運行測試。該工具有一個介面,用它來控制智能手機,平板電腦或外部模擬器的Android代碼。
這個測試工具的缺點是,它必須為每個設備編寫腳本。另一個問題是,每次測試程序的用戶界面變化都需要調整測試腳本。
3、Ronaorex 安卓測試應用工具
Ranrex 是一款不僅可以支持最新Android版本,也支持從Android2.2開始的早期版本和分支版本。
Ranorex的優勢是它有詳細的截屏報告。它能通過Wifi連接智能手機和平板電腦。
一個自動化測試工程師通過這個Android工具可以不用XML數據格式來詳細編寫數據驅動的測試。Ranorex工作室使自動化測試工程師只要點擊滑鼠就可容易地創建測試。它允許詳細聲明額外的程序模塊,來用於在後期開發周期中測試更復雜的場景。
它是一個商業的移動應用工具,其許可價格為1990歐元。不過Ranorex搜索功能相當慢;它需要30秒來完成這樣的操作。我們必須為Ranorex配備apk文件設備,否則無法通過這個工具實現自動化測試,因為它只能在APK文件設備上工作。

④ java appium android 怎麼判斷自動化

下載Maven工程配置文件pom.xml、測試應用 ContactManager.apk、測試代碼AndroidContactsTest.java,下載地址見文後參考資料。
2
創建一個java工程
將pom.xml文件放到工程根目錄下。
根目錄下新建apps目錄,ContactManager.apk文件放到apps目錄下。
src目錄下新建test/java目錄,AndroidContactsTest.java文件放到src/test/java目錄下。

3
修改AndroidContactsTest.java文件,修改內容如下截圖。
修改內容為apk所在路徑、模擬器的名稱和版本信息。

4
啟動模擬器和Appium
命令行運行appium,或者點擊界面上最右邊的Launch按鈕。

5
進入java工程的根目錄,運行Maven命令。
要測試所有的case,運行下面命令:
mvn test
或者測試某一個case,運行下面命令:
mvn test -Dtest=test.java.AndroidContactsTest
運行結束會在控制台輸出測試結果。

END
開發包參考地址

開發包參考下載地址

⑤ android app自動化測試工具有哪些

基於優秀的圖像對比庫opencv的測試工具,測試腳本使用Python編寫,非常強大。如果你的app沒有源碼,可以選擇它;或者你想做系統測試(跨app的測試),也可以選擇它。其它的還是用下面說的那些個吧。
基於優秀的圖像對比庫opencv的測試工具,測試腳本使用Python編寫,非常強大。如果你的app沒有源碼,可以選擇它;或者你想做系統測試(跨app的測試),也可以選擇它。其它的還是用下面說的那些個吧。
我通過其核心包sikuli-script.jar實現了android的sikuli化,暫時不打算開源。其實原理挺簡單的,認真看過sikuli源碼的應該都能寫出來。
看lz的意思應該只是想問應用層的,我來說點應用層的
先說說開源的吧:
Robotium
Monkeyrunner
Robolectric
CTS
還有個新興的測試工具,以前在GitHub看到,現在找不到了,好像是BDD類型的語法;現在還不成熟。
另外基於web的測試也有基於Selenium Webdriver 的 Android WebDriver:
有兩種:
基於Remote Server的:官方提供了java介面的,但是Python版的官方裡面卻沒有。我非常喜歡Python,所以自己實現了並且開源到了GitHub:https://github.com/truebit... 有問題大家可以提到上面
基於Instrumentation的:已經在Android SDK r14裡面可以安裝了
不開源的就多了,不過我見過的一般是以下幾種思路:
1. 基於Android Java Instrumentation框架:
基於Robotium,比如bitbar的產品:http://bitbar.com/procts
基於Instrumentation,那就海了去了,很多公司自家寫的工具都基於這個;另外Robotium就是基於這個的
2. 基於Android lib層的各種命令,比如sendevent,getevent, monkey, service這些,然後用各種語言封裝

⑥ 如何實現一個android的log自動化分析工具

首先,讓我們看一看AndroidLog的格式。下面這段log是以所謂的long格式列印出來的。從前面Logcat的介紹中可以知道,long格式會把時間,標簽等作為單獨的一行顯示。

[ 12-09 21:39:35.510 396: 416 I/ActivityManager ]

Start procnet.coollet.infzmreader:umengService_v1 for service
net.coollet.infzmreader/com.umeng.message.

UmengService:pid=21745 uid=10039 gids={50039, 3003, 1015,1028}

[ 12-09 21:39:35.518 21745:21745I/dalvikvm ]

Turning on JNI app bug workarounds fortarget SDK version 8...

[ 12-09 21:39:35.611 21745:21745D/AgooService ]

onCreate()

我們以第一行為例:12-09 是日期,21:39:35.510是時間396是進程號,416是線程號;I代表log優先順序,ActivityManager是log標簽。

在應用開發中,這些信息的作用可能不是很大。但是在系統開發中,這些都是很重要的輔助信息。開發工程師分析的log很多都是由測試工程師抓取的,所以可能有些log根本就不是當時出錯的log。如果出現這種情況,無論你怎麼分析都不太可能得出正確的結論。如何能最大限度的避免這種情況呢?筆者就要求測試工程師報bug時必須填上bug發生的時間。這樣結合log里的時間戳信息就能大致判斷是否是發生錯誤時的log。而且根據測試工程師提供的bug發生時間點,開發工程師可以在長長的log信息中快速的定位錯誤的位置,縮小分析的范圍。

同時我們也要注意,時間信息在log分析中可能被錯誤的使用。例如:在分析多線程相關的問題時,我們有時需要根據兩段不同線程中log語句執行的先後順序來判斷錯誤發生的原因,但是我們不能以兩段log在log文件中出現的先後做為判斷的條件,這是因為在小段時間內兩個線程輸出log的先後是隨機的,log列印的先後順序並不完全等同於執行的順序。那麼我們是否能以log的時間戳來判斷呢?同樣是不可以,因為這個時間戳實際上是系統列印輸出log時的時間,並不是調用log函數時的時間。遇到這種情況唯一的辦法是在輸出log前,調用系統時間函數獲取當時時間,然後再通過log信息列印輸出。這樣雖然麻煩一點,但是只有這樣取得的時間才是可靠的,才能做為我們判斷的依據。

另外一種誤用log中時間戳的情況是用它來分析程序的性能。一個有多年工作經驗的工程師拿著他的性能分析結果給筆者看,但是筆者對這份和實際情況相差很遠的報告表示懷疑,於是詢問這位工程師是如何得出結論的。他的回答讓筆者很驚訝,他計算所採用的數據就是log信息前面的時間戳。前面我們已經講過,log前面時間戳和調用log函數的時間並不相同,這是由於系統緩沖log信息引起的,而且這兩個時間的時間差並不固定。所以用log信息前附帶的時間戳來計算兩段log間代碼的性能會有比較大的誤差。正確的方法還是上面提到的:在程序中獲取系統時間然後列印輸出,利用我們列印的時間來計算所花費的時間。

了解了時間,我們再談談進程Id和線程Id,它們也是分析log時很重要的依據。我們看到的log文件,不同進程的log信息實際上是混雜在一起輸出的,這給我們分析log帶來了很大的麻煩。有時即使是一個函數內的兩條相鄰的log,也會出現不同進程的log交替輸出的情況,也就是A進程的第一條log後面跟著的是B進程的第二條log,對於這樣的組合如果不細心分析,就很容易得出錯誤的結論。這時一定要仔細看log前面的進程Id,把相同Id的log放到一起看。

不同進程的log有這樣的問題,不同的線程輸出的log當然也存在著相同的問題。Logcat加上-vthread就能列印出線程Id。但是有一點也要引起注意,就是Android的線程Id和我們平時所講的Linux線程Id並不完全等同。首先,在Android系統中,C++層使用的Linux獲取線程Id的函數gettid()是不能得到線程Id的,調用gettid()實際上返回的是進程Id。作為替代,我們可以調用pthread_self()得到一個唯一的值來標示當前的native線程。Android也提供了一個函數androidGetThreaId()來獲取線程Id,這個函數實際上就是在調用pthread_self函數。但是在Java層線程Id又是另外一個值,Java層的線程Id是通過調用Thread的getId方法得到的,這個方法的返回值實際上來自Android在每個進程的java層中維護的一個全局變數,所以這個值和C++層所獲得的值並不相同。這也是我們分析log時要注意的問題,如果是Java層線程Id,一般值會比較小,幾百左右;如果是C++層的線程,值會比較大。在前裡面的log樣本中,就能很容易的看出,第一條log是Jave層輸出的log,第二條是native層輸出的。明白了這些,我們在分析log時就不要看見兩段log前面的線程Id不相同就得出是兩個不同線程log的簡單結論,還要注意Jave層和native層的區別,這樣才能防止被誤導。

AndroidLog的優先順序在列印輸出時會被轉換成V,I,D,W,E等簡單的字元標記。在做系統log分析時,我們很難把一個log文件從頭看到尾,都是利用搜索工具來查找出錯的標記。比如搜索「E/」來看看有沒有指示錯誤的log。所以如果參與系統開發的每個工程師都能遵守Android定義的優先順序含義來輸出log,這會讓我們繁重的log分析工作變得相對輕鬆些。

Android比較常見的嚴重問題有兩大類,一是程序發生崩潰;二是產生了ANR。程序崩潰和ANR既可能發生在java層,也可能發生在native層。如果問題發生在java層,出錯的原因一般比較容易定位。如果是native層的問題,在很多情況下,解決問題就不是那麼的容易了。我們先看一個java層的崩潰例子:

I/ActivityManager( 396): Start proccom.test.crash for activity com.test.crash/.MainActivity:
pid=1760 uid=10065 gids={50065, 1028}

D/AndroidRuntime( 1760): Shutting downVM

W/dalvikvm( 1760): threadid=1: threadexiting with uncaught exception(group=0x40c38930)

E/AndroidRuntime( 1760): FATALEXCEPTION: main

E/AndroidRuntime( 1760):java.lang.RuntimeException: Unable to start activityComponentInfo
{com.test.crash/com.test.crash.MainActivity}:java.lang.NullPointerException

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.access$600(ActivityThread.java:141)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)

E/AndroidRuntime( 1760): atandroid.os.Handler.dispatchMessage(Handler.java:99)

E/AndroidRuntime( 1760): atandroid.os.Looper.loop(Looper.java:137)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.main(ActivityThread.java:5050)

E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invokeNative(NativeMethod)

E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invoke(Method.java:511)

E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:793)

E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)

E/AndroidRuntime( 1760): atdalvik.system.NativeStart.main(NativeMethod)

E/AndroidRuntime( 1760): Caused by:java.lang.NullPointerException

E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.setViewText(MainActivity.java:29)

E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.onCreate(MainActivity.java:17)

E/AndroidRuntime( 1760): atandroid.app.Activity.performCreate(Activity.java:5104)

E/AndroidRuntime( 1760): atandroid.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)

E/AndroidRuntime( 1760): ... 11more

I/Process ( 1760): Sending signal.PID: 1760 SIG: 9

W/ActivityManager( 396): Force finishing activitycom.test.crash/.MainActivity

Jave層的代碼發生crash問題時,系統往往會列印出很詳細的出錯信息。比如上面這個例子,不但給出了出錯的原因,還有出錯的文件和行數。根據這些信息,我們會很容易的定位問題所在。native層的crash雖然也有棧log信息輸出,但是就不那麼容易看懂了。下面我們再看一個native層crash的例子:

F/libc ( 2102): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread2102 (testapp)

D/dalvikvm(26630):GC_FOR_ALLOC freed 604K, 11% free 11980K/13368K, paused 36ms, total36ms

I/dalvikvm-heap(26630):Grow heap (frag case) to 11.831MB for 102416-byteallocation

D/dalvikvm(26630):GC_FOR_ALLOC freed 1K, 11% free 12078K/13472K, paused 34ms, total34ms

I/DEBUG ( 127):*** *** *** *** *** *** *** *** *** *** *** *** *** *** ******

I/DEBUG ( 127):Build fingerprint:
'Android/full_maguro/maguro:4.2.2/JDQ39/eng.liuchao.20130619.201255:userdebug/test-keys'

I/DEBUG ( 127):Revision: '9'

I/DEBUG ( 127):pid: 2102, tid: 2102, name: testapp >>>./testapp <<<
I/DEBUG ( 127):signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr00000000

I/DEBUG ( 127): r0 00000020 r173696874 r2 400ff520 r300000000

I/DEBUG ( 127): r4 400ff469 r5beb4ab24 r6 00000001 r7beb4ab2c

I/DEBUG ( 127): r8 00000000 r900000000 sl 00000000 fpbeb4ab1c

I/DEBUG ( 127): ip 4009b5dc spbeb4aae8 lr 400ff46f pc400ff45e cpsr 60000030

I/DEBUG ( 127): d0 000000004108dae8 d1 4108ced84108cec8

I/DEBUG ( 127): d2 4108cef84108cee8 d3 4108cf184108cf08

I/DEBUG ( 127): d4 4108c5a84108c598 d5 4108ca084108c5b8

I/DEBUG ( 127): d6 4108ce684108ce58 d7 4108ce884108ce78

I/DEBUG ( 127): d8 0000000000000000 d9 0000000000000000

I/DEBUG ( 127): d10 0000000000000000 d110000000000000000

I/DEBUG ( 127): d120000000000000000 d130000000000000000

I/DEBUG ( 127): d14 0000000000000000 d150000000000000000

I/DEBUG ( 127): d16 c1dcf7c087fec8b4 d173f50624dd2f1a9fc

I/DEBUG ( 127): d18 41c7b1ac89800000 d190000000000000000

I/DEBUG ( 127): d20 0000000000000000 d210000000000000000

I/DEBUG ( 127): d22 0000000000000000 d230000000000000000

I/DEBUG ( 127): d24 0000000000000000 d250000000000000000

I/DEBUG ( 127): d26 0000000000000000 d270000000000000000

I/DEBUG ( 127): d28 0000000000000000 d290000000000000000

I/DEBUG ( 127): d30 0000000000000000 d310000000000000000

I/DEBUG ( 127): scr 00000010

I/DEBUG ( 127):

I/DEBUG ( 127):backtrace:

I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp

I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp

I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)

I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp

I/DEBUG ( 127):

I/DEBUG ( 127):stack:

I/DEBUG ( 127): beb4aaa8 000000c8
I/DEBUG ( 127): beb4aaac 00000000
I/DEBUG ( 127): beb4aab0 00000000
I/DEBUG ( 127): beb4aab4 401cbee0 /system/bin/linker

I/DEBUG ( 127): beb4aab8 00001000
I/DEBUG ( 127): beb4aabc 4020191d /system/lib/libc.so (__libc_fini)

I/DEBUG ( 127): beb4aac0 4020191d /system/lib/libc.so (__libc_fini)

I/DEBUG ( 127): beb4aac4 40100eac /system/bin/testapp

I/DEBUG ( 127): beb4aac8 00000000
I/DEBUG ( 127): beb4aacc 400ff469 /system/bin/testapp

I/DEBUG ( 127): beb4aad0 beb4ab24 [stack]

I/DEBUG ( 127): beb4aad4 00000001
I/DEBUG ( 127): beb4aad8 beb4ab2c [stack]

I/DEBUG ( 127): beb4aadc 00000000
I/DEBUG ( 127): beb4aae0 df0027ad
I/DEBUG ( 127): beb4aae4 00000000
I/DEBUG ( 127): #00 beb4aae8 00000000
I/DEBUG ( 127): ........ ........

I/DEBUG ( 127): #01 beb4aae8 00000000
I/DEBUG ( 127): beb4aaec 401e9721 /system/lib/libc.so (__libc_init+40)

I/DEBUG ( 127): #02 beb4aaf0 beb4ab08 [stack]

I/DEBUG ( 127): beb4aaf4 00000000
I/DEBUG ( 127): beb4aaf8 00000000
I/DEBUG ( 127): beb4aafc 00000000
I/DEBUG ( 127): beb4ab00 00000000
I/DEBUG ( 127): beb4ab04 400ff404 /system/bin/testapp

I/DEBUG ( 127):

這個log就不那麼容易懂了,但是還是能從中看出很多信息,讓我們一起來學習如何分析這種log。首先看下面這行:

pid: 2102, tid: 2102,name: testapp >>>./testapp <<<
從這一行我們可以知道crash進程的pid和tid,前文我們已經提到過,Android調用gettid函數得到的實際是進程Id號,所以這里的pid和tid相同。知道進程號後我們可以往前翻翻log,看看該進程最後一次列印的log是什麼,這樣能縮小一點范圍。

接下來內容是進程名和啟動參數。再接下來的一行比較重要了,它告訴了我們從系統角度看,出錯的原因:

signal 11 (SIGSEGV), code 1(SEGV_MAPERR), fault addr 00000000

signal11是Linux定義的信號之一,含義是Invalidmemory reference,無效的內存引用。加上後面的「faultaddr 00000000」我們基本可以判定這是一個空指針導致的crash。當然這是筆者為了講解而特地製造的一個Crash的例子,比較容易判斷,大部分實際的例子可能就沒有那麼容易了。

再接下來的log列印出了cpu的所有寄存器的信息和堆棧的信息,這裡面最重要的是從堆棧中得到的backtrace信息:

I/DEBUG ( 127):backtrace:

I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp

I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp

I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)

I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp

因為實際的運行系統里沒有符號信息,所以列印出的log里看不出文件名和行數。這就需要我們藉助編譯時留下的符號信息表來翻譯了。Android提供了一個工具可以來做這種翻譯工作:arm-eabi-addr2line,位於prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin目錄下。用法很簡單:

#./arm-eabi-addr2line -f -eout/target/proct/hammerhead/symbols/system/bin/testapp0x0000045e

參數-f表示列印函數名;參數-e表示帶符號表的模塊路徑;最後是要轉換的地址。這條命令在筆者的編譯環境中得到的結果是:

memcpy /home/rd/compile/android-4.4_r1.2/bionic/libc/include/string.h:108

剩餘三個地址翻譯如下:

main /home/rd/compile/android-4.4_r1.2/packages/apps/testapp/app_main.cpp:38

out_vformat /home/rd/compile/android-4.4_r1.2/bionic/libc/bionic/libc_logging.cpp:361

_start libgcc2.c:0

利用這些信息我們很快就能定位問題了。不過這樣手動一條一條的翻譯比較麻煩,筆者使用的是從網上找到的一個腳本,可以一次翻譯所有的行,有需要的讀者可以在網上找一找。

了解了如何分析普通的Log文件,下面讓我們再看看如何分析ANR的Log文件。

⑦ 如何選擇Android自動化框架的幾點拙見

首先由於我自己也是個新手,也是在學習各種框架然後給公司項目選定相應自動化框架,研究移動自動化測試框架也就近段時間而已,所以我只能從我自己今天為止的認知角度給各個框架抒發我自己的拙見,你看是否能從中接納一二吧(對於我自己的話還需要再花一段時間去學習各個框架才能確定哪個/些是適合我們項目的了,也許到時我會寫個正式的總結)。

根據你的要求,應該不會考慮MonkeyRunner和Robotium,但我還是想跟你說下其實Robotium還是挺不錯的,如果你沒有考慮跨進程調用其他APP的話。至於MonkeyRunner我就不大推薦了,你可以看下我對金陽光老師的一個評論的回復《MonkenRunner通過HierarchyViewer定位控制項的方法和建議》(文章最後我乾脆也貼出來了)。至於Robotium,你對比下本人博客裡面各個框架編寫的Note的測試示例就可以看出來Robotium相對其他框架會簡介很多,況且發展的比UIAutomator和Appium長久很多,所以也應該會更成熟,和Eclipse集成調試起來也很方便。比起後兩者如果有不足的話我覺得就以下幾點吧:

1. 所有的操作抽象到一個Solo類裡面,缺乏面向對象的編程思想,有時會讓人不適應。如果你熟悉C語言等面向過程的語言思想的話應該沒有問題。
2. 獲取控制項的方法比較缺乏,大概就幾種:通過Text,ID, ClassName,Index。沒有後兩者的多種多樣
3. 跨進程:因為底層使用Instrument框架,測試包和被測應用包打包在一起作為一個進程運行而線程間通過instrumentaiton進行通信,導致了逃不出這個進程設沙箱(sandbox)
4. 做不了模擬鍵盤的測試(但同時這個也是Robotium非常巨大的優點,因為不像後兩者那樣需要調用鍵盤導致輸入的各種各樣的問題),因為Robotium輸入讀出其實是直接對控制項的text屬性進行操作沒有通過鍵盤驅動的,你如果做過UI編程應該就明白我的意思了,因為記住你的測試代碼和目標應用是打包在同一個進程中的,同一個進程中想訪問另外一個線程的某個變數,運用相應的IPC(Interprocess Communication)機制當然是沒有問題的了。

然後到了你問的主題UIAutomator和Appium的對比,我個人是這樣看的:

1. UIAutomator是親爹(google)生的,所以可以保證後續的開發維護力量,除非google倒閉(這里我有點不懂的是為什麼google對Monkeyrunner的態度這么讓人摸不著頭腦,具體請看以上我說的對MonkeyRunner的評論)
2. Appium雖然不是親爹生的,但是乾爹實力雄厚把它武裝的無所不能(android,ios,firefox,browser通殺),單單以android來說,底層用得還是UIAutomator,所以只要它能及時跟上UIAutomator的更新,功能上面我不是很擔心。
3. 但是也這是Appium的這種架構:UIautomator/seledroid<->Appium Server<->Selenium/AppiumDriver<->Test Case (《Appium架構框架圖整理》http://blog.csdn.net/zhutian/article/details/39453505),導致框架有點復雜,當問題出現的時候調試起來比較難以定位,不知道哪個模塊出錯了。但是說道調試,總比UIAutomator好,起碼Appium可以直接集成到eclipse上面進行debug,UiAutomator卻每次都要push到目標機器然後再去執行,怎麼調試呢?到現在為止我知道的只能原始的print了。
4. 向下兼容問題:Appium可以通過底層UIAutomator/Selendroid(不記得是不是這名字了)通殺;UIAutomator只能在API Level
17(包含)以上使用
5.語言支持:appium基本通殺,UIAutomator用java足矣
6.跨平台:如你所說的只是android兩者都沒有問題,如果往後需要擴展到ios,那麼建議appium
7.bug數量:UIAutomator有的問題Appium都會有,UIAutomator沒有的問題Appium也有可能有^_^(不過我還是很看好Appium的)
8. 輸入問題,都有bug,具體請查看我相應blog,特別是中文輸入,這就是為什麼我剛才特意提出Robotum的原因之一
9. WebView支持:UIAutomator據說今年年初已經開始支持,個人沒有這方面要求所以沒研究;Appium的框架用的Selenium本身就是PC上最流行的開源Web測試框架,所以必然支持了。注意這你你要有點android編程知識了,WebView指的不僅是WebView控制項還包含如用sencha+phonegap把webview封裝成一個跨平台app的情況了,具體如果不清楚請google。

其他區別我現在就沒有想到了,希望能幫助到你,從我自己的角度來看,我覺得UIAutomator繼續往前發展是必然的了,但是它不可能最終支持ios。至於Appium我同樣有很大的信心它會繼續往好的方向發展,且考慮到它的跨平台支持,基於node.js(現在非常流行哦),兼容性等,我如果是你的話我會考慮用Appium的(拋開Robotium不說,如果你又要考慮的話就需要你根據我之前說的再總結下了^_^)。

我覺得這個可以類比之前的微軟和Borland的關系,API是Windows,但是IDE是Borland的,各專所長了。可惜(或者慶幸)後來微軟發力一下把Borland打得滿地找牙一蹶不振,不過這是題外話了,略過......

對了,我有可能會對這封郵件整理下發到博客了,也希望其他網友能評點一二給你出主意。今晚本來想看下easy_monkey的知識了,給你寫這個email變成臨時性總結了。^_^

給金陽光老師評論的回復如下(關於MonkeyRunner的個人觀點)
-----------------------------------------------------------------------------------------------------------------
回復haorenmin2008:首先膜拜下,金老師大駕光臨蓬蓽生輝啊!
對於後者,確實如此,UIAutomator需要API Level17(包含)以上。
對於前者,因為還沒有MonkeyRunner的項目經驗,所以是否很強大我就不敢妄加評論了,但是在我近來的tryout過程中,鄙人有以下的一些不成熟的認知:

1. 感覺功能不是很穩定,之前嘗試一個MonkeyDevice的getProperty方法,竟然有時成功有時失敗。
2. 性能不好,特別是當我們要用到hierarchyviewer的功能的時候很明顯。
3. 只能用MonkeyImage的sameAs做截屏的對比,雖然加上hierarchyviewer後可以用它的getText,但還是很有限。
4. 控制項定位方面主要是坐標點和HierarchyViewer提供的根據ID。前這兒在UI布局稍微有調整位置的話就需要跟著變動,沒有像其他控制項類框架那樣做高層抽象除非換控制項不然都不需要怎麼變動;後者的話很多控制項是沒有id或者是有多個控制項id相同的。
5. 可調試性也不強(起碼我摸索了這幾天沒有發現一個很好的調試方法,比如IDE Ecilpse等的集成調試方法)
6. HierarchyViewer的穩定性也讓我擔憂,碰到過幾次取控制項信息的時候報exception的。
7. 資料稀缺,不僅網路,google也一樣
8. Google支持讓人覺得摸不著頭腦,sdk給出的API和官方提供的API竟然不一致,以MonkeyDevice為例子,而sdk多出來的API竟然還不能用,google出來的信息不超過10個page,還要很多都是重復的石沉大海的網友報的問題。
9. 再一個的我真心搞不懂為什麼本身java寫的庫非要搞個jython來調用,首先我不說性能損耗(這點肯定是有的,native庫當然用native語言調用效率最好嘛),我想在eclipse上對以下的"device."做自動補全是做不到的「device = MonkeyRunner.waitForConnection()\n device.",而只有直接調用個構造函數實例化的device = MonkeyDevice(xxx)才能做到,這個我不相信是我配置的問題,換了個jython標准編譯器以調用標准庫問題同樣存在。

⑧ android手機系統如何運用自動化有哪些自動化測試軟體

有自動化測試的工具,主要是針對Android軟體的功能測試的, 你可以去搜索一下DroidPilot,非常簡單易用,應該能滿足你的要求

⑨ android自動化測試框架有哪些

1、Monkey是Android SDK自帶的測試工具,在測試過程中會向系統發送偽隨機的用戶事件流,如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試,也有日誌輸出。實際上該工具只能做程序做一些壓力測試,由於測試事件和數據都是隨機的,不能自定義,所以有很大的局限性。
2、MonkeyRunner也是Android SDK提供的測試工具。嚴格意義上來說MonkeyRunner其實是一個Api工具包,比Monkey強大,可以編寫測試腳本來自定義數據、事件。缺點是腳本用Python來寫,對測試人員來說要求較高,有比較大的學習成本。

⑩ 如何用android studio寫自動化測試

1、build.gradle里,dependencies下增加 androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.1』。如果缺少這個配置,則在測試代碼里將無法用到robotium的包。
2、我們項目的代碼結構是老式的,所以需要重新設置test的地址,即在android.sourceSets下新增 androidTest.setRoot('tests』)。可以取tests外的其他名字,然後在跟build.gradle同級的地方建立這個文件夾,沒有更多額外設置的話,測試代碼的放置需要按照新式結構,即tests\java下。如果沒有正確配置,則這個測試代碼將不可見。

除了代碼改動外,如果要在Android Studio裡面跑,則還需要額外配置:
菜單Run -> Edit Configuration,在Android Tests下新增條目,然後正確配置,就可以了:選擇哪個Mole,選擇測試的范圍(Mole或Package等),選擇Target Device。
這個是配置的東西,沒有辦法提交到Git。

下面是個簡單的例子,我們的app在測試的環境下會先彈出一個選環境的AlertDialog,所以需要clickOnText:
/**
* Created by Samuel Cai on 5/20/14.
*/
public class MainActivityTest extends {

private Solo solo;

public MainActivityTest() {
super(LogoActivity.class);
}

@Override
public void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}

public void testNavigateToHomeScreen() throws Exception {
//choose environment
solo.waitForDialogToOpen();
solo.clickOnText("qa");
solo.clickOnButton("OK");

//assert home screen finished loading.
assertTrue(solo.waitForText("Diapering"));
}
}

熱點內容
訪問攔截怎麼解除安卓 發布:2024-09-20 17:28:48 瀏覽:273
蘿卜干存儲 發布:2024-09-20 17:21:37 瀏覽:714
蘋果手機如何遷移軟體到安卓手機 發布:2024-09-20 17:21:34 瀏覽:691
查看伺服器ip限制 發布:2024-09-20 16:56:27 瀏覽:388
p搜系統只緩存1頁為什麼 發布:2024-09-20 16:48:51 瀏覽:838
上網的賬號和密碼是什麼東西 發布:2024-09-20 16:31:31 瀏覽:612
安卓手機王者榮耀如何調超高視距 發布:2024-09-20 16:31:30 瀏覽:428
安卓G是什麼app 發布:2024-09-20 16:23:09 瀏覽:81
iphone怎麼壓縮文件 發布:2024-09-20 16:08:18 瀏覽:356
linux查看用戶名密碼是什麼 發布:2024-09-20 16:03:20 瀏覽:744