如何测试Espresso Android中是否更改了按钮文字?

时间:2017-08-24 05:54:40

标签: android android-espresso

我正在尝试在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 。我假设,这种情况正在发生,因为延迟和浓缩咖啡无法赶上延迟。由于我是测试的新手,如果你能解释如何解决这个问题或者我应该采取什么样的方法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

在你的案例中我会尝试一些事情:

Api Call

一般来说,在执行测试时,应避免“联系”真实服务器。你需要隔离你正在测试的东西,所以你不能希望api调用成功。 您需要确定后端发回的内容。

人们通常会通过两种方式解决这个问题:

  1. 在没有触及网络堆栈的情况下,模拟api调用以返回正确的内容
  2. 模拟Http服务器
  3. 以上任何一种的确切实施取决于您的应用的设计方式。

    与时间有关的东西

    虽然Espresso应该管理它应该等待的任何事件,但有时需要告诉它手动延迟一些执行。

    为此,您应该使用IdlingResource。可以找到关于该主题的简单明了的解释here

    此外,如果您在测试的内容中使用任何Animations,则应在测试时禁用它们。有多种方法可以做到这一点,简单的谷歌搜索将在StackOverflow上为您提供大量问题。

    Espresso电话

    我不确定这是否会产生任何影响(必须深入了解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...")));
    }