3 votes

Espresso 2 - Comment tester des activités multiples ?

J'ai vu quelques questions à ce sujet.

eg. Flux d'applications de test Android Espresso

Mais la réponse ci-dessus ne fonctionne pas dans espresso 2. Voici mon extrait de texte

@Rule
public ActivityTestRule<SplashActivity> mActivityTestRule = new ActivityTestRule<>(SplashActivity.class);

@Test
public void splashActivityTest() {
    onView(withId(R.id.splash_container)).perform(swipeLeft());
    onView(withId(R.id.splash_container)).perform(swipeLeft());

    // launch the main activity
    ViewInteraction appCompatButton = onView(
            allOf(withId(R.id.introduction_goto_btn), withText("goToMainActivity"), isDisplayed()));
    appCompatButton.perform(click());

    // the hierarchy can't find HomeBtn , it still hold the Splash's View, so the code below will fail
    onView(withId(R.id.home_btn)).check(ViewAssertions.matches(isDisplayed()));
}

Si le test multi-activités n'est pas autorisé dans un TestFile, alors comment créer un flux pour tester plusieurs activités ?

1voto

Feroz Baig Points 11

Oui, c'est possible. Dans l'un des échantillons, ils en ont fait la démonstration ici. https://github.com/googlesamples/Android-testing/blob/master/ui/espresso/BasicSample/app/src/androidTest/java/com/example/Android/testing/espresso/BasicSample/ChangeTextBehaviorTest.java

@Test
public void changeText_newActivity() {
// Type text and then press the button.

onView(withId(R.id.editTextUserInput)).perform (typeText(STRING_TO_BE_TYPED),
        closeSoftKeyboard());
onView(withId(R.id.activityChangeTextBtn)).perform(click());

// This view is in a different Activity, no need to tell Espresso.
onView(withId(R.id.show_text_view)).check(matches(withText(STRING_TO_BE_TYPED)));
}

1voto

MaxF Points 972

J'ai le même problème. Espresso n'attend pas l'exécution d'une nouvelle activité, même si j'ai utilisé un idling. J'ai donc été obligé de définir des délais avant de vérifier les vues sur les nouvelles activités.

Créer une interface :

/**
* Interface for expectations of compliance with the conditions.
*/
public interface Condition {
 /**
  * @return text description for log output when check failed.
 */
 String getDescription();

 /**
  * @return true if the condition is met.
  */
 boolean check();
}

Et utilise-le comme ça :

/**
* Wait while condition come true or timeout limit.
*
* @param condition condition for exit
* @param timeout   limit in seconds
* @throws Exception exception
*/
public static void waitForCondition(Condition condition, int timeout) throws Exception {
final int CONDITION_NOT_MET = 0;
final int CONDITION_MET = 1;
final int TIMEOUT = 2;

final int INTERVAL = 250;

int status = CONDITION_NOT_MET;
int elapsedTime = 0;

do {
  if (condition.check()) {
    status = CONDITION_MET;
  } else {
    elapsedTime += INTERVAL;
    delay(INTERVAL);
  }

  if (elapsedTime >= timeout * 1000) {
    status = TIMEOUT;
    break;
  }
} while (status != CONDITION_MET);

if (status == TIMEOUT) {
  String msg = condition.getDescription() + " - took more than " + timeout + " seconds. Test stopped.";
  log(msg);
  throw new Exception(msg);
 }
}

Ejemplo:

public class MovieScreenVisible implements Condition {
  @Override
  public String getDescription() {
    return "Movie screen should be on the top";
  }

  @Override
  public boolean check() {
    Activity activity = TestBase.getCurrentActivity();
    if (activity == null || !(activity instanceof MovieActivity)) {
      return false;
    }

    ViewGroup layout = activity.findViewById(R.id.movie_fragment);
    return layout != null && layout.getVisibility() == View.VISIBLE;
  }
}

// wait maximum 30 seconds until movie screen should be visible
waitForCondition(new MovieScreenVisible(), 30);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X