簡體   English   中英

Android-JUnit測試模型/控制器(僅使用Java導入),而無需部署Android仿真器

[英]Android - JUnit testing Models/Controllers (which only use java imports) without the Android Emulator deploy

我的Android App項目有兩個不同的UnitTest項目。 一種用於模型類(僅使用java導入),另一種用於“活動”(顯然同時使用java和android導入)。

在Eclipse中,當我在這兩個UnitTest項目中的任何一個上使用選項運行方式 -> Android JUnit Test時,我在控制台中得到以下內容:

[2014-05-23 11:02:23 - MyProject.test] Android Launch!
[2014-05-23 11:02:23 - MyProject.test] adb is running normally.
[2014-05-23 11:02:23 - MyProject.test] Performing android.test.InstrumentationTestRunner JUnit launch
[2014-05-23 11:02:23 - MyProject.test] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'MyEmulator'
[2014-05-23 11:02:27 - MyProject.test] Application already deployed. No need to reinstall.
[2014-05-23 11:02:27 - MyProject.test] Project dependency found, installing: MyProject
[2014-05-23 11:02:30 - MyProject] Application already deployed. No need to reinstall.
[2014-05-23 11:02:30 - MyProject.test] Launching instrumentation android.test.InstrumentationTestRunner on emulator-5554
[2014-05-23 11:03:03 - MyProject.test] Sending test information to Eclipse
[2014-05-23 11:03:40 - MyProject.test] Test run finished

兩個UnitTest項目都可以工作並給出測試結果,但是由於它是使用仿真器進行測試的,因此要花一些時間才能顯示結果。

現在我的問題是否可以運行一個僅使用Java導入作為JUnit的Android UnitTest項目,而不必使用模擬器? 這將導致更快的測試結果。

當我嘗試運行方式 -> JUnit測試選項時,出現以下錯誤:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (classFileParser.cpp:3494), pid=388, tid=1680
#  Error: ShouldNotReachHere()
#
# JRE version: 6.0_31-b05
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.6-b01 mixed mode windows-amd64 compressed oops)
# An error report file with more information is saved as:
# C:\Users\...\MyProject.test\hs_err_pid388.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

我的測試班過去是:

public class MyUnitTest extends android.test.AndroidTestCase
{
    public void aTest(){
        ...
        assertSomething(...);
        ...
    }

    ...
}

我以前使用Run As- > Android JUnit Test來運行它們。


我通過以下步驟對其進行了更改:

  1. 首先,我按照這里的說明進行操作。
  2. 然后在我所有的測試類中,我都刪除了extends android.test.AndroidTestCase
  3. 添加了以下兩個導入: import junit.framework.Assert; import org.junit.Test; (警告:確保使用junit.framework.Assert而不是org.junit.Assert )。
  4. 在每個測試方法之前添加了@Test
  5. 更改了所有assertSomething(...); Assert.assertSomething(...); fail(...); Assert.fail(...);
  6. 刪除了一些我在某些Model / Controller類中仍然擁有的Android日志。

現在我的測試班是:

import junit.framework.Assert;

import org.junit.Test;

public class MyUnitTest
{
    @Test
    public void aTest(){
        ...
        Assert.assertSomething(...);
        ...
    }

    ...
}

現在,我可以通過Run As- > JUnit Test運行該項目。


更新:

當您啟動並運行該項目時,通過右鍵單擊Project-> Run as- > JUnit Test來同時在Eclipse中測試所有UnitTest都不是問題。 但是,當您嘗試測試單個UnitTest類時(例如您剛剛添加的類),可能會發生與我的問題相同的錯誤。

這些是您要在Test-Project中添加僅Java的UnitTest類時的步驟,該類僅使用Java庫並啟用Test類的單獨測試而不會出現錯誤:

  1. 添加一個類(右鍵單擊src內的文件夾)-> 新建 ->
  2. 添加import junit.framework.Assert; import org.junit.Test; 就像上面提到的。
  3. 用上面的語法創建一些UnitTest方法(因此包括@TestAssert.assertSomething(...);
  4. 右鍵單擊新的UnitTest-> Run as- > JUnitTest
  5. 選擇Eclipse JUnit啟動器
  6. 現在將出現在我的問題帖子底部的錯誤
  7. 右鍵單擊測試項目-> 屬性 -> 運行/調試設置
  8. 選擇出現錯誤的新UnitTest-> Edit ...
  9. 轉到Classpath選項卡->在Bootstrap Entries下,刪除Google API [Android 4.4.2] (這可能與您的情況有所不同,但是您應該刪除Android APIAndroid Google API 。)
  10. 刪除后,單擊應用 -> 確定 ->在“ 運行/調試設置”中再次應用 -> 確定

現在,您可以成功地在此單獨的Test-class上使用Run As- > JUnit Test ,而不必每次都被迫測試整個Project。


我希望這對嘗試為Android項目進行JUnit測試的人有所幫助。 PS:我還有第二個Test-Project,其中包含需要Android庫的JUnit Tests。 只要確保您要測試的類均未使用Android庫即可(例如Logcat消息,Test-Toasts或Patterns.WEB_URL.matcher(url).matches()) [ android.util.Patterns ]即可驗證字符串URL)正在純JUnit測試項目中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM