web-dev-qa-db-fra.com

Comment faire pivoter les activités, je veux dire: l'orientation de l'écran change avec Espresso?

J'ai décidé que l'un des critères de test pour mes tests d'applications avec Google Expresso était:

Le test doit maintenir l'état d'activité après la rotation d'orientation de l'écran

Comment faire pivoter l'écran lorsque j'utilise Espresso?


J'ai essayé le code Robotium suivant (oui, j'ai placé le code Robotium dans mon test Espresso, alors poursuivez-moi en justice)

solo.setActivityOrientation(solo.LANDSCAPE);
solo.setActivityOrientation(solo.PORTRAIT);

mais l'application se bloque lorsque je l'exécute dans le cadre de mon test Espresso.
Y a-t-il un moyen de faire ça?

Merci d'avance pour votre aide

20
FalconBot

Si vous avez la seule activité dans votre cas de test, vous pouvez faire:

1. Déclarez que vous testez Rule.

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

2. Obtenez Activity et appliquez une rotation d'écran.

mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

C'est un morceau de tarte!

14
Slava

Vous pouvez le faire avec la bibliothèque uiautomator

dependencies {
  androidTestImplementation 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.3'
}

ui automator requiert la version 18 de sdk min. Si votre application possède un sdk minimal, vous devez créer un nouveau AndroidManifest.xml dans le dossier androidTest

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:tools="http://schemas.Android.com/tools"
    package="your.package.name">
    <uses-sdk tools:overrideLibrary="Android.support.test.uiautomator.v18"/>
</manifest>

et puis dans votre test

UiDevice device = UiDevice.getInstance(getInstrumentation());

device.setOrientationLeft();
device.setOrientationNatural();
device.setOrientationRight();
9
lelloman

Comment faire pivoter l'écran:

public static void rotateScreen(Activity activity) {
    final CountDownLatch countDownLatch = new CountDownLatch(1);
    final int orientation = InstrumentationRegistry.getTargetContext()
            .getResources()
            .getConfiguration()
            .orientation;
    final int newOrientation = (orientation == Configuration.ORIENTATION_PORTRAIT) ?
            ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE :
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

    activity.setRequestedOrientation(newOrientation);

    getInstrumentation().waitForIdle(new Runnable() {
        @Override
        public void run() {
            countDownLatch.countDown();
        }
    });

    try {
        countDownLatch.await();
    } catch (InterruptedException e) {
        throw new RuntimeException("Screen rotation failed", e);
    }
}

La Activity peut être obtenue à partir de ActivityRule

3
aha

Cette solution plus complète crée un espresso personnalisé ViewActionet fonctionne bien. Il montre comment obtenir la Activity (même s'il s'agit d'une AppCompatActivity) avant d'appeler sa méthode setRequestedOrientation(). Il a également une interface propre appelant:

onView(isRoot()).perform(orientationLandscape()); 
onView(isRoot()).perform(orientationPortrait());

Je suis chaque changement d’orientation avec un délai de 100 ms, même si vous n’en avez peut-être pas besoin.

2
barnabas