2016-03-04 49 views
0

我正在測試包含多項活動的應用程序的快樂路徑。爲了簡單起見,假設我有三項活動。如何在進行網絡操作之前​​問Espresso運行UI測試?

  1. 沒有在第一個活動一個按鈕,我可以點擊它(通過咖啡)
  2. 秒活動是基於什麼數據的第一項活動,並通過向服務器發送一個請求創建的預訂對象。如果服務器返回成功則顯示第三個活動。
  3. 顯示第三個活動,讓用戶現在預訂成功。

我的問題是在第二個步驟:

{ 
... 
// first activity 
onView(withId(R.id.btnBooking)).perform(click()); 

// second activity 
secondActivity_checkInitialViewsState(); 

// third activity 
thirdActivity_checkInitialViewsState(); 

} 

private void secondActivity_checkInitialViewsState() 
{ 
    // viewsMustBeVisible 
    onView(withId(R.id.title)).check(matches(isCompletelyDisplayed())); // <= Error 
    onView(withId(R.id.sonarView)).check(matches(isCompletelyDisplayed()));   
    onView(withId(R.id.cancelBooking)).check(matches(isCompletelyDisplayed()));   
    onView(withId(R.id.listView)).check(matches(isDisplayed())); 

    // viewsMustBeEnabled 
    onView(withId(R.id.tvNoServiceFound)).check(matches(not(isCompletelyDisplayed())));   
    onView(withId(R.id.tvNextSearch)).check(matches(not(isCompletelyDisplayed()))); 
} 

我越來越運行測試後,下面我的日誌錯誤:

android.support.test.espresso.NoMatchingViewException:在 層次結構中找不到匹配的視圖:with id:com.my.package:id/title如果 目標視圖不是視圖層次結構的一部分,則可能需要使用 Espresso.onData從其中一個fol降低 AdapterViews:com.google.maps.api.android.lib6.e.n {291fbd0f G.ED..C。 ......我。 0,0-0,0}

背後的原因是(我認爲至少)咖啡框架等待在當前消息隊列UI事件處理和默認AsyncTasks完成它移動到下一個前測試操作並且不使用任何時間同步。因此,一旦我的後端發送sucess,應用程序將顯示第三個屏幕,而Espresso嘗試運行secondActivity_checkInitialViewsState()並顯示錯誤。

所以我的問題是,有沒有什麼辦法可以讓Espresso先運行這個方法(即使在不同的線程中)。

回答

0

意式濃縮咖啡並不是真正意義上的跨活動測試,它意味着要單獨測試一個活動,否則最終會出現片狀測試。這就是Google爲我們創造了ActivityTestRule的原因。你的「幸福路」測試應該真正三種不同的咖啡測試類:

第一個測試應該測試按下按鈕啓動的第二個活動,用濃咖啡意圖:

intended(hasComponent(new ComponentName(getTargetContext(), SecondActivity.class)));

第二次測試應該測試你的步驟2.你可以模擬發送到活動的意圖數據。同樣,您應該檢查第三個活動是否已啓動。

最後的測試應該測試你的第3步。

+0

感謝您的觀點@trevor。我實際上是按照你所建議的方式開始的,但是它有很多困難,包括冗餘代碼,比如每個活動都有'intended',每個活動都有依賴注入等。所以我決定模擬用戶在應用中做什麼。通過這種方式,我創建並完全按照用戶的操作方式進行對象並在活動中傳遞此對象,並在每個屏幕中檢查預訂對象的狀態。這有助於我們輕鬆找到錯誤,儘管您建議的方式有其自身的優勢。 – Hesam

相關問題