我正在尝试在Android中使用Espresso测试登录页面。到目前为止,我已经确定了我的代码应该执行的测试用例。这些是测试用例
- 输入用户名
- 输入密码
- 按提交
- 检查按钮文字已更改为"正在验证..."
这是我的测试用例
@LargeTest
@RunWith(AndroidJUnit4.class)
public class LoginTest {
private String userName;
private String userPass;
@Rule
public ActivityTestRule<LoginActivity> activityRule = new ActivityTestRule<LoginActivity>(LoginActivity.class);
@Before
public void assignCredentials (){
userName = "ABC";
userPass = "ABC";
}
@Test
public void buttonTextChanged(){
onView(withId(R.id.edittext_user))
.perform(typeText(userName));
onView(withId(R.id.edittext_pass))
.perform(typeText(userPass));
onView(withId(R.id.submit_login))
.perform(click())
.check(matches(withText("Verifying...")));
}
}
要添加,登录按钮文本实际上是在系统使用服务器检查凭据时将文本更改为 验证... ,一旦完成,文本将更改为再次 登录 。每次运行时,测试都会失败并显示实际文本 LOGIN 。我假设,这种情况正在发生,因为延迟和浓缩咖啡无法赶上延迟。由于我是测试的新手,如果你能解释如何解决这个问题或者我应该采取什么样的方法,我将不胜感激。
答案 0 :(得分:0)
在你的案例中我会尝试一些事情:
一般来说,在执行测试时,应避免“联系”真实服务器。你需要隔离你正在测试的东西,所以你不能希望api调用成功。 您需要确定后端发回的内容。
人们通常会通过两种方式解决这个问题:
以上任何一种的确切实施取决于您的应用的设计方式。
虽然Espresso应该管理它应该等待的任何事件,但有时需要告诉它手动延迟一些执行。
为此,您应该使用IdlingResource
。可以找到关于该主题的简单明了的解释here。
此外,如果您在测试的内容中使用任何Animations
,则应在测试时禁用它们。有多种方法可以做到这一点,简单的谷歌搜索将在StackOverflow上为您提供大量问题。
我不确定这是否会产生任何影响(必须深入了解Espresso代码),但我要做的最后一件事就是将您正在执行的两个Espresso电话分开。确保Espresso首先执行click()
,然后同时检查matches
而不是两者。
@Test
public void buttonTextChanged(){
onView(withId(R.id.edittext_user))
.perform(typeText(userName));
onView(withId(R.id.edittext_pass))
.perform(typeText(userPass));
onView(withId(R.id.submit_login))
.perform(click());
onView(withId(R.id.submit_login))
.check(matches(withText("Verifying...")));
}