我决定使用Google的Espresso进行应用testing的testing标准之一是:
屏幕方向旋转后,testing应保持活动状态
使用Espresso时如何旋转屏幕?
我已经尝试了以下的Robotium代码(是的,我在我的Espressotesting中放置了Robotium代码,请告诉我)
solo.setActivityOrientation(solo.LANDSCAPE); solo.setActivityOrientation(solo.PORTRAIT);
但是当我在Espressotesting中运行它时,它会崩溃应用程序。
有没有办法做到这一点?
在此先感谢您的帮助
你可以用uiautomator库来做到这一点
dependencies { androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' }
ui automator需要min sdk版本18,所以如果你的应用有一个较低的min sdk,你需要在androidTest
文件夹中创build一个新的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>
然后在你的testing
UiDevice device = UiDevice.getInstance(getInstrumentation()); device.setOrientationLeft(); device.setOrientationNatural(); device.setOrientationRight();
如果你的testing用例中有唯一的Activity,你可以这样做:
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);
这是一块馅饼!
如何旋转屏幕:
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和Espressotesting。 有时解决任何问题的最好方法是检查所需的但不能相容的方法的源代码。
我很确定你已经有了setUp()
方法,它的代码如下所示:
myActivity = this.getActivity();
使用它来改变你的屏幕方向改变:
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
要么
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
您可能还需要使用myActivity.getInstrumentation().waitForIdleSync();
或Thread.sleep(milliseconds);
为了等待旋转结束,因为它是以asynchronous方式执行的。 第二种方法取决于仿真器/设备,所以明智地select它。
希望它有帮助。
这个更完整的解决scheme创build了一个自定义Espresso ViewAction
并运行良好。 它显示了如何在调用setRequestedOrientation()
方法之前获取Activity
(即使它是AppCompatActivity
)。 它也有一个干净的来电界面:
onView(isRoot()).perform(orientationLandscape()); onView(isRoot()).perform(orientationPortrait());
我遵循每个方向更改延迟100毫秒,虽然你可能不需要它。