如何模拟REST API?


13

我正在研究一个新项目,该项目将从第三方REST API查询数据。这是用于实时体育数据供稿,因此,供稿仅在实际进行比赛时才起作用。

尽管第三方提供了很好的文档(XSD等),但是他们无法模拟游戏的进行,因此要测试我针对该API编写的代码,我必须等待实际的游戏进行。

我唯一的办法就是自己编写代码来模拟游戏,但这似乎需要大量工作。您将如何处理?


5
这些数据有多复杂?在大多数情况下,我只会对处理传入数据的对象进行存根处理。使用先前游戏会话中的数据(对于测试而言可能太复杂),或者分析数据并提取相关类型的信息。将此存储在文件中并馈送到您的主程序,就好像它来自真实源一样。
thorstenmüller2014年

2
模拟对象的完美用例http://en.wikipedia.org/wiki/Mock_object
kevin cline

Answers:


15

这是模拟对象的完美用例。每个流行语言都有模拟库。您可能希望模拟提供REST服务响应以返回测试数据的对象。您可以手动生成测试数据,也可以从先前对实时系统的调用中收集数据。


1
这里的问题不只是代码之一。这是数据之一。我可以模拟出API模拟或存根,但是问题是创建了虚假数据,它将给我
dferraro 2014年

@dferraro:是什么原因阻止了您下次下次玩游戏时轮询服务并将数据转储到文件中。一旦能够做到这一点,并且熟悉格式,就可以使用特定的测试用例制作一个或多个新文件。
史蒂文·埃弗斯

4

等待游戏开始。从提要中捕获每个事件。编写一个模拟器,在适当的时间重放事件。瞧,您有一个包含真实数据的Feed模拟器。


如果您是Ruby用户,则可以使用VCR捕获和重放HTTP响应。
dusan 2014年

2

我建议编写自己的模拟器。您可以使用它来测试各种场景。

  • 服务器接受连接但不响应
  • 服务器超时
  • 服务器发回垃圾回复等...

过去完成此操作后,我在请求消息中使用了“特殊”值来提示模拟器执行所需的操作。这也使运行端到端测试成为可能,而无需超出开发环境。

编辑:例如,如果您的项目将XML提交给第三方服务,则请求可能包括例如<value>50.00</value>。可以对模拟器进行编码(或更好地对其进行配置),以便50.00 =>爆炸,60.00 =>垃圾,70.00 =>关闭连接,依此类推。这个想法是模拟器的行为取决于它的输入,您可以在每个测试用例中对其进行控制。


谢谢。您能否举例说明“特殊”价值?
dferraro 2014年

1
阐述了我的答案。
罗里·亨特

2

考虑到庄家可能提供了一些示例数据(可以在集成阶段保存这些数据),我的建议是以这种方式来组织这些提要:

  • 活动清单
  • 预定活动的更新
  • 赔率更新
  • 结果

提供商可能提供两种更新:推(POST)和拉(GET)。

此时,您应该

  1. 创建一个仅处理GET请求的简单服务器,以便您的程序员可以完善算法。
  2. 创建一个自动化的系统来管理相同信息的提交,从而给您的系统带来压力。

管理开发和测试

无需详细介绍要使用的技术,您将获得一个迷你服务器和一个迷你推送服务,该服务器仅响应4个URL(或取决于提供商所提供的URL)。

HTTP协议的处理程序是在使用“小型服务器”时要牢记的一件好事。在端口80上创建服务器非常简单,并且可以解决问题。您必须确保按照提供者的要求将所有信息注入到GET响应中(这样可以避免投入生产时出现问题)。

我个人将使用Nodejs 做一个简单的Perl服务器相同的服务器。关于数据注入,一个计时器就足够了,它可以调用离线浏览器(CURL,WGET


2

我用cucumberjs,用代理服务器设置为127.0.0.1,钩住的node.js过程与phantomjs的组合模拟REST API http-proxynock那里。CucumberJS不是重要的部分,您可以以任何方式编写测试方案,其余的是仿真的关键。它能够简单地通过match-request-return-data进行模拟,但是您也可以通过模式进行过滤并通过钩子回调函数产生答复,因此您可以模拟所需的任何粒度级别(在极端情况下以a完整的演示服务器,但您可以逐步进行操作。

效果很好:

  1. Phantomjs请求URI。
  2. 请求到达127.0.0.1:port上的代理服务器。
  3. 您的node.js进程使用代理将其透明转发http-proxy。因此,任何“正常”加载(页面,图像)都可以工作。
  4. 如果选择拦截某些请求(主要是API),则使用nock它。

在我的场景中,我以相同的过程将其与黄瓜js测试结合使用,因此它的结果如下:

  1. 测试运行。
  2. nock为要测试的场景设置HTTP模拟。
  3. 它通过Selenium协议在phantomjs中加载页面。

其余部分如本段前面所示(也就是说,这是一个周期,我作为测试运行程序指示phantomjs加载页面,该页面将所有请求转发回给我,然后将它们转发到网络;或者拦截它们(如果它是经过测试的API)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.