2013-01-14 28 views
1

我一直在試圖弄清楚如何在我的Android應用程序中包含標準的JUnit 3.x(甚至JUnit4.x)測試。我想通過Android單元測試工具使用JUnit,因爲它速度更快,並且可以直接在我的IDE中運行(Android JUnit工具需要部署到設備或仿真器的第一個地方)。我也想用JUnit來強加適當的SoC(Separation of Concerns)。最初,我設置了多個模塊來支持這個,主Android模塊和核心庫模塊,其中主模塊具有所有Android細節,而核心模塊具有普通舊Java對象(PO​​JO)和JUnit優點。Android項目中的常規JUnit

最近我開始研究一個Android項目,在那裏我開發了一個庫來處理一些低級別的android特定工作,並將它作爲高級操作暴露給主模塊。問題是我需要在庫模塊中使用JUnit,但我不想再打開另一個模塊來這樣做。在理想的世界中,我將擁有:

主要模塊:包括用於在活動,片段等之間導航的所有高級UI和控制器邏輯。取決於MyLib。

MyLib:包含高級接口,封裝低級邏輯來處理諸如android特定網絡,持久性,加速度計讀取等事情。許多POJO涉及一些低級邏輯。還包括一個示例或演示應用程序來直接鍛鍊這些接口。包括在POJO上運行JUnit的能力。

我活在一個夢想中,還是有一種方法可以使用當前的開發工具智能地設置它?我主要使用IntelliJ Idea,但也可以使用Eclipse特定的解決方案。

回答

2

直接在JUnit測試運行器中運行測試會遇到的問題是,您將無法調用任何com.android。*類。那是因爲android.jar中的這些類在SDK中被刪除了。只有這些Dalvik字節代碼版本才具有那些只能在仿真器中運行的實際實現。

避免調用com.android。*類非常困難,尤其是考慮到如此多的Android方法需要Context。

我也覺得這有點令人沮喪,因爲模擬器啓動緩慢而且執行代碼速度慢。它使測試開發非常繁瑣。

我有使用JUnit測試運行器w/out模擬器的唯一好運是創建一個單獨的非Android項目,指向我的項目文件。這使得我可以在模擬器之外啓動JUnits,但是我實際測試的課程非常有限。

+0

我完全理解和欣賞這個限制,這實際上是一個功能。此練習的要點是確保類之間的適當內聚,並將Android特定代碼限制在合適的位置。儘管如此,我仍然擔心,我真正在尋找的是對整體優選解決方案的破解。 – Cliff

+0

我有類似的經驗,模擬器測試很慢。使用1.2GHz或更高的處理器電話會更好。任何較小的測試都會很痛苦。 – Siddharth

+0

我試圖避免使用設備進行測試,真實或模擬。對於大多數邏輯來說這是不必要的。我可以通過自定義螞蟻黑客來解決這個問題,我不願意這樣做,我寧願弄清楚如何在IDE中設置這樣的環境。 – Cliff

0

總之

  • 使用JUnit測試類和靜態方法。
  • 使用儀器來測試您的應用程序

儀表的點擊-UX響應上手一痛,需要時間去學習。因此,投入很多時間在你好世界。它是一個全新的世界。

+0

對,我明白基本面是好的。我的問題是關於在單個Android項目中混合使用這兩種類型的測試而未引入庫。 – Cliff

+0

你需要有一個單獨的測試項目,而不是你的開發項目的一部分。測試應該是分開的,理想情況下由同樣好的測試團隊處理。 – Siddharth

+0

我同意我應該設置一個單獨的項目。我試圖不將另一個組件從一個本身與主項目分離的項目中分離出來。 – Cliff