Flaky Android Espresso 测试 - Snackbar
Flaky Android Espresso Test - Snackbar
1) 所有被测试的 devices/emulators 都禁用了动画。
2) 我有一个 @BeforeClass 构建我的 Credentials 对象。
3) 我有一个 IntenServiceIdlingResource 和一个 EventBusIdlingResource,在@Before 中注册。
4) 单击登录按钮时,将触发 IntentService。在这种情况下,服务器(模拟服务器)返回 500 错误。该信息通过 greenrobot 的 EventBus 从 IntentService 回传到 UI,并显示带有错误消息的 Snackbar。
测试代码如下:
@Test
public void a_userNamePasswordTest() throws Exception {
// email input
ViewInteraction userNameView = onView(withId(R.id.email));
// verify it's on screen and enabled
userNameView.check(matches(isDisplayed())).check(matches(isEnabled()));
// set the username
userNameView.perform(scrollTo(), replaceText(credentials.username), closeSoftKeyboard());
// password input
ViewInteraction passwordView = onView(withId(R.id.password));
// verify it's on screen and enabled
passwordView.check(matches(isDisplayed())).check(matches(isEnabled()));
// set the password.
passwordView.perform(scrollTo(), replaceText(credentials.password), closeSoftKeyboard());
// sign in button
ViewInteraction signInButton = onView(withId(R.id.email_sign_in_button));
// verify the button
signInButton.check(matches(allOf(
isDisplayed(), isEnabled(), withText("Sign In"), withContentDescription("Sign In")
)));
// clickity click the button
signInButton.perform(scrollTo(), click());
// verify the snackbar text
onView(withText(startsWith("Server Error: 500"))).check(matches(isDisplayed()));
}
这是我经常遇到的异常:
SignInExceptionTest > a_userNamePasswordTest[Nexus_6P_API_23(AVD) -
6.0] FAILED
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: a string starting with
"Server Error: 500"
根据我的日志记录,我的空闲资源正在运行。但是查看日志的时间戳,异常发生在空闲资源空闲后约 5 秒。
似乎在资源空闲和它尝试寻找视图之间存在延迟。
其他可能相关的细节:
- minSdk: 20
- 编译 & targetSdk: 25
- 构建工具:25.0.2
- 支持库:25.1.1
- 浓缩咖啡核心:2.2.2
- gradle 插件 2.3.0-beta3
除了增加我的小吃店显示的时间之外,我如何修复这个测试使其不不稳定?
Espresso 在 IdlingResource 激活后强制等待 5 秒,然后再次检查它是否处于空闲状态。
这对我来说有两个负面影响。
首先,它将测试所需的时间增加到 运行。每次测试额外 5 秒(或 5 的倍数)真的可以加起来。
其次,由于 snackbar 会立即显示,并且只显示大约 3.5 秒,几乎在您等待 IdlingResource 的任何时候,snackbar 都会在 Espresso 意识到资源空闲之前消失,这使得它很难测试。
ConditionWatcher,描述如下:
https://medium.com/azimolabs/wait-for-it-idlingresource-and-conditionwatcher-602055f32356#.9rms52osh
并在此处编写代码:
https://github.com/AzimoLabs/ConditionWatcher
为这两个问题提供了解决方案。它不是 5 秒,而是默认为 250 毫秒,并且可以调整此值(setWatchInterval)。
1) 所有被测试的 devices/emulators 都禁用了动画。
2) 我有一个 @BeforeClass 构建我的 Credentials 对象。
3) 我有一个 IntenServiceIdlingResource 和一个 EventBusIdlingResource,在@Before 中注册。
4) 单击登录按钮时,将触发 IntentService。在这种情况下,服务器(模拟服务器)返回 500 错误。该信息通过 greenrobot 的 EventBus 从 IntentService 回传到 UI,并显示带有错误消息的 Snackbar。
测试代码如下:
@Test
public void a_userNamePasswordTest() throws Exception {
// email input
ViewInteraction userNameView = onView(withId(R.id.email));
// verify it's on screen and enabled
userNameView.check(matches(isDisplayed())).check(matches(isEnabled()));
// set the username
userNameView.perform(scrollTo(), replaceText(credentials.username), closeSoftKeyboard());
// password input
ViewInteraction passwordView = onView(withId(R.id.password));
// verify it's on screen and enabled
passwordView.check(matches(isDisplayed())).check(matches(isEnabled()));
// set the password.
passwordView.perform(scrollTo(), replaceText(credentials.password), closeSoftKeyboard());
// sign in button
ViewInteraction signInButton = onView(withId(R.id.email_sign_in_button));
// verify the button
signInButton.check(matches(allOf(
isDisplayed(), isEnabled(), withText("Sign In"), withContentDescription("Sign In")
)));
// clickity click the button
signInButton.perform(scrollTo(), click());
// verify the snackbar text
onView(withText(startsWith("Server Error: 500"))).check(matches(isDisplayed()));
}
这是我经常遇到的异常:
SignInExceptionTest > a_userNamePasswordTest[Nexus_6P_API_23(AVD) - 6.0] FAILED android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: a string starting with "Server Error: 500"
根据我的日志记录,我的空闲资源正在运行。但是查看日志的时间戳,异常发生在空闲资源空闲后约 5 秒。
似乎在资源空闲和它尝试寻找视图之间存在延迟。
其他可能相关的细节:
- minSdk: 20
- 编译 & targetSdk: 25
- 构建工具:25.0.2
- 支持库:25.1.1
- 浓缩咖啡核心:2.2.2
- gradle 插件 2.3.0-beta3
除了增加我的小吃店显示的时间之外,我如何修复这个测试使其不不稳定?
Espresso 在 IdlingResource 激活后强制等待 5 秒,然后再次检查它是否处于空闲状态。
这对我来说有两个负面影响。
首先,它将测试所需的时间增加到 运行。每次测试额外 5 秒(或 5 的倍数)真的可以加起来。
其次,由于 snackbar 会立即显示,并且只显示大约 3.5 秒,几乎在您等待 IdlingResource 的任何时候,snackbar 都会在 Espresso 意识到资源空闲之前消失,这使得它很难测试。
ConditionWatcher,描述如下: https://medium.com/azimolabs/wait-for-it-idlingresource-and-conditionwatcher-602055f32356#.9rms52osh
并在此处编写代码: https://github.com/AzimoLabs/ConditionWatcher
为这两个问题提供了解决方案。它不是 5 秒,而是默认为 250 毫秒,并且可以调整此值(setWatchInterval)。