web-dev-qa-db-fra.com

Espresso comment attendre un peu de temps (1 heure)?

Dans mon cas de test je dois enregistrer pendant 1 heure, dans robotium solo.sleep (600000) avait fait mon travail, mais dans espresso je suis confondu avec le concept IdlingResource. Je dois commencer à enregistrer et attendre un certain temps (selon le type de test): 15 minutes, 60 minutes, etc.

Code équivalent dans robotium

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

J'ai essayé de l'utiliser comme ça dans un 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());

   }
}

Ressource de ralenti

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;
}
}

Exception:

Android.support.test.espresso.IdlingResourceTimeoutException: Wait for [com.adbs.recorder.IntentServiceIdlingResource] to become idle timed out
15
Shivaraj Patil

Vous avez besoin d'une IdlingResource avec une isIdleNow() qui retourne true uniquement si le laps de temps spécifique s'est écoulé. Pour ce faire, enregistrez l'heure de début et comparez-la avec l'heure actuelle:

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;
  }
}

Créez et enregistrez cette ressource inactive dans votre test:

@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);
}

Vous avez besoin des appels setMasterPolicyTimeout et setIdlingResourceTimeout pour vous assurer que Espresso ne met pas fin au test en raison du délai d'attente.

Exemple complet: https://github.com/chiuki/espresso-samples/tree/master/idling-resource-elapsed-time

34
chiuki

Le délai d'attente par défaut qu'Espresso attendra que toutes les ressources enregistrées deviennent inactives est d'une minute.

Vous pouvez changer cela en utilisant IdlingPolicies class pour définir un délai d'attente explicite:

IdlingPolicies.setIdlingResourceTimeout(1, TimeUnit.HOURS);
14
ataulm
@Before
public void registerIdlingResource() {
    IdlingPolicies.setMasterPolicyTimeout(60 * 1000 * 3, TimeUnit.MILLISECONDS);
    IdlingPolicies.setIdlingResourceTimeout(60 * 1000 * 3, TimeUnit.MILLISECONDS);
    mIdlingResource = BooleanIdlingResource.getIdlingResource();
    // To prove that the test fails, omit this call:
    IdlingRegistry.getInstance().register(mIdlingResource);
}

Je teste mon projet, cela fonctionne . Il suffit de configurer avant d’enregistrer les ressources inactives . Veuillez vérifier:

https://github.com/googlesamples/Android-testing/tree/master/ui/espresso/IdlingResourceSample et.

https://developer.Android.com/reference/Android/support/test/espresso/IdlingPolicies

1
Norman