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
Si vous avez la seule activité dans votre cas de test, vous pouvez faire:
Rule
.@Rule
public ActivityTestRule<TestActivity> mActivityTestRule = new ActivityTestRule<>(TestActivity.class);
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!
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();
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 .
Cette solution plus complète crée un espresso personnalisé ViewAction
et 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.