如何在运行时确定视图内容的Android UI测试?

时间:2017-06-28 14:55:51

标签: android automated-tests tdd android-espresso ui-testing

情况

我正在编写一个时间表查看应用程序,第一个要实现的功能是选择查看时间表的课程。

用户从列表中选择他们的课程名称,并被带到另一个屏幕,以进一步指定他们当前所在课程的年份,组等。选择课程和编辑课程详细信息的屏幕是如下:

enter image description here

enter image description here

目标

Google I/O 17 talk on Test-Driven Development on Android的启发,我想写的是用于测试此功能的UI测试用例。具体来说,我希望我的测试确认,如果用户点击其中一个课程名称,他们将被带到“编辑课程详细信息”屏幕,并且该课程标题位于顶部,例如“会计和财务”与列表中单击的匹配。

问题

使用Espresso进行测试,选择标题为“会计和财务”的课程并查看下一个屏幕上是否显示正确的标题,看起来(大致)如下:

@Test
public void chooseCourse() {
    onView(withId(R.id.rv_course_list))
            .perform(RecyclerViewActions.actionOnItemAtPosition(
                    /*Somehow find position of Accounting and Finance*/,
                    click())
            );


    onView(withId(R.id.course_title))
            .check(matches(withText("Accounting and Finance")))
            .check(matches(isDisplayed()));
}

我的问题是RecyclerView课程列表将在运行时使用来自HTTP请求或SQLite数据库的结果进行填充,并且无法事先知道该列表是否包含“会计和财务”或其他内容else(我不希望测试失败只是因为当应用程序运行时特定的课程不在列表中)。

考虑到这一点,我无法将课程名称硬编码到测试中。请注意我不是要编写单元测试,我只是嘲笑获取课程列表的依赖性,以确保“会计和财务”在列表中(并且可能只是孤立ChooseCourseActivity类,捕获其Intent s。。

在我上面链接的视频中,演示者通过对笔记应用程序的添加注释功能的UI测试向我们介绍测试如下:

  1. 点击“添加备注”按钮
  2. 输入备注的标题和说明
  3. 点击“保存记事”按钮
  4. 确认列表中包含包含步骤2详细信息的新记事
  5. 在该场景中,硬编码用于查找视图的文本(标题和描述)效果很好,因为测试中的代码确定视图的内容,即注释列表中的注释。在我的例子中,视图的内容将由HTTP响应或数据库查询确定

    问题

    • 如何在实施之前为选择课程功能编写适当的UI测试?
    • 视频中使用的方法是否测试笔记应用程序根本不适用于我的功能(因为我无法硬编码从列表中选择的课程标题)?
    • 我只是误解了UI测试,应该嘲笑依赖项(即使视频中的发言者没有)?

    编辑:此问题的最佳解决方案似乎是所谓的“密封测试”,this blog描述了如何将其应用于Android UI。

1 个答案:

答案 0 :(得分:1)

您可以通过几种不同的方式对此进行测试,并在我的应用中使用了所有这些方法的组合。

1)您可以按照建议模拟网络/数据库层。

2)您可以在测试中调用API以获取“预期”数据集,然后验证它是否在您的用户界面中正确显示。

3)您可以存储网络层,以便注入已知数据而不依赖于网络端点。特别是改造使得它很容易实现。

4)您可以使用不会经常更改的已知测试数据集来测试实时端点。

我倾向于使用Espresso进行UI级别测试和全面回归测试。在UI级别测试中,我在网络/设备持久层上存根,只测试我在测试期间注入的数据集的客户端。对于回归测试,我关心测试与我的API的集成,以及那些我使用已知不变数据的测试帐户。