2014-02-11 8 views
6

에스프레소를 사용하여 계측 테스트에 문제가 있습니다. 앱을 시작할 때 계정 선택 도구가 팝업되는 활동이 있습니다 (주요 활동). 고객이 대화 상자에서 취소를 클릭하면 피커가 다시 팝업됩니다. 사용자가 추가를 클릭하면 활동 결과에서 결과가 선택됩니다.Android 에스프레소 및 계정 선택 도구

나는 그 피커를 포함 할 간단한 에스프레소를 만드는 방법을 모른다. 나는 MainActivity로 계측 테스트를 만들 때, 나는이 메시지를 받았습니다 : 단계에서 어떤 활동

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity>{ 
    MainActivity myActivity; 
    public MainActivityTest(){ 
     super(MainActivity.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     getActivity(); 
    } 

    public void testAccountPicker(){ 
     onView(withText("Choose an account")).check(matches(isDisplayed())); 
    } 
} 

은 아무도 비슷한 문제를 겪고 있습니까 ...으로 다시 시작?

고맙습니다.

+0

액티비티 라이프 사이클 메소드를 게시 할 수 있습니까? – Bolhoso

+0

Bolhoso, onCreate 메소드에서 이것을 가지고있는 것 : 'Intent googlePicker = AccountPicker.newChooseAccountIntent (null, null, new String [] {GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null); startActivityForResult (googlePicker, Utils.PICK_ACCOUNT_REQUEST); ' 계정을 선택한 논리입니다. 다른 라이프 사이클 방법은 변경되지 않습니다. –

답변

1

"계좌 선택기"에 대한 루트보기에서 작업해야합니다. 사용해보기 :

public void testAccountPicker(){ 
    onView(withText("Choose an account")) 
     .inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView())))) 
     .check(matches(isDisplayed())); 
} 
+0

안녕 Denys, 아직 오류 메시지가 있습니다 : "무대에서 활동이 재개되지 않았습니다. 활동을 시작하는 것을 잊었습니까? (test.getActivity() 또는 유사)?" –

+0

좋아요, 앱 내에 사용자 계정 선택 도구가 없지만 Google 계정 선택 도구가 맞습니까? 이 경우 나는 당신이 앱 밖에있을 때 그것을 처리 할 수 ​​없다고 생각한다. 이 질문은 android-test-kit-discuss Google 그룹 (https://groups.google.com/forum/#!forum/android-test-kit-discuss)에서 확인하십시오. – denys

+0

네, 맞습니다. Google 계정 선택기를 사용하지만 내 계정은 사용하지 않습니다. 응답을위한 고맙습니다. –

2

그건 힘든 것이군요. :). 여기서 문제는 응용 프로그램을 떠날 때 (Google 계정 선택 도구가 외부 응용 프로그램 인 경우) 에스프레소가 테스트를 종료한다는 것입니다. 계정 선택 도구는 외부 com.google.android.gms 패키지의 활동입니다. 일단 시작되면 테스트가 끝나고 대화 상자에서 아무 것도 찾을 수 없습니다.

당신은 가능한 테스트를 만드는 세 가지 가능한 솔루션이 있습니다

  • 를 가짜 의도로 응용 프로그램에서 클래스 경로 대체 사용을; 또는
  • 앱을 "테스트 가능성"고정; 또는
  • 내가 클래스 경로 대체를 사용하는 방법을 보여 드리겠습니다 Dagger

같은 의존성 주입을 사용. 이 기술은 정말 간단합니다 : Intent 생성을 별도의 클래스 (예 : IntentsFactory)로 분리하고 테스트 중에 해당 클래스를 재정의해야합니다.

이 공장 com.yourapp.factories.IntentsFactory에 말과이 같은 것입니다 :

public class IntentsFactory { 
    public static Intent getAccountPickerIntent (Context context) { 
     return AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null); 
    } 
} 

당신은 테스트 응용 프로그램에 생성해야합니다 같은 이름 및 방법 패키지 (가 com.yourapp.tests라고),하지만 그건를 반환 다른 의도하는 조롱/하나의 더미 :

public class IntentsFactory { 
    public static Intent getAccountPickerIntent (Context context) { 
     return new Intent(context, MyDummyAccountPickerActivity.class); 
    } 
} 

당신의 테스트를 실행 할 때마다, 그들은, 즉, 클래스 경로에 테스트에서 IntentsFactory을 "가장 가까운"클래스를 사용합니다. 흐름을 다른 앱에 보내는 의도를 반환하는 대신 흐름이 프로젝트의 클래스로 이동하고 에스프레소는 테스트를 종료하지 않습니다.

여기서 유일한주의 사항은 MyDummyAccountPickerActivity을 만들어야하며 프레임 워크 클래스에서 반환 한 결과와 비슷한 Bundle을 반환해야한다는 것입니다.정상적으로 활동은 앱의 매니페스트에 존재 당신은 클래스 경로는 다음과 같은 명령 줄 대체 (이 thisthis 링크를 체크 아웃)를 허용하도록 에뮬레이터 달빅 런타임을 지시해야합니다 :

adb shell setprop dalvik.vm.dexopt-flags v=n,o=v 
adb shell stop installd 
adb shell start installd 

및 실행 너의 검사들.

나는 카메라를 테스트하기 위해 비슷한 문제가 있었다 그것은 철저하게 in Espresso forum을 논의 것

+1

항상 '어제 끝내야 할 것'처럼 잠깐 멈춰서 테스트를 떠났습니다. 그러나 나는 당신이 제안하는 것을 이해하고 그것을 확실히 시도 할 것입니다. 답장을 늦게 보내서 미안해. 고맙습니다. –

0

https://google.github.io/android-testing-support-library/docs/espresso/intents/

당신은 텐트를 확인할 수 있습니다 에스프레소 텐트를 사용하여이 테스트에 대해 갈 당신이 할 수있는 몇 가지 방법이 있습니다() 구문을 사용하여 계정 선택 도구를 열도록 보내졌습니다. intending(). respondWith() 구문을 사용하여 피커의 반환 된 결과로 활동의 동작을 확인할 수도 있습니다. 당신이 정말로 직접 선택 도구와 상호 작용하려면

, 당신은 UIAutomator API를 사용 할 수 있습니다 : https://developer.android.com/topic/libraries/testing-support-library/index.html#UIAutomator

UIAutomator는 에스프레소 시험의 내부에 사용할 수 있습니다.