2012-11-12 3 views
2

여기서 확실한 것을 놓치고 있어야합니다.Android 앱 계측 테스트

기기에서 계측 테스트 케이스를 실행 중이며 Robotium도 도움을줍니다. 어떤 시점에서 테스트중인 내 응용 프로그램은 기본 전자 메일 작성 활동을 시작합니다.

내가 알고 싶은 것은 : 어떻게하면 내 활동을 다시 보여주기 위해 그 활동을 닫을 수 있는가? 그 이유 중 하나는 이상이어야합니다. 하나의 이유로 인해이 필요합니다. 현재 테스트 사례가 완료된 후 전자 메일 활동이 포 그라운드로 유지되고 다음 테스트 사례가 제대로 실행되지 않습니다.

이메일 활동에 필요한 뒤로 키를 보내려고했는데 - this.sendKeys(KeyEvent.KEYCODE_BACK) 또는 solo.goBack() - 행운이 없습니다.

내가 실행하는 경우 solo.getCurrentActivity() 또는 this.getActivity() 나는 패키지 내의 활동에 대한 참조하지만, 실제 전경 활동의 보류를 얻을 수있는 방법을 얻을. 또한 언급 된 sendKeys/goBack은 이메일 활동이 아니라 내 활동으로 직접 이동합니다.

내 앱이 Play 스토어의 주요 활동을 시작하면 동일한 문제가 발생합니다.
전자 메일 활동이 테스트중인 패키지의 일부가 아니라는 것을 알고 있으며, 이는 문제의 일부일 수 있습니다.

이메일 활동을 종료 할 수있는 방법이 있습니까?

지금은 @Joe 마린 처음 제안을 고수하고있어 정보 편집
: 내 뷰 모델 (또는 컨트롤러)에서

private static boolean _productionMode = true; 이 일부 내부 도우미의 경우 더 나은 (일부 도우미 방법을

public void dontLaunchExternalApps() 
{ 
    _productionMode = false; 
} 

그런 다음 몇 가지의 ViewModel 일반적인 방법 :

if (_productionMode) 
{ 
    launchSomeExternalApp(); 
} 
else 
{ 
    // Do Nothing Or Set Some Internal Flag 
} 
클래스) 테스트 중에 만 사용

답변

1

좋은 방법이 없습니다. 안드로이드 계측 프레임 워크는 실제로 안드로이드 구성 요소를 단위 테스트하기위한 것입니다. 일단 컨트롤이 구성 요소를 벗어나면 다른 프레임 워크가 대신해야합니다.

아마도 실제 활동 대신 스텁 이메일 인 텐트를 보내도록 활동을 알리는 확장 된 데이터로 초기 활동을 시작할 수 있습니다. 진짜 문제는 전자 메일 활동을 닫지 않는 것입니다. 을 조롱하면이되므로 다시 돌아 오기를 기대할 수 있습니다. 안타깝게도 Android 구성 요소에서는 조롱이 지원되지 않습니다. 주위에 주위에 POJO 하위 클래스에 대한 대부분의 작업을 위임하고 그들을 조롱하는 것입니다.

+0

감사 : 여기

은 예입니다. 저는 이미 단위 테스트 구성 요소, TDD-ing 및 통합/기능 테스트를 실행하고 있습니다. 내가 말하고있는 테스트는 실제로 기능 테스트입니다. 첫 번째 제안은 기본적으로 활동이 테스트 모드에서 실행 중임을 감지하여 전자 메일 작성기를 실제로 시작하지 않고 외부에서 테스트 가능한 다른 작업을 수행하도록하는 것임을 이해합니다. 그것은 방법일지도 모른다 ... – superjos

1

테스트에서 의도 필터를 작성하여 올바른 의도가 실행되었는지 확인한 다음 결과를 다시 처리하거나 테스트 용 앱을 만들 수 있습니다 (예 : 전자 메일 인 텐트를 처리하고이를 시스템 기본값으로 설정하는 응용 프로그램 인 경우,이 응용 프로그램은 실제로 GUI가 없어도 자동으로 원하는 결과 (하드 코드 된 파일 또는 사용자가 읽을 수있는 파일 또는 인 텐트의 추가 정보도 포함)를 반환합니다 .당신이 대답을

//set up the filter 
final Instrumentation inst = getInstrumentation(); 
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_VIEW); 
intentFilter.addDataScheme("http"); 
intentFilter.addCategory(Intent.CATEGORY_BROWSABLE); 

//Set up the monitor 
//THE BOOLEAN ON THE END TELLS THE SYTEM TO BLOCK IT FROM OCCURING, you probably want true here 
ActivityMonitor monitor = inst.addMonitor(intentFilter, null, true); 

assertEquals(0,monitor.getHits()); 

//click the link here with whatever framework you are using 
solo. clickOnText("link text") 

//Wait for the activity to get hit 
monitor.waitForActivityWithTimeout(2000); 

//Here is where you actually check it happened 
assertEquals(1, monitor.getHits()); 
inst.removeMonitor(monitor); 
+0

고마워. 내 경우에는 외부 애플 리케이션/활동에서 어떤 결과를 다시 찾고 있지 않다. 테스트 용도로만 전체 앱을 만들어야합니다. (나에게는 이미 테스트 용으로 3 개의 프로젝트가 있습니다 : Unit, Integration, Functional). 또한 수동으로이 앱을 기본 이메일로 설정하지 않아도됩니다. 나는 가능한 한 자동화 된 테스트 환경을 유지하는 것을 선호한다. – superjos

+0

아무 것도 원하지 않는다면 인스 트루먼 테이션 테스트에 인 텐트 필터를 만들어야합니다. 6 줄의 코드와 같아서 실제 응용 프로그램에 많은 쓸모없는 코드를 넣지 않아도됩니다. –

+0

uhm. 하지만 그때 수동으로 장치에 가서 전자 메일 인 텐트의 기본 "처리기"로 해당 계측기 응용 프로그램을 설정해야합니다. 그렇지 않으면 팝업이 테스트 중에 나올 것 같아요. 전자 메일 앱을 열 것인지 아니면 내 전자 메일을 열 것인지 묻습니다. 계측 애플 리케이션. 맞습니까? – superjos