当使用Espresso进行测试时如何提供模拟数据

17
我们有一个非常大的Android应用程序,没有测试。我们正遭受典型的质量/手动回归测试周期过长问题。
作为一名服务器端开发人员,对Android新手来说,我想引入开发人员测试。
我可以看到如何使用JUnit对普通Java代码进行单元测试。
然而,活动/片段/适配器证明更加困难。
我观看了GTAC的Espresso视频,并对此印象深刻,并决定使用它。
我遇到的问题是如何向我的测试用例提供模拟数据,以确认显示结果。
这是否可能?似乎Espresso是用于黑盒测试的,这在很大程度上限制了它的开发人员使用(它的目标受众),因为(通常)黑盒测试由QA完成。

如果我没记错的话,Espresso是一个UI测试框架,我的问题是为什么在测试UI时需要模拟值? - user2511882
6
UI显示的内容取决于它从某些来源(例如数据库或Rest URL)接收到的数据。我希望在数据方面提供多样性,并确保其正确显示。 - FinalFive
不确定这是否与Espresso相关。我们在一个相当大的项目中也使用Espresso,其中有多个后端和各种方式的模拟数据。例如,通过提供给已知查询的预定义响应的替代服务器,或仅通过交换客户端侧查询接口实现来验证预期查询并返回测试定义的响应。这些方法都没有使用任何Espresso功能。 - haffax
2个回答

15

有一个叫做 mockwebserver 的库,可以让你模拟服务器响应。

Github: https://github.com/square/okhttp/tree/master/mockwebserver

如果您正在使用 gradle,可以添加以下依赖项:

 androidTestCompile 'com.squareup.okhttp:mockwebserver:1.3.0'

一些有用的片段:

设置模拟服务器

MockWebServer server = new MockWebServer(); 

添加一个示例响应(仅在第一次调用服务器时有效)

server.enqueue(new MockResponse().setBody("Hello World Response"));

启动服务器

 server.play();
获取服务器的URL以替换您正在使用的常规URL。
  URL baseUrl = server.getUrl("/");

现在,向使用BaseURL的任何内容发出请求,就像调用非模拟的网络服务一样。第一次调用该服务时,它将返回上面的响应。棘手的部分是您必须与您的应用程序实际发出的请求数量相同的MockResponses。在调试/观察代码时要小心,因为如果您在代码中单步执行,调试器实际上会将其中一个响应弹出。

如果你有困难理解,这里有一个Java Web项目(在Web和非Web中完全相同)我写了一些基本示例。https://github.com/digitalbuddha/GitPullRank


这是使用全栈apk,稍作修改以使用受控终端点。QA团队已经在使用Appium进行这项工作。我正在寻找一种开发者方法,在其中可以内部控制依赖关系,但仍然可以在模拟器或设备上查看事物。 - FinalFive
+1 这是我认为正确的方法。在开始 espresso 测试用例之前,请确保初始化 HTTP 客户端(即 Retrofit / okhttp / 等等)以使用 MockWebServer 的根 URL 作为终端主机,就像答案中所示。 - Dori
如果使用RetroFit,则可以使用RestAdapter.Builder.setEndpoint(...)。 - Dori
嗨,我最终做了这个,但实际的 Web 服务被调用了,然后是模拟 Web 服务器。我应该如何避免实际的 Web 服务被调用?请协助。@Dori - Rat-a-tat-a-tat Ratatouille

2
我遇到了同样的问题,找不到完全符合我需求的任何框架。但是Wiremock很接近。

我用它来记录api的响应,并/或在重现模式下使用。当在记录模式下时,如果请求已经被记录,它就不会再次记录。虽然它在安卓上还没有得到完全支持(但是),但我在我的电脑上以独立方式运行,然后运行应用程序或Espresso测试。您还可以手动编辑或添加请求或答案。

您可以在这里找到更多详细信息。


1
这在2016年1月已经支持Android了。请查看另一个Stack Overflow答案:https://dev59.com/1ovda4cB1Zd3GeqPbJRk#34657592 - Sam Edwards
请在此问题的答案中发布您的建议... https://dev59.com/25nga4cB1Zd3GeqPa5Yq?noredirect=1#comment65074170_38791731 - vks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接