2015-05-10 12 views
13

W moim przypadku testowym muszę nagrywać przez 1 godzinę, w robotium solo.sleep (600000) wykonałem swoją pracę, ale w espresso jestem zdezorientowany z koncepcją IdlingResource. Muszę rozpocząć nagrywanie i czekać na jakiś czas (w zależności od rodzaju testów) 15 min, 60mins itpEspresso jak czekać przez pewien czas (1 godzina)?

równoważny kod w robotium

solo.clickOnView(solo.getView("start_record")); 
    solo.sleep(duration * 60 * 1000); 
    solo.clickOnView(solo.getView("stop_record")); 

Próbowałem używać go tak jak to w espresso

@RunWith(AndroidJUnit4.class) 
@SmallTest 
public class AaEspressoTest { 

private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.absd.rec.RecorderActivity"; 
private static Class<?> launcherActivityClass; 
private Solo solo; 
private static CoreRecordingTest skyroTestRunner; 


private static Class<? extends Activity> activityClass; 

static { 
    try { 
     activityClass = (Class<? extends Activity>) Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME); 
    } catch (ClassNotFoundException e) { 
     throw new RuntimeException(e); 
    } 
} 

@Rule 
public final ActivityTestRule<?> activityRule 
     = new ActivityTestRule<>(activityClass); 

private IntentServiceIdlingResource idlingResource; 

@Before 
public void registerIntentServiceIdlingResource() { 
    Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 
    idlingResource = new IntentServiceIdlingResource(instrumentation.getTargetContext()); 
    Espresso.registerIdlingResources(idlingResource); 
} 

@After 
public void unregisterIntentServiceIdlingResource() { 
    Espresso.unregisterIdlingResources(idlingResource); 
} 

@Test 
public void testHello() throws Exception { 

onView(withId(AaEspressoTest.getId("recorderpage_record"))).perform(click()); 

    registerIntentServiceIdlingResource(); 

    onView(withId(AaEspressoTest.getId("recorderpage_stop"))).perform(click()); 

    } 
} 

zasób biegu jałowym

public class IntentServiceIdlingResource implements IdlingResource { 
private final Context context; 
private ResourceCallback resourceCallback; 
public static boolean status = false; 

public IntentServiceIdlingResource(Context context) { 
    this.context = context; 
} 

@Override 
public String getName() { 
    return IntentServiceIdlingResource.class.getName(); 
} 

@Override 
public boolean isIdleNow() { 
    return getTimer(); 
} 

@Override 
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { 
    this.resourceCallback = resourceCallback; 

} 

private static boolean getTimer() { 

    new CountDownTimer(5000, 1000) { 
     @Override 
     public void onTick(long millisUntilFinished) { 
      // Do Nothing 
      status = false; 
     } 

     @Override 
     public void onFinish() {    
      status = true; 
     } 
    }; 
    return status; 
} 
} 

Wyjątek:

android.support.test.espresso.IdlingResourceTimeoutException: Wait for [com.adbs.recorder.IntentServiceIdlingResource] to become idle timed out 

Odpowiedz

32

Państwo potrzebować IdlingResource z isIdleNow() zwracającej true tylko wtedy, gdy określona ilość czasu minęło. Aby to osiągnąć, zaoszczędzić czas rozpoczęcia i porównać go z obecnym czasie:

public class ElapsedTimeIdlingResource implements IdlingResource { 
    private final long startTime; 
    private final long waitingTime; 
    private ResourceCallback resourceCallback; 

    public ElapsedTimeIdlingResource(long waitingTime) { 
    this.startTime = System.currentTimeMillis(); 
    this.waitingTime = waitingTime; 
    } 

    @Override 
    public String getName() { 
    return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime; 
    } 

    @Override 
    public boolean isIdleNow() { 
    long elapsed = System.currentTimeMillis() - startTime; 
    boolean idle = (elapsed >= waitingTime); 
    if (idle) { 
     resourceCallback.onTransitionToIdle(); 
    } 
    return idle; 
    } 

    @Override 
    public void registerIdleTransitionCallback(
     ResourceCallback resourceCallback) { 
    this.resourceCallback = resourceCallback; 
    } 
} 

Tworzenie i zarejestrować ten zasób jałowego w teście:

@Test 
public static void waitForOneHour() { 
    long waitingTime = DateUtils.HOUR_IN_MILLIS; 

    // Start 
    onView(withId(AaEspressoTest.getId("recorderpage_record"))) 
     .perform(click()); 

    // Make sure Espresso does not time out 
    IdlingPolicies.setMasterPolicyTimeout(
     waitingTime * 2, TimeUnit.MILLISECONDS); 
    IdlingPolicies.setIdlingResourceTimeout(
     waitingTime * 2, TimeUnit.MILLISECONDS); 

    // Now we wait 
    IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime); 
    Espresso.registerIdlingResources(idlingResource); 

    // Stop 
    onView(withId(AaEspressoTest.getId("recorderpage_stop"))) 
     .perform(click()); 

    // Clean up 
    Espresso.unregisterIdlingResources(idlingResource); 
} 

Musisz się setMasterPolicyTimeout i setIdlingResourceTimeout połączeń, aby upewnić Espresso nie kończy testu z powodu upływu czasu.

Pełny przykład: https://github.com/chiuki/espresso-samples/tree/master/idling-resource-elapsed-time

+1

To podejście nie działa, jeśli mam więcej niż jedną metodę testową i muszę pozostawać bezczynne na końcu każdej metody dla dzika. Używam Espresso 2.x. –

+0

co to jest użycie 'registerIdleTransitionCallback' tej metody i jak z niej korzystać? –

12

Domyślny limit czasu, w którym espresso będzie czekać na bezczynność wszystkich zarejestrowanych zasobów, wynosi jedną minutę.

Można to zmienić za pomocą klasy IdlingPolicies dawać wyraźny timeout:

IdlingPolicies.setIdlingResourceTimeout(1, TimeUnit.HOURS); 
+0

mogą również potrzebować 'IdlingPolicies.setMasterPolicyTimeout (1, TimeUnit.HOURS);' 'AppNotIdleException' zapobiec. – Travis

Powiązane problemy