GoogleのEspressoを使用したアプリケーションテストのテスト基準の1つは次のとおりであると判断しました。
テストでは、画面の向きを回転した後もアクティビティの状態を維持する必要があります
Espressoを使用しているときに画面を回転させる方法を教えてください。
次のRobotiumコードを試しました(はい、EspressoテストにRobotiumコードを挿入したので、私を訴えます)
solo.setActivityOrientation(solo.LANDSCAPE);
solo.setActivityOrientation(solo.PORTRAIT);
espressoテスト内で実行すると、アプリケーションがクラッシュします。
これを行う方法はありますか?
助けてくれてありがとう
テストケースにアクティビティが1つしかない場合、次のことができます。
Rule
のテストを宣言します。@Rule
public ActivityTestRule<TestActivity> mActivityTestRule = new ActivityTestRule<>(TestActivity.class);
Activity
を取得し、画面回転を適用します。mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
それはパイです!
あなたはuiautomatorライブラリでそれを行うことができます
dependencies {
androidTestImplementation 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.3'
}
uIオートマトンには最小SDKバージョン18が必要なので、アプリの最小SDKが低い場合は、androidTest
フォルダーに新しいAndroidManifest.xml
を作成する必要があります
<?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>
そしてあなたのテストで
UiDevice device = UiDevice.getInstance(getInstrumentation());
device.setOrientationLeft();
device.setOrientationNatural();
device.setOrientationRight();
これは より完全なソリューション でカスタムEspresso ViewAction
を作成し、うまく機能します。 setRequestedOrientation()
メソッドを呼び出す前に、Activity
を取得する方法を示します(AppCompatActivity
の場合でも)。また、クリーンな呼び出し元インターフェイスがあります。
onView(isRoot()).perform(orientationLandscape());
onView(isRoot()).perform(orientationPortrait());
あなたはそれを必要としないかもしれませんが、私は100ミリ秒の遅延でそれぞれの向きの変化に従います。
画面を回転させる方法:
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);
}
}
Activity
は ActivityRule から取得できます。
RobotiumテストとEspressoテストを混在させることはできません。時々問題を解決する最良の方法は、希望するが互換性のない方法のソースコードをチェックすることです。
私はあなたがすでにsetUp()
メソッドを持っていると確信しています。
myActivity = this.getActivity();
これを使用して、画面の向きの変更を変更します。
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
または
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
ローテーションが非同期で実行されるため、ローテーションの終了を待機するためにmyActivity.getInstrumentation().waitForIdleSync();
またはThread.sleep(milliseconds);
を使用する必要がある場合もあります。 2番目の方法はエミュレーター/デバイスに依存するため、慎重に選択してください。
お役に立てば幸いです。
オリエンテーションのテストに関する私自身のトラブルの後で、それを追加したいと思いますが、UiDevice
を使用するためのレロマンのアドバイスは、ドキュメントの観点からは正しいです-残念ながら、いくつかのケースでは期待どおりに機能しません。
少なくともAPI 23では、エミュレーターの回転がテストのクラッシュ後にスタックする可能性があることがわかりました。
uiDevice.setOrientationLeft()
UiDevice
によるローテーションの強制は機能しますが、手動でローテーションを「自動ローテーション」に変更するまで、テストが終了するとローテーションは間違ったローテーションに戻ります。uiDevice.unfreezeRotation()
は、テストの実行中に役立ちますが、テストの終了後、ローテーションが間違ったものに戻ります。API 28ではこの問題は発生しません。
したがって、setRequestedOrientation
を使用することが私にとって唯一の解決策であることがわかりました。