Android 如何旋转活动,我的意思是:使用浓缩咖啡改变屏幕方向?

Android 如何旋转活动,我的意思是:使用浓缩咖啡改变屏幕方向?,android,robotium,ui-testing,android-espresso,Android,Robotium,Ui Testing,Android Espresso,我已经决定,我使用谷歌浓缩咖啡进行应用程序测试的测试标准之一是: 屏幕方向旋转后,测试应保持活动状态 使用浓缩咖啡时如何旋转屏幕 我尝试过以下机器人代码(是的,我在浓缩咖啡测试中加入了机器人代码,所以起诉我) 但当我在浓缩咖啡测试中运行应用程序时,它会崩溃。 有什么方法可以做到这一点吗? 提前感谢您的帮助您不能混合使用Robotium和Espresso测试。有时解决任何问题的最佳方法是检查所需但不兼容方法的源代码 我很确定您已经有了setUp()方法,它的代码如下: myActivity=thi

我已经决定,我使用谷歌浓缩咖啡进行应用程序测试的测试标准之一是:

屏幕方向旋转后,测试应保持活动状态

使用浓缩咖啡时如何旋转屏幕


我尝试过以下机器人代码(是的,我在浓缩咖啡测试中加入了机器人代码,所以起诉我)

但当我在浓缩咖啡测试中运行应用程序时,它会崩溃。
有什么方法可以做到这一点吗?


提前感谢您的帮助

您不能混合使用Robotium和Espresso测试。有时解决任何问题的最佳方法是检查所需但不兼容方法的源代码

我很确定您已经有了
setUp()
方法,它的代码如下:

myActivity=this.getActivity()

使用此选项更改屏幕方向更改:

myActivity.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向)

myActivity.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Graphic)

您可能还需要使用
myActivity.getInstrumentation().waitForIdleSync()
线程睡眠(毫秒)以等待旋转结束,因为它是以异步方式执行的。第二种方法取决于模拟器/设备,所以要明智地选择它


希望有帮助。

如何旋转屏幕:

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

活动
可从中获取

您可以使用uiautomator库执行此操作

dependencies {
  androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' 
}
ui自动机需要min sdk版本18,因此如果您的应用程序的min 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>

如果测试用例中只有一个活动,则可以执行以下操作:

1.声明您测试
规则
。 那是一块馅饼

这创建了一个定制的浓缩咖啡
ViewAction
,效果很好。它显示了如何在调用
setRequestedOrientation()
方法之前获取
活动(即使它是
AppCompatActivity
)。它还有一个干净的调用方界面:

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

虽然您可能不需要,但我会以100毫秒的延迟跟踪每个方向的更改。

在我自己的方向测试问题之后,我想补充一点,虽然lelloman关于使用
UiDevice
的建议从文档的角度来看是正确的,但不幸的是,在某些情况下它并没有按照预期工作

我发现至少在API 23模拟器上,在测试崩溃后,旋转可能会卡住:

  • Do
    uiDevice.setOrientationLeft()
  • 应用程序崩溃
  • 旋转受阻
    3.1通过
    ui设备强制旋转
    工作,但当测试结束时,旋转返回错误位置,直到您手动将旋转更改为“自动旋转”
    3.2
    ui设备。unfreezzerotation()
    在测试运行时,但在测试结束旋转回到错误位置后,会有帮助
  • 我在API 28上没有这个问题


    因此,我发现使用
    setRequestedOrientation
    是我唯一的解决方案。

    看看这里公认的答案:这只是解决方案的一部分。之后您似乎需要等待一段时间。很抱歉,但它似乎可以工作:您可以使用
    getInstrumentation().waitForIdleSync()
    而不是
    CountDownLatch
    。这是在测试时处理方向的最佳方法。如果设备禁用了自动旋转,则此方法不起作用。有办法吗?柯克,你确定吗?如果我没记错的话,它应该work@Kirk我刚刚在运行Android 9的手机上测试了这个功能,即使禁用了auto rotationWith AndroidX,它也会旋转,Gradle依赖性现在已经消失了
    UiDevice device = UiDevice.getInstance(getInstrumentation());
    
    device.setOrientationLeft();
    device.setOrientationNatural();
    device.setOrientationRight();
    
    @Rule
    public ActivityTestRule<TestActivity> mActivityTestRule = new ActivityTestRule<>(TestActivity.class);
    
    mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    
    onView(isRoot()).perform(orientationLandscape()); 
    onView(isRoot()).perform(orientationPortrait());