1. 程式人生 > >【金陽光測試】基於控件核心技術探討---Android自己主動化系列(2)---2013年5月

【金陽光測試】基於控件核心技術探討---Android自己主動化系列(2)---2013年5月

進程 實用 版本 信號 監聽 dialog otto 設計 核心技術


第一講分享了下安卓自己主動化一些概況和一些自己主動化框架現狀和技術可以解決什麽樣的問題。

這次課就深入到android世界裏面。遨遊、翺翔。深入了解自己主動化測試核心技術。

搞過編程開發的同學聽到instrumentation這個東西一定不陌生。在android架構裏面分四層(最以下是硬件驅動相關抽象層。不是筆者討論的內容範圍),往上面一點是協議棧。也不是討論的核心,都和c語言相關。一直到第三層框架層(framework)。

細分有二:

A. android的改良虛擬機dalvik和Runtime(java執行時環境)。這個我還要略微解釋下(懂的人請跳過),谷歌把java虛擬機(pc上面的虛擬機)進行改良,進行內存等優化,取消了遠程登錄等功能。發展成為自己的虛擬機。這樣做優點是把每一個獨立的進程進行虛擬機封裝,從而進程崩潰不會影響system進程。保證了安卓系統穩定性。

B. Runtime是一個和外部程序的接口(有些地方叫協議)把非常多豐富的c++庫、3D和2D動畫、媒體庫、字體庫、sqilite等優良的特性引入到上層。

當一個android系統啟動的時候,載入完成守護進程和一些驅動等等步驟會調用init方法:Android的init進程為SIGCHLD綁定了信號處理函數sigchld_handler()。並創建了一個socket用於接收該函數中發送的socket消息。sigchld_handler()函數僅僅是簡單的派送一個消息到該socket。

看得頭暈的同學請無視他們。

你僅僅要記住,c側的框架層載入完成,將要調用一個java層最根上的父類。就是Zygote。英文名字是孵化、受精卵,大意是生孩子。全部的進程都由它產生,它和系統服務結合共同產生ActivityManagerService、WindowsManagerService和DialogservicesManager等,由zygote控制它們和線程binder對象進行通信,共同產生android四大組件(activity、broadcast、services、contentprovide)。在zygote創建process(線程)對象同一時候。我們最終看到幕後蠢蠢欲動的instrumentation。

饒了一大圈的蓋世太保最終出現了。它可以在全部組件的初始化之前產生,全部它可以監視全部組件信息、狀態、變化、消亡等,當然,在監控之前。它會拿到這些組件的那個上下文引用(context),控制應用程序的多個生命周期。發送UI事件給應用程序;在運行期間檢查程序狀態。

這就是自己主動化最核心的技術—設計模式之監聽者模式。

在操作系統中。應用程序組件是控件的父類。由instrumentation監控和獲取信息。然後由instrumentationTestRunner來控制腳本才進行一次自己主動化測試,你能夠在adb shell裏面執行這個腳本,或者用eclipse+junit方法來執行腳本。都是能夠的。

這裏的Instrumentation類。它可以監視應用程序跟系統的交互。Instrumentation對象會在應用的其它全部組件被實例化之前實例化。須要調用instrumentation類必須繼承android.app.instrumentation才幹使用它。

因為android的核心不是app,是activity。

這和ios蘋果大相徑庭。蘋果是delegate托付和發送消息機制為主的MVC模型(視圖、控制器和模型)具體蘋果ios自己主動化測試文檔會在第9講以後問世。盡管android也有消息,可是安卓的消息通常是傳遞鍵值對(key-_value),在安卓裏面叫bundle對象。是一種被泛型的字典。這裏順便提下後起之秀winphone 8。它的機制更詭異,是一種墓碑化休眠保存機制(這個winphone自己主動化和單元測試會在第15講以後給大家具體剖析)。正由於有了它,winphone為了達到它最好的用戶體驗,雖然是多線程,可是同一時間僅僅能有一個進行激活狀態,正由於如此,它單核的機器性能和效率遠遠蓋過android和蘋果。所以說。做了三十年的操作系統的微軟水平真不是蓋的。用戶體驗等等都優越蘋果和android,雖然非常少人使用。

好,廢話少說,切入正題。

Instrumentation會去androidmanifest.XML找裏面註冊的activity、service等一些組件信息,當然還會包含布局文件layout裏面xml的組件和控件在gen目錄裏面生成的R.java的id搜集而且保存下來,這些id都以0x的16進制的int。能夠說是控件的身份證信息。你要是認為麻煩,能夠用hierarchyviewer去查看,順便提一下,用這個工具必須得root手機,當然筆者是不提倡把一個好的user版本號手機隨便刷成root,這裏要給買來的普通用戶手機正正名,root是打開管理員su權限,讓終端使用者有最高權限去操作手機,不論什麽東西都有利有弊。弊端是你同一時候給了應用程序相相應的權限:比方其它應用程序能夠跨進程訪問(這在android世界裏面是破壞了谷歌的整套設計規則),搞android開發的知道,進程之間不能隨便訪問和建立通信。除非你打開AIDL綁定的服務接口或者你在編譯手機的時候偷偷的把app簽名做成系統級別的簽名。

除此以外。在一般用戶權限做了非常多限制,大大的保證了你機器穩定性和安全性。可是你要root的話。非常多東西就不可控了。表現出來的現象是你手機莫名其妙重新啟動、死機、無響應。或者你操作不當誤刪除了實用的模塊,比方打電話不小心卸載,你就僅僅能去又一次刷過機器,所以說,普通用戶還是不要隨便刷機,由於谷歌壓根就不限制你安裝應用程序,不像蘋果非得越獄才幹任意安裝應用。

當然你用自己主動化測試的時候也得在manifest申明。例如以下圖

技術分享 技術分享

第一個紅箭頭這個帶.的ResultActivity前面省略了命名空間(android叫包名),由於就一個包。當然在真正測試demo裏面。大家還是要新建一個包名+test,測試完成刪除就好;

第二個uses-library,由於現有的基於控件的instrumentation和興許給大家介紹的Robtium框架,是封裝了instrumentation的。都不能單獨進行測試,必須配合junit4(junit3已經廢棄。雖然能用,可是高級功能和annotation等須要junit4,這是一個元數據。也就是解釋數據的數據,不明確的同學能夠網上搜索下,不是這次的重點。

(這個具體使用會在第5篇以後具體介紹))框架一起進行測試,所以這條語句就是為了導入junit包。讓結果執行在junit框架裏面。

第三個紅箭頭就是蓋世太保,有了它我們就能夠隨時調用和給你見到布局文件的菜單進行操作了,都不須要開權限,當然你得統一簽名,由於測試源碼我們有,這步省略。(後面第7章會教大家不用源碼的方法),你能夠點擊,斷言,back等都是能夠的。

到此為止,自己主動化核心技術之中的一個---基於控件的精髓就在此。以後大家別見市面上有多少種android自己主動化工具吹噓:能夠遠程控制、能夠鼠標控制手機、能夠自己主動錄制腳本。

是,可是不是他們本事高強。事實上都是調用了谷歌封裝instrumentation。所以厲害的還是谷歌。並非做自己主動化工具的人,不相信的同學能夠關註我興許的講座。我也隨便整合一個所謂的框架來執行自己主動化腳本,做測試工作中的項目,到時候請大家拍磚。

^_^(除了第二種自己主動化核心技術---ORC和元素識別,會在第7篇以後給大家揭秘)

這次技術分享就到這裏,第三講主要給大家分享自己主動化測試鼻祖Monkey 的原理和靈活使用它的一些高級法則,靈活執行它能夠對測試起到非常大的幫助。

金陽光自己主動化資料+視頻:
1.官網:http://www.goldensunshine.cc/
2.關註我新浪微博:金陽光woody
3.百度搜:金陽光 測試,找到金陽光老師視頻
4.很多其它最新視頻在qq群:212260449更新

5.資料csdn博客:http://blog.csdn.net/haorenmin2008

6.金陽光微信公眾賬號:搜索金陽光自己主動化

技術分享

【金陽光測試】基於控件核心技術探討---Android自己主動化系列(2)---2013年5月