web-dev-qa-db-ja.com

アクティビティを回転させる方法、つまりEspressoを使用して画面の向きを変更する方法

GoogleのEspressoを使用したアプリケーションテストのテスト基準の1つは次のとおりであると判断しました。

テストでは、画面の向きを回転した後もアクティビティの状態を維持する必要があります

Espressoを使用しているときに画面を回転させる方法を教えてください。


次のRobotiumコードを試しました(はい、EspressoテストにRobotiumコードを挿入したので、私を訴えます)

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

espressoテスト内で実行すると、アプリケーションがクラッシュします。
これを行う方法はありますか?

助けてくれてありがとう

22
FalconBot

テストケースにアクティビティが1つしかない場合、次のことができます。

1. Ruleのテストを宣言します。

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

2. Activityを取得し、画面回転を適用します。

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

それはパイです!

18
Slava

あなたは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();
12
lelloman

これは より完全なソリューション でカスタムEspresso ViewActionを作成し、うまく機能します。 setRequestedOrientation()メソッドを呼び出す前に、Activityを取得する方法を示します(AppCompatActivityの場合でも)。また、クリーンな呼び出し元インターフェイスがあります。

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

あなたはそれを必要としないかもしれませんが、私は100ミリ秒の遅延でそれぞれの向きの変化に従います。

4
barnabas

画面を回転させる方法:

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

ActivityActivityRule から取得できます。

4
aha

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番目の方法はエミュレーター/デバイスに依存するため、慎重に選択してください。

お役に立てば幸いです。

1
piotrek1543

オリエンテーションのテストに関する私自身のトラブルの後で、それを追加したいと思いますが、UiDeviceを使用するためのレロマンのアドバイスは、ドキュメントの観点からは正しいです-残念ながら、いくつかのケースでは期待どおりに機能しません。

少なくともAPI 23では、エミュレーターの回転がテストのクラッシュ後にスタックする可能性があることがわかりました。

  1. 実行uiDevice.setOrientationLeft()
  2. アプリケーションがクラッシュします。
  3. 回転が止まっています。
    3.1 UiDeviceによるローテーションの強制は機能しますが、手動でローテーションを「自動ローテーション」に変更するまで、テストが終了するとローテーションは間違ったローテーションに戻ります。
    3.2 uiDevice.unfreezeRotation()は、テストの実行中に役立ちますが、テストの終了後、ローテーションが間違ったものに戻ります。

API 28ではこの問題は発生しません。

したがって、setRequestedOrientationを使用することが私にとって唯一の解決策であることがわかりました。

0
werman