2013-11-21 70 views
0

我正在開發一個單一活動的圖形計算器應用程序。 (Android API 10) 佈局相當複雜,40+按鈕佔據了屏幕下半部分 以及作爲屏幕頂部的框架佈局。框架佈局被分成一個 「ScreenFrame」,其中包含計算器的「屏幕」。 在ScreenFrame中顯示的每個視圖/視圖組都是自定義視圖/視圖組,它顯示用戶正在執行的計算 。想想TI圖形計算器,在整個表達式可以看出 與運算符號...ActivityInstrumentationTestCase2 AND Robotium測試用例掛起,直到在模擬器上返回/ home按下,爲什麼?

我一直在寫JUnit測試,主要是繼承AndroidTestCase因爲我只需要 上下文來測試代碼的很大一部分,而不是整個活動框架。 但是,我已經開始編寫功能測試案例 ,應用程序的某些部分需要整個活動框架才能運行。

所以這裏是我完全陷入困境的問題。 首先,我會告訴測試用例

public class CommandTest extends ActivityInstrumentationTestCase2<Calculator> { 

    private Calculator _calculator; 

    public CommandTest(){ 
     super(Calculator.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     setActivityInitialTouchMode(true); 
     _calculator = getActivity(); 
     super.setUp(); 
    } 

    @Override 
    protected void tearDown() throws Exception { 
     super.tearDown(); 
     _calculator.finish(); // doesn't make a difference if this line is there or not 
    } 

    public void testCircleBadSyntax1() { 
     _calculator.runOnUiThread(new Runnable() { 
      @Override public void run() { 
       Button twoButton = (Button) _calculator.findViewById(R.id.twoButton); 
       twoButton.performClick(); 
       Button addButton = (Button) _calculator.findViewById(R.id.addButton); 
       addButton.performClick(); 
       Button nineButton = (Button) _calculator.findViewById(R.id.nineButton); 
       nineButton.performClick(); 
       Button enterButton = (Button) _calculator.findViewById(R.id.equalsButton); 
       enterButton.performClick(); 
      } 
     }); 
     Instrumentation inst = getInstrumentation(); 
     inst.waitForIdleSync(); 

     _calculator.runOnUiThread(new Runnable() { 
      @Override public void run() { 
       ScreenFrame screenFrame = (ScreenFrame) _calculator.findViewById(R.id.screenFrame); 
       assertNotNull(screenFrame); 
       AnswerSymbolGroup answer = screenFrame.getLastAnswer(); 
       INumber number = answer.getNumberAnswer(); 
       assertEquals(number.getValueInt(), 11); 
      } 
    }); 
     _calculator.finish(); 
    } 
} 

我剛纔給你看我是如何設置的一切行動和一個例子測試上述情況的代碼。所有測試用例都是相似的,測試的內容不是問題...主要問題是,當我通過eclipse運行測試時,測試只是無限期地掛在第一個測試用例實例上,(我試着將它留給一個而只是看,它只是坐在那裏與第一個案件的藍色箭頭45+分鐘)。非常奇怪的是,當我按下HOME按鈕或仿真器上的後退按鈕時,測試用例就會運行。它給出了適當的迴應。您沒有看到按下按鈕時應該看到的任何屏幕更改或其他內容,但測試用例按其應該運行。這意味着它通過,或取決於我測試的代碼失敗。然後測試運行者掛在下一個測試上,直到我再次按下後退或主頁按鈕。

這不是一個可行的解決方案。我想在一個測試文件中有十到二十個案例(有時更多),我希望它們都能成功運行,而不必按任何模擬器上的東西,特別是因爲我有一個Jenkins CI設置,用於所有其他我沒有問題的測試。

所以我認爲像這樣類型的測試robotium框架會更適合處理這些類型的測試。

我與robotium有同樣的問題。當我在仿真器上顯示主屏幕時運行robotium測試用例時,測試用例啓動,出現計算器屏幕,然後無限期掛起。當我按下後退按鈕,然後重新打開應用程序時,測試用例從頭開始並繼續按原樣工作,這意味着如果它正在測試的代碼是正確的,則通過測試,否則失敗。但是,您可以看到機器人箱的適當更改。例如,如果給定的測試被調整爲使用獨奏變量來點擊按鈕而沒有runOnUiThreads的東西,那麼在兩個按鈕被按下之後屏幕上會出現兩個,然後在輸入之後加上9,和11被按下。在下一個測試案例中,同樣的事情發生,它會不知不覺地掛起。當我點擊回家或回家時,然後重新打開應用程序,測試將繼續。每個測試用例我都要重複這個過程。我還沒有嘗試在我的詹金斯單元中運行這些測試,(仍在研究如何運行無頭機器人測試)。

我被困在這裏已經有好幾天了,覺得我不應該浪費更多的時間來解決它。有沒有其他人經歷過這種行爲。

我通常討厭使用調試器的原因,我覺得這是更爲費時然後編寫測試並記錄相應的輸出logcat中發現的錯誤。然而,我試圖在這種情況下運行調試器來找出掛起的東西。 我知道測試用例掛在getActivity()行上...我在調試器中的主要循環中循環。該的onCreate(),在onStart(),和的onResume() 方法完成,而整個屏幕是可見的,但一旦出現這種情況 它掛起,直到我打的後退按鈕或home鍵。

我真的想弄清楚爲什麼發生這種情況,並能夠在連續運行多個測試案例。

/**增加了前兩個答案來了**/ 於第一答案後,我已經試過把activity.finish()在拆解()方法,它沒有什麼區別...

對於第二個答案,我已經嘗試了將super.setUp()和super.tearDown()放置在測試setUp和tearDown()內的所有可能枚舉的枚舉,但不包括它們作爲選項之一。

我試圖通過調試getActivity()方法更徹底地運行,並且可以說,代碼卡在startActivitySync(意向意圖)方法的測試類。

上線391 getTargetContext()。startActivity(意向)是跑了,然後坐在上的同步鎖定的下一個部分......

getTargetContext().startActivity(intent); 

do{ 
    try{ 
     mSync.wait(); 
    } catch(InterruptedException e){ 
    } 
}while(mWaitingActivities.contains(aw)); 

return aw.activity; 
+0

視圖上的無限重複動畫可能會導致掛起而不是? – phriendtj

+0

我遇到同樣的問題。你有解決方案嗎? – ericyoung

回答

1

在你的拆卸方法,你需要調用_calculator 。完();

對於打開多個活動測試,robotium有一個方便的方法來完成所有他們的:solo.finishOpenedActivities();

+0

我沒有在我發佈的代碼中顯示,但我確實在tearDown()方法中調用了這些方法,並且在我的應用程序中只有一個活動。 – phriendtj

0

我不確定它是否會幫助你,但是你應該在setUp方法開始時調用super.setUp();,在tearDown方法結束時調用super.tearDown();。您也可以嘗試刪除它們。

通過調用setActivityInitialTouchMode(false);沒有意義的方式,因爲:

如果你不叫這個呢,觸摸模式將是錯誤的。如果您在活動啓動後致電 ,它將不起作用。

0

我也有類似的問題。我可以通過將方法放在AsyncTask類中來解決我的問題。

相關問題