Robolectric框架概述

Robolectric框架的核心作用在於使用一套在Android api的基礎上修改的或者自定義的一套api,基本上是和Android api一一對應的。需要這樣做的原因是,android單元測試是跑在jvm上的。

優點是不用跑一次單元測試就完整的啓動一個Android進程,jvm進程比Android啓動快很多,調試或者運行的效率就高了。

但是缺點是運行時缺少android的環境,那麼需要一個模擬的,簡化的Android環境,可以滿足測試用例對Android環境的基本依賴,下面說說Robolectric是怎麼模擬以及如何簡化的:

1.模擬啓動Activity時調用生命週期回調方法,加入用於判斷最近用於啓動Activity的Intent的API(模擬的啓動過程必然沒有註冊到AMS過程,也沒有與WMS通信創建窗口的過程)

2.對模擬ContentProvider和數據庫的讀寫(模擬中肯定沒有跨進程通信,即沒有向AMS發佈IContentProvider的過程,對ContentProvder的讀寫也不依賴Binder驅動,都是在測試進程中完成),

3.對Handler,Looper,MessageQueue進行了很好的模擬,還加入了對MessageQueue中的消息分發的控制,便於對執行結果進行斷言,當然模擬的消息循環系統肯定沒有native消息循環部分。

總而言之,Robolectric是用於模擬了部分Android環境的,解決了測試用例需要對Android基本環境的依賴問題;不是完全的模擬,這樣可以加快單元測試運行的速度;加入某些監視某些結果或者狀態的接口,加入了某些用於控制生命週期或者觸發特定行爲的api,這樣便於對被測試代碼流進行控制及獲取代碼運行結果進行斷言。

Robolectric最龐大的部分是各種Shadow類,是用於替代原Android api類中的某些方法的。而替換過程主要是org.robolectric.internal.bytecode.SandboxClassLoader控制,所以替換的過程是運行時進行的。原理是修改字節碼,過程很複雜。除了Shadow類,其他替換原Android api的代碼在C:\Users\<用戶名>\.m2\repository\org\robolectric\android-all\<robolectric版本全稱>\<robolectric版本全稱>.jar中。

 

關於如何使用代碼動態替換字節碼的文章:https://www.jianshu.com/p/d760e48ea7b0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章