web-dev-qa-db-de.com

Espresso wie lange warten (1 stunde)?

In meinem Testfall muss ich 1 Stunde aufzeichnen, in Robotium Solo.Sleep (600000) hatte ich meine Arbeit erledigt, aber in Espresso bin ich mit dem IdlingResource-Konzept verwechselt. Ich muss mit der Aufnahme beginnen und einige Zeit warten (abhängig von der Art des Tests), 15 Minuten, 60 Minuten usw.

Entsprechender Code in Robotium

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

Ich habe versucht, es so in Espresso zu verwenden

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

   }
}

Leerlaufressource

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

Ausnahme:

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

Sie benötigen eine IdlingResource mit einer isIdleNow(), die true nur zurückgibt, wenn die bestimmte Zeit verstrichen ist. Um dies zu erreichen, speichern Sie die Startzeit und vergleichen Sie sie mit der aktuellen Uhrzeit:

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

Erstellen und registrieren Sie diese Leerlaufressource in Ihrem 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);
}

Sie benötigen die Aufrufe setMasterPolicyTimeout und setIdlingResourceTimeout, um sicherzustellen, dass Espresso den Test nicht wegen Zeitüberschreitung beendet.

Vollständiges Beispiel: https://github.com/chiuki/espresso-samples/tree/master/idling-resource-elapsed-time

34
chiuki

Das Standard-Timeout, nach dem Espresso wartet, bis alle registrierten Ressourcen inaktiv sind, beträgt eine Minute.

Sie können dies mit der IdlingPolicies -Klasse ändern, um ein explizites Timeout festzulegen:

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

Ich teste mein Projekt. Es funktioniert. Einfach einrichten, bevor Ressourcen für den Leerlauf registriert werden. Bitte überprüfen Sie:

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

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

1
Norman