2009-09-03 44 views
2

编辑#2:有没有人有一个很好的方法来测试客户端 - 服务器应用程序的“中间”,我们可以拦截请求和响应,根据需要伪造客户端或服务器,并提供api的自我记录?测试JSON客户端服务器API的推荐方法是什么?

在许多情况下,黄瓜可能是一个很好的解决方案,但它不是我想要的。这个中间层应该是客户端/服务器实现不可知的。 (例如,黑盒子)。


我们的客户端 - 服务器模型是红宝石上轨服务器与Flex客户端,使用具有JSON一个RESTish接口作为数据格式。因此,客户端发布到服务器的任何内容通常都是单个JSON参数。服务器完成这件事,并用纯JSON模型进行响应。

我们在服务器上进行标准的rails测试,我们正在努力在客户端上完成正确的FlexUnit测试(这是一个移动的目标)。然而,我的团队对于当前测试模型的有效性存在争议,因为服务器上的每个更改似乎都会破坏API的一部分。这告诉我,API通信(团队成员之间,代码中的自我文档等)都存在问题,并且缺乏适当的API完整性测试。

所以我一直在质疑我们是否需要一个模拟客户端来测试纯JSON级别的服务器(没有富客户端的所有其他复杂性),并且可能还需要模拟服务器来做同样的事情与富客户端。这将有两个目的,记录API并提供API本身的更彻底测试。

有一个争论的原因是Rails的人声称,Rails集成测试足以测试所有的服务器请求,而中间地面测试环境只是多余的。

所以这里的问题是,根据我们的情况,应该如何去自我记录API,我们应该如何测试API本身?

编辑:

我们有像/foo/444/bar.js路线,但参数可以根据实际行动上任何复杂的JSON字符串,如:

json={ 
    "foo":{ 
    "x":1, 
    "y":2 
    }, 
    "bar":[1,2,3,4,5] 
} 

但除了手动编辑的API文档,没有自我文档。轨道控制器通常只是反序列化并将更改直接应用于模型。很高兴有共同的测试告诉我们什么时候改变,什么预计。

回答

1

我刚开始考虑这个名为Maxq的Web功能测试工具,我认为它有可能解决您的问题,Maxq充当您的Web客户端和服务器应用程序之间的代理服务器。 它位于Junit之上,这意味着您可以通过声明对您的服务器应用程序的调用的行为和响应来为您的API执行适当的单元测试。 它基本上捕获和记录您从Web客户端发出的所有请求以及从服务器返回的响应,还可以生成请求的测试脚本,您可以使用这些脚本在任何服务器上播放和测试。

你应该尝试一下,你可以做到这一点http://maxq.tigris.org/

+0

这看起来像我在找的东西,但很难说。他们的文档有点粗略。 – Glenn 2009-09-11 22:41:47

1

你可以把它看成两个不同的项目。如果你有两个项目,你会写两个单独的测试套件吗?

您应该首先在服务器和客户端之间建立API- ,好像在启动实施之后,您不会在团队之间进行任何通信。

然后,您将构建使用API​​的客户端和生成API的服务器(如果您是TDD,则首先进行测试)。

对于测试,一个团队需要一个模拟服务器来提供假的API响应来测试客户端,另一个团队需要测试服务器产生的数据(即,e,第二个团队正在使用像你的铁轨家伙声称的集成测试)

+0

感谢您的答复,但您的解决方案的结果在重复API调用。我的意思是服务器集成测试有效地处理他们对API的看法,并且客户端测试具有不同的版本。保持它们的一致性是一种痛苦,这就是为什么从一个统一的自我记录套件驱动客户端和服务器是很好的原因。道歉,如果我没有很好地描述这一点。 – Glenn 2009-09-07 04:57:03

+0

但是你需要两队之间的现状。 API更改应尽可能最小并记录。如果客户团队获得自己的“稳定”服务器版本,嘲笑服务器进行客户端测试可能是可以避免的。是的:如果您再次在客户端中提取REST API,请为API(例如,使用QUnit)或单独的Flex应用程序编写一些测试。 – ZeissS 2009-09-07 08:08:34

+0

api和项目一样是新的。所以事情在不断变化。 – Glenn 2009-09-07 08:50:03

1

我会推荐Cucumber。它允许您通过模拟浏览器为应用程序编写特定的测试。通过这种方式,您可以轻松发送请求并验证JSON响应。

+1

+1。我无法确认它是否正是我所需要的快速浏览,但它很有趣。 – Glenn 2009-09-07 09:03:24

+0

它不仅具有创意,而且实际上很有用。我们正在用这种方式用XML和JSON测试REST API。您只需正确指定您的步骤。在jason的情况下,将“响应”json解析为哈希,并验证该哈希包含您应该包含的内容。工作得很好,它可以锻炼你的整个Rails堆栈,所以它也是非常全面的测试。 – Ariejan 2009-09-09 15:00:17

+0

-1 IMO这不是什么黄瓜最适合用于。 api不是面向用户的。控制器测试专门用于测试此目的,并且黄瓜广告的唯一价值在于步骤定义语法。 – 2011-11-03 14:12:35

0

一种方法是使用RSpec的控制器测试(你也可以使用测试::单位)

describe PersonApiController 
    # GET /person/1.json 
    it "should respond with a person" do 
    person = Person.create(:name => "scott") 
    get :show, :id => person.id, :format => 'json' 
    response.should be_success 
    response.body.should have_selector('name', :content => person.name) 
    end 
end 
相关问题