2013-08-16 136 views
38

是否Robolectric提供任何明確的好處相比Android測試框架?我已經閱讀了關於這兩個框架的文檔,但據我看到,關於Robolectric的唯一明確優勢是它運行在JVM而不是DalvikVM上,使其比Android框架更快。Robolectric與Android測試框架

是否還有其他突出的優點?

+0

這是很久以前問的。 android測試框架比robolectric {今天2017/06]更好嗎? – Sam

回答

70

更新Apr-2015:Gradle構建工具和Android Studio now officially support unit testing並阻止android.jar拋出存根(沒有真正的實現)錯誤。所以,是的,它可能在Java虛擬機上運行測試,當存根正確時mocked。這是一個開始,但仍然與Robolectric的力量無法比擬。還有第三種選擇,滾動到這個答案的底部。

現在,關於Robolectric:

優點:這裏有關於它如何被證明是在單元測試中有用的幾個要點:

  1. 您不需要運行的模擬器,所以你可以測試一些項目的非UI部件,而不需要仿真器或設備。這也適用於在持續集成/構建服務器上運行測試,不需要啓動仿真器實例。

  2. 使用Android Studio,您可以快速運行一個特定的測試類,當您正在執行該測試用例以滿足測試用例時。您可以在編寫代碼時進行調試。這是一個巨大的生產力增長。

  3. 幾乎所有與Android相關的東西都可以僞造成影子對象,甚至是SQLite。再加上每個陰影對象暴露了許多有用的功能,這是他們的普通安卓對手所不具備的。使用android對象的陰影對象,您可以執行內部檢查或調用特殊方法。

  4. 測試多線程代碼時,像AsyncTask S,LoopersHandlers等,您可以暫停和快進線程活套,即使主線程真正的亮點。非常適合基於Handler的回調測試。

  5. 支持JUnit 4格式。上次我檢查時,Android仍然堅持使用JUnit 3。

  6. 可以與其他測試工具一樣的Mockito,咖啡等等等等結合

  7. 支持模擬活動實例創建Robolectric.buildActivity()並通過ActivityController其控制。片段/視圖操作也適用於這種模擬活動實例。

  8. 現在提供add-on modules涵蓋了多dex,v4支持,播放服務,地圖和http客戶端。因此,它現在很容易使用這些庫函數來測試代碼。

缺點:如果我發現它不那麼好:

  1. Robolectric擅長輔助單元測試,但並未涵蓋所有實際設備或仿真器可以提供的功能。例如傳感器,gps,開放式gl等等。

  2. 您在進行集成或UI測試時需要模擬器或真實設備,以便活動和服務可以與完整的android環境進行交互(其他應用程序,如使用相機應用程序爲您的應用程序獲取圖片),而不是一個有限的。在這裏你需要使用默認的測試框架,因爲它具有測試UI的功能。

  3. JNI loading似乎不被支持。因此無法測試具有本地依賴性的代碼。

  4. 截至目前,Robolectric對谷歌地圖jar的工作有硬連線依賴。並會從maven下載另一個android.jar。所以,項目設置可能需要一點修補。 更新:從v3開始,它似乎通過Gradle提取所有依賴關係而沒有太多大驚小怪。

  5. 較新的Android工具支持覆蓋和報告生成等,但僅限於在設備上運行測試時。因此,對於Robolectric,您必須創建額外的Gradle任務(運行Jaococ)才能爲您做到這一點。 更新:Gradle 2.9 +附帶jacoco插件。

  6. 由於兩個gradle這個和Android構建工具以很快的速度發運新的內部版本,穩定Robolectric版本有時會開始有與改變的構建工具的問題。最典型的問題包括:sdk版本不兼容,未找到清單,構建輸出路徑不匹配,資源未加載,構建配置問題等。一些問題也與Android工具中的錯誤有關。有時您甚至可能必須編寫自己的自定義測試運行器或應用解決方法,直到下一個版本修復這些問題。檢查出open issues並相應地配置測試。


另一種方法是你自己的簡單模仿的東西,沒有框架參與。它是「艱難的方式」,但卻是最可定製的方式。它帶有JMockit的普通JUnit:

@RunWith(JMockit.class) 
public class OtherTest { 
    public void testHandlerCallback(@Mocked final FragmentTransaction transaction, 
            @Mocked final FragmentManager manager, 
            @Mocked final Activity activity, 
            @Mocked final LayoutInflater inflater, 
            @Mocked final ViewGroup parent) { 

     final List<Fragment> fragments = new ArrayList<>(); 
     new Expectations() {{ 
      activity.getFragmentManager(); result = manager; 
      manager.beginTransaction(); result = transaction; 
      transaction.add(withCapture(fragments), anyString); 
      transaction.commit(); result = new Delegate<Void>() { 
       public int commit() { 
        View v = fragments.get(0).onCreateView(inflater,parent,null); 
        Deencapsulation.invoke(v,"onMeasure",0,0); 
        return 0; 
       } 
      }; 
     }}; 
    } 
} 

上面是一個粗略的內聯示例。實際上,您可以創建適當的可重用類(例如FragmentTestHarness),它將測試一個組件(例如Fragment)並將其包裝在完全隔離的環境中,爲測試做好準備。

+0

與Android測試框架相比,robolectric有什麼缺點嗎? – Traxex1909

+0

@ Traxex1909我會在回答中更新。 –

+0

當我們已經有Genymotion的時候,似乎有些部分不是真的? –

2

Robolectric的主要優點是速度。使用Robolectric進行單元測試不需要運行仿真器或設備來運行測試,因此速度要快得多。

您可能仍然希望擁有一套針對真實設備運行的集成測試,只是一個小得多的套件。

18

要分享我該怎麼辦......

Robolectric 對於SQL,活動流程,對於需要上下文的對象。

JUnit4 for api的java模塊,以確保數據正確返回。

Espresso 用於檢查UI顯示是否正確。

當我修改API ...我只運行jUnit4。

當我修改了api和UI或Sqlite之間的數據綁定時,我將只運行Robolectric。

當我修改UI時,我只運行Espresso。

有時我會一起運行Robolectric和濃咖啡,但非常罕見。

但是我會在發佈之前運行所有遊戲來玩遊戲。

因爲我覺得現在沒有真正的好處。但看看你如何使用它來加快你的產品質量和開發速度。

糾正我,如果我錯了。

+1

你有我可以看一些樣品嗎? :d – Spurdow