本筆記根據微信讀書的:《Android自動化測試實戰》
簡介
測試金字塔
金字塔模型將測試分為單元(Unit)、服務(Service)和使用者介面(User Interface,UI)這3個層級;在測試發展的歷程中,也出現了一些重新定義金字塔層級的測試模型,儘管對分層的具體描述各不相同(有人將這3個層級分別定義為單元、介面、整合測試,也有人將整個金字塔劃分為4~5個層級),但金字塔自底向上的結構是大家公認和遵循的。
單元測試
單元測試是針對程式碼單元(通常是 類 或 方法 )的測試,單元測試的價值在於能提供快速的反饋,在開發過程中就可以對邏輯單元進行驗證。好的單元測試可以幫助改善既有設計,在團隊掌握測試驅動開發(Test Driven Development,TDD)的前提下,單元測試能輔助重構,幫助提升程式碼整潔度。
服務測試
針對業務介面進行的測試,主要測試內部介面功能實現是否完整,比如內部邏輯是否正常、異常處理是否正確等,比如內部邏輯是否正常、異常處理是否正確等。
UI測試
UI測試是從使用者的角度驗證產品功能的正確性,測試的是端到端的流程,並且加入使用者場景和資料,驗證整個過程是否正確、流暢。
自動化測試
單元自動化測試
單元自動化測試指對軟體中最小的可測試單元進行檢查和驗證,呼叫被測服務的類或方法,根據類或方法的引數,傳入相應的資料,得到返回結果。單元自動化測試是最基本的測試之一,也是測試中的最小單元,它的物件是函式,可以包含輸入輸出,針對的是函式功能或者函式內部的程式碼邏輯,並不包含業務邏輯。該類測試一般由研發人員完成,需要藉助單元測試框架,如Java的JUnit、TestNG,Python的unittest、Pytest,等等。
介面自動化測試
介面自動化測試主要驗證模組間的呼叫返回,以及不同系統、服務間的資料交換。介面自動化測試一般在業務邏輯層進行。所以,介面測試關注的是資料。常見的介面測試工具有Postman、JMeter、LoadRunner等。
UI自動化測試
UI層是使用者使用產品的入口,產品的所有功能透過這一層提供給使用者,目前測試工作大多集中在這一層,這種測試更貼近使用者的行為。所以,UI自動化測試的關注點是使用者操作行為,以及UI上各種元件是否可用。常見的UI測試工具有UFT、Selenium、Appium等。
Android
Android體系架構
應用程式層
Android會同一系列核心應用程式包一起釋出,該應用程式包包括桌面、SMS短訊息、日曆、地圖、通話、瀏覽器、聯絡人管理程式等應用程式,都是使用Java語言編寫的。
應用程式框架層
開發人員可以完全呼叫核心應用程式所使用的應用程式框架。該應用程式的架構設計簡化了元件的重用,任何一個應用程式都可以釋出它的功能塊並且任何其他的應用程式都可以使用其釋出的功能塊(不過得遵循框架的安全性)。同樣,該應用程式重用機制也使使用者可以方便地替換程式元件。
系統執行庫層
Android包含一些C和C++庫,這些庫能被Android系統中不同的元件使用,並透過Android應用程式框架為開發者提供服務。
Linux核心層
Android執行於Linux核心(kernel)之上,但並不是GNU/Linux。因為一般GNU/Linux支援的功能,Android大多都不支援
Android的Linux kernel控制包括安全(Security)、記憶體管理(Memory Management)、過程管理(Process Management)、網路堆疊(Network Stack)、驅動程式模型(Driver Model)等。
Android開發四大元件
活動(Activity)
用於表現功能,Activity是所有應用程式的根本,所有應用程式的流程都執行在Activity之中,Activity一般代表手機螢幕的一屏。如果把手機比作一個瀏覽器,那麼Activity就相當於一個網頁。
服務(Service)
在後臺執行,不提供介面呈現。Service是Android系統中的一種元件,它跟Activity的級別差不多,但是它不能自己執行,只能在後臺執行,並且可以和其他元件進行互動,Service是沒有介面的長生命週期元件
廣播接收器(Broadcast Receiver)
用於接收廣播。在Android中,Broadcast是一種廣泛應用的、用於在應用程式之間傳輸資訊的機制。而Broadcast Receiver是對傳送出來的Broadcast進行過濾、接收並響應的一類元件。
內容提供商(Content Provider)
支援在多個應用程式中儲存和讀取資料,相當於資料庫。Content Provider是Android提供的第三方應用資料的訪問方案。Android對資料的保護是很嚴密的,除了放在SD卡中的資料,一個應用程式所持有的資料庫、檔案等,都是不允許其他應用程式直接訪問的。Android當然不會真的把每個應用程式都設計成一座孤島,它為所有應用程式都準備了一扇窗,這就是Content Provider。
App的型別與區別
Native App:
Native APP指的是原生程式,一般依託於作業系統,有很強的互動,是一個完整的App,可擴充性強,需要使用者下載安裝使用。(簡單來說,原生應用是特別為某種作業系統開發的,如iOS、Android等,它們是在各自的移動裝置上執行的)。該模式通常是由“雲伺服器資料+APP應用客戶端”兩部份構成,APP應用所有的UI元素、資料內容、邏輯框架均安裝在手機終端上。
Web App
Web App是基於Web的系統和應用程式,執行於網路和瀏覽器之上,目前多采用HTML5標準開發,無須下載和安裝。
Hybrid App:
混合應用程式(Hybrid Application,Hybrid App)是結合了原生應用程式和Web應用程式兩者的元素的軟體應用。混合應用程式本質上是帶有原生應用外殼的Web應用。一旦使用者從應用商店下載應用並在本地安裝,外殼就會透過嵌入在應用中的瀏覽器連線到移動平臺提供的任何功能。瀏覽器及其外掛在後端執行,對終端使用者是不可見的。
測試框架
Instrumentation
Android自帶的一個測試框架,是很多測試框架的基礎,可以在同一個程序中載入被測元件。它有很多豐富的高層封裝,你可以使用基於Instrumentation的其他框架,避免過多二次開發。但Instrumentation不支援跨App使用,基於Instrumentation開發的框架都“繼承”了這個缺點。
Espresso
Espresso是Google的開源自動化測試框架。相對於Robotium和UIAutomator,它的特點是規模更小、更簡潔,API更加精確,使用者編寫測試程式碼更簡單,容易快速上手。因為它是基於Instrumentation的,所以不能跨App使用。
Robotium
是基於Instrumentation框架開發的一個更強的框架。該框架對常用的操作進行了封裝。
優點:容易讓使用者在短時間內編寫出測試指令碼,易用性高;支援自動跟隨當前Activity;由於執行時會繫結到圖形使用者介面(Graphical User Interface,GUI)元件,所以相比Appium,它測試時執行速度更快,功能更強大;即使使用者不訪問程式碼或不瞭解App實現,也可以使用;支援Activity、Dialog、Toast、Menu、ContextMenu和其他Android SDK控制元件。
缺點:不能測試Web元件;在舊裝置上測試執行速度會變得很慢;不支援iOS裝置;沒有內建的記錄和回放功能。
UIAutomator
UIAutomator是由Google提供的測試框架,它提供了Android Native App和手遊App的高階UI測試。這是一個包含API的Java庫,可以用來建立功能性UI測試,還有執行測試的執行引擎。該庫自帶Android SDK。
優點:在訪問不同的程序時,會給JUnit測試案例特權;測試庫由Google社群支援和維護。
缺點:僅支援Android 4.1(API level—16)及以上版本;不支援指令碼記錄,不支援Web檢視,僅支援使用Java,因此很難和使用Ruby的Cucumber結合,如想支援行為驅動開發(Behavior Driven Development,BDD)框架,建議使用Java自己的BDD框架,例如JBehave。
Calabash
Calabash是一個適用於iOS和Android裝置的跨平臺App測試框架,可用來測試螢幕截圖、手勢和實際功能程式碼。Calabash開源並支援Cucumber,Cucumber能讓使用者用自然的英語表述App的行為,實現BDD。Cucumber中的所有語句都是使用Ruby定義的。
優點:有大型社群支援;列表項簡單,有類似英語表述的測試語句,支援在螢幕上能夠實現的所有動作,如滑動、縮放、旋轉、敲擊等;支援跨平臺開發(同樣的程式碼在Android和iOS裝置中都適用)。
缺點:某一步驟測試失敗後,將跳過所有的後續步驟,這可能會導致錯過更嚴重的產品問題;測試耗費時間,因為它總是預設從安裝App開始;需要將Calabash框架安裝在iOS的.ipa檔案中,因此測試人員必須要有iOS App的原始碼;除了Ruby,對其他語言不友好。
Appium
Appium是一個開源、跨平臺的自動化測試工具,支援iOS、Android和Firefox OS平臺。透過Appium,開發者無須重新編譯App或者做任何調整,就可以測試App,可以透過測試程式碼訪問後端API和資料庫等。它是透過驅動iOS的UIAutomation和Android的UIAutomator框架來實現跨平臺支援的,同時繫結了Selenium WebDriver用於支援對早期Android平臺的測試。開發者可以使用Selenium WebDriver相容的任何語言編寫測試指令碼,如Java、Objective-C、JavaScript、PHP、Python、Ruby、C#、Clojure和Perl語言等。