2015-01-26 3 views
11

"다운로드"버튼을 클릭하면 데이터 (음악/이미지 등)가 인터넷에서 다운로드되기 시작합니다. 다운로드가 끝나면 단추가 레이블 텍스트를 "열기"로 변경합니다. 그런 다음 "열기"버튼을 클릭하십시오. 내가 한 일은 다음과 같습니다.Espresso Idling Resource 사용 방법

onView(allOf(withId(R.id.button),withText("Download"))).check(matches(isClickable())).perform(click()); 
try { 
    Thread.sleep(delayedTime); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
onView(allOf(withId(R.id.button),withText("Open"))).check(matches(isClickable())).perform(click()); 

때로는 테스트가 통과하고, 때로는 그렇지 않습니다. 가끔 실패하는 이유는 "No views in hierarchy found matching: (with id: something:id/button and with text: is "Open"). 입니다. 그리고 Espresso에서 Thread.sleep을 사용하는 것도 나쁜 습관입니다. 나는 Espresso's Idling Resource에 대해 읽었지만 나에게 의미가 없으며이 특별한 경우에 어떻게 적용 할 수 있는지 모른다.

+0

ThreadPools의 경우 다음을 사용하십시오. http://luongbui.com/thread-pool-idlingresource-for-espresso/ IdlingResource를 사용하는 방법을 보여주기 위해 전체 예제를 넣었습니다. 등록하고 등록을 취소하십시오. 테스트 코드. 프로덕션 코드에서 사용하고있는 ThreadPool의 인스턴스가 필요합니다. 공장 패턴 또는 대거를 적극 권장합니다. – luong

답변

28

실제로 유휴 리소스는 에스프레소의 가장 어려운 점입니다.

테스트에서 비동기 백그라운드 작업을 기다리거나 동기화해야하는 경우 구현해야합니다. 기본적으로 Espresso는 처리 할 현재 메시지 대기열의 UI 작업을 기다리고 다음 AsyncTasks (기본 AsyncTask 스레드 풀과 동기화 됨)가 완료되어 다음 테스트 작업으로 넘어갑니다. 이것으로 AsyncTasks을 찾으십시오. 그러나 다른 웹 서비스와 통신하는 예를 들어 다른 스레드를 시작하면 IdlingResource를 사용해야합니다.

필요한 Thread.sleep은 유휴 리소스가 필요할 수 있다는 신호입니다.

이제는 유휴 리소스를 작성하는 방법에 대해 설명합니다. 코드의 개발자가 쉽게 평가할 수 있기 때문에 코드 개발자가 쉽게 수행 할 수 있습니다.

이 같은 있어야하는데 .....

에스프레소를 말하고 싶었다 테스트,이 자원이 유휴 또는없는 경우 정의하도록되어

public class DownloadIdlingResource extends BaseIdlingResource { ....} 

그 테스트 클래스 초기화 중에이 유휴 리소스 (setUp() 등)를 정의하거나 필요할 때이를 활성화해야하는이 유휴 리소스를 기다려야합니다. 그것은 기다려야 할 것이 있지만 아직 활성화되어 있지 않다는 것을 의미합니다. 예를 들어 다운로드 리소스의 유휴 리소스에는 다운로드가 시작될 때 유휴 리소스를 비 유휴 (setIdle(false))로 설정하는 수신기가있을 수 있으며 완료되면 유휴 상태로 다시 설정됩니다 (setIdle(true)). 공회전중인 모든 자원이 유휴 상태 인 경우 에스프레소는 다른 모든 직원을 계속 대기시키고 있습니다. 리소스를 유휴 상태로 구현하는 방법은 응용 프로그램 구현에 따라 크게 달라집니다.

일반적으로 자원을 공회전에 대해 말할 수있다 무엇

: 리소스가 유휴 상태 일 때

1) isIdleNow()는 로직을 구현

이 자원이 등록되어 당신에게 줄 것이다 때 registerIdleTransitionCallback는 에스프레소에 의해 호출됩니다) a ResourceCallback.

3) 자원이 유휴 상태로 바쁜에서 간다, 실제로는 작업이 (지도 데이터를 다운로드 한 또는 다운로드가 취소되었습니다) 당신이 등록 ResourceCallbackcallonTransitionToIdle()에있는 완료하여 백그라운드 작업에서 콜백을 얻는다.

4) getName()에서 로깅에 사용되는 리소스의 이름을 반환해야합니다.

아이들링 리소스와 같은 교착 상태가 발생하지 않도록주의하십시오. 유휴 리소스에 대한 시간 초과가 있습니다. 테스트는 유휴 리소스에 무엇이 나쁜지 설명하는 메시지에 의해 중단 될 수 있습니다.

더 구체적인 예를 쓸 수 없지만 실제로는 응용 프로그램 구현에 따라 다릅니다.