是否Robolectric提供任何明確的好處相比Android測試框架?我已經閱讀了關於這兩個框架的文檔,但據我看到,關於Robolectric的唯一明確優勢是它運行在JVM而不是DalvikVM上,使其比Android框架更快。Robolectric與Android測試框架
是否還有其他突出的優點?
是否Robolectric提供任何明確的好處相比Android測試框架?我已經閱讀了關於這兩個框架的文檔,但據我看到,關於Robolectric的唯一明確優勢是它運行在JVM而不是DalvikVM上,使其比Android框架更快。Robolectric與Android測試框架
是否還有其他突出的優點?
更新Apr-2015:Gradle構建工具和Android Studio now officially support unit testing並阻止android.jar拋出存根(沒有真正的實現)錯誤。所以,是的,它可能在Java虛擬機上運行測試,當存根正確時mocked。這是一個開始,但仍然與Robolectric的力量無法比擬。還有第三種選擇,滾動到這個答案的底部。
現在,關於Robolectric:
優點:這裏有關於它如何被證明是在單元測試中有用的幾個要點:
您不需要運行的模擬器,所以你可以測試一些項目的非UI部件,而不需要仿真器或設備。這也適用於在持續集成/構建服務器上運行測試,不需要啓動仿真器實例。
使用Android Studio,您可以快速運行一個特定的測試類,當您正在執行該測試用例以滿足測試用例時。您可以在編寫代碼時進行調試。這是一個巨大的生產力增長。
幾乎所有與Android相關的東西都可以僞造成影子對象,甚至是SQLite。再加上每個陰影對象暴露了許多有用的功能,這是他們的普通安卓對手所不具備的。使用android對象的陰影對象,您可以執行內部檢查或調用特殊方法。
測試多線程代碼時,像AsyncTask
S,Loopers
和Handlers
等,您可以暫停和快進線程活套,即使主線程真正的亮點。非常適合基於Handler的回調測試。
支持JUnit 4格式。上次我檢查時,Android仍然堅持使用JUnit 3。
可以與其他測試工具一樣的Mockito,咖啡等等等等結合
支持模擬活動實例創建Robolectric.buildActivity()
並通過ActivityController
其控制。片段/視圖操作也適用於這種模擬活動實例。
現在提供add-on modules涵蓋了多dex,v4支持,播放服務,地圖和http客戶端。因此,它現在很容易使用這些庫函數來測試代碼。
缺點:如果我發現它不那麼好:
Robolectric擅長輔助單元測試,但並未涵蓋所有實際設備或仿真器可以提供的功能。例如傳感器,gps,開放式gl等等。
您在進行集成或UI測試時需要模擬器或真實設備,以便活動和服務可以與完整的android環境進行交互(其他應用程序,如使用相機應用程序爲您的應用程序獲取圖片),而不是一個有限的。在這裏你需要使用默認的測試框架,因爲它具有測試UI的功能。
JNI loading似乎不被支持。因此無法測試具有本地依賴性的代碼。
截至目前,Robolectric對谷歌地圖jar的工作有硬連線依賴。並會從maven下載另一個android.jar。所以,項目設置可能需要一點修補。 更新:從v3開始,它似乎通過Gradle提取所有依賴關係而沒有太多大驚小怪。
較新的Android工具支持覆蓋和報告生成等,但僅限於在設備上運行測試時。因此,對於Robolectric,您必須創建額外的Gradle任務(運行Jaococ)才能爲您做到這一點。 更新:Gradle 2.9 +附帶jacoco插件。
由於兩個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
)並將其包裝在完全隔離的環境中,爲測試做好準備。
與Android測試框架相比,robolectric有什麼缺點嗎? – Traxex1909
@ Traxex1909我會在回答中更新。 –
當我們已經有Genymotion的時候,似乎有些部分不是真的? –
Robolectric的主要優點是速度。使用Robolectric進行單元測試不需要運行仿真器或設備來運行測試,因此速度要快得多。
您可能仍然希望擁有一套針對真實設備運行的集成測試,只是一個小得多的套件。
要分享我該怎麼辦......
Robolectric 對於SQL,活動流程,對於需要上下文的對象。
JUnit4 for api的java模塊,以確保數據正確返回。
Espresso 用於檢查UI顯示是否正確。
當我修改API ...我只運行jUnit4。
當我修改了api和UI或Sqlite之間的數據綁定時,我將只運行Robolectric。
當我修改UI時,我只運行Espresso。
有時我會一起運行Robolectric和濃咖啡,但非常罕見。
但是我會在發佈之前運行所有遊戲來玩遊戲。
因爲我覺得現在沒有真正的好處。但看看你如何使用它來加快你的產品質量和開發速度。
糾正我,如果我錯了。
你有我可以看一些樣品嗎? :d – Spurdow
這是很久以前問的。 android測試框架比robolectric {今天2017/06]更好嗎? – Sam