【发布时间】:2017-10-25 08:45:12
【问题描述】:
Jake Wharton 发表了一场引人入胜的演讲,他提出了一些巧妙的方法来改进我们的 UI 测试,方法是从测试中抽象出我们如何执行 UI 的细节:https://news.realm.io/news/kau-jake-wharton-testing-robots/
他给出的一个示例是一个如下所示的测试,其中 PaymentRobot 对象包含付款金额和收款人如何输入 UI 的详细信息。把那个地方放在一个地方很有意义,所以当 UI 不可避免地发生变化时(例如重命名字段 ID,或者从 TextEdit 切换到 TextInputLayout),它只需要在一个地方更新,而不是整个系列的测试。它还使测试更加简洁和可读。他建议使用 Kotlin 使它们更加简洁。我不使用 Kotlin,但仍想从这种方法中受益。
@Test public void singleFundingSourceSuccess {
PaymentRobot payment = new PaymentRobot();
ResultRobot result = payment
.amount(42_00)
.recipient("foo@bar.com")
.send();
result.isSuccess();
}
他概述了 Robot 类的结构,带有明确的 isSuccess() 响应,返回另一个 Robot,它要么是下一个屏幕,要么是当前屏幕的状态:
class PaymentRobot {
PaymentRobot amount(long amount) { ... }
PaymentRobot recipient(String recipient) { .. }
ResultRobot send() { ... }
}
class ResultRobot {
ResultRobot isSuccess() { ... }
}
我的问题是:
- Robot 如何与 Activity/Fragment 交互,特别是在哪里实例化?我希望跑步者在测试中会发生这种情况,但他的例子似乎表明并非如此。该方法看起来可能非常有用,但我不知道如何在实践中实现它,无论是对于单个 Activity/Fragment,还是对于它们的序列。
- 如何扩展这种方法,以便 isSuccess() 方法可以处理各种情况。例如如果我们正在测试登录屏幕,isSuccess() 如何处理各种预期结果,例如:身份验证成功、API 网络失败和身份验证失败(例如 403 服务器响应)?理想情况下,API 会在 Retrofit 后面进行模拟,并通过端到端 UI 测试对每个结果进行测试。
除了 Jake 的概述演讲之外,我找不到任何实施示例。
【问题讨论】:
标签: android android-espresso android-testing