REST API的自动化testing
我想为REST API编写一个自动化testing套件。 当我们完成新的服务时,我们希望检查以确保所有以前创build的服务按预期工作。 任何build议,最好的工具来完成这个? 我知道像Apigee这样的工具可以让你一次testing1个服务,但是我们希望能够通过点击一个button来testing所有的服务。
在我的工作中,我们最近汇集了几个用Java编写的testing套件来testing我们构build的一些RESTful API。 我们的服务可以调用其他依赖的RESTful API。 我们把它分成两个套房。
- 套件1 – 单独testing每项服务
- 模拟API依赖于使用restito的任何对等服务。 其他的select包括rest , 司机和betamax 。
- testing我们正在testing的服务和模拟器都运行在一个单一的JVM
- 在Jetty中启动服务
我肯定会推荐这样做。 它为我们工作得很好。 主要优点是:
- 对等服务被嘲弄,所以你不需要执行任何复杂的数据设置。 在每次testing之前,只需使用restito来定义对等服务的行为方式,就像使用Mockito进行unit testing的类一样。
- 你可以询问嘲笑的同行服务是否被调用。 真正的对等服务无法轻松完成这些断言。
- 该套件超快速,因为嘲笑的服务提供预先存储的内存响应。 所以我们可以得到很好的覆盖,没有套件需要运行一个年龄。
- 该套件是独立于自己的JVM的可靠和可重复的,所以不需要担心其他套件/人员在套件运行的同时正在共享环境,导致testing失败。
- 套房2 – 完整的端到端
- 套件针对跨多台机器部署的完整环境运行
- 在环境中部署在Tomcat上的API
- 同行服务是真正的“现场”全面部署
这个套件要求我们在对等服务中build立数据,这意味着testing通常需要更多时间来编写。 我们尽可能使用REST客户端来完成在对等服务中build立的数据。
这个套件中的testing通常需要更长的时间才能完成,因此我们将大部分的覆盖范围都放在了套件1中。尽pipe如此,这套套件仍然具有明显的价值,因为我们在套件1中的模拟可能不像真正的服务那样performance得很好。
Frisby是一个build立在node.js和Jasmine之上的REST APItesting框架,它使testingAPI端点变得简单,快速和有趣。 http://frisbyjs.com
例:
var frisby = require('../lib/frisby'); var URL = 'http://localhost:3000/'; var URL_AUTH = 'http://username:password@localhost:3000/'; frisby.globalSetup({ // globalSetup is for ALL requests request: { headers: { 'X-Auth-Token': 'fa8426a0-8eaf-4d22-8e13-7c1b16a9370c' } } }); frisby.create('GET user johndoe') .get(URL + '/users/3.json') .expectStatus(200) .expectJSONTypes({ id: Number, username: String, is_admin: Boolean }) .expectJSON({ id: 3, username: 'johndoe', is_admin: false }) // 'afterJSON' automatically parses response body as JSON and passes it as an argument .afterJSON(function(user) { // You can use any normal jasmine-style assertions here expect(1+1).toEqual(2); // Use data from previous result in next test frisby.create('Update user') .put(URL_AUTH + '/users/' + user.id + '.json', {tags: ['jasmine', 'bdd']}) .expectStatus(200) .toss(); }) .toss();
我与我的一位同事合作,为此启动了PyRestTest框架: https : //github.com/svanoort/pyresttest
尽pipe你可以在Python中使用testing,但正常的testing格式是在YAML中。
针对基本REST应用程序的示例testing套件 – validationAPI是否正确响应,检查HTTP状态代码,但您也可以使其检查响应主体:
--- - config: - testset: "Tests using test app" - test: # create entity - name: "Basic get" - url: "/api/person/" - test: # create entity - name: "Get single person" - url: "/api/person/1/" - test: # create entity - name: "Get single person" - url: "/api/person/1/" - method: 'DELETE' - test: # create entity by PUT - name: "Create/update person" - url: "/api/person/1/" - method: "PUT" - body: '{"first_name": "Gaius","id": 1,"last_name": "Baltar","login": "gbaltar"}' - headers: {'Content-Type': 'application/json'} - test: # create entity by POST - name: "Create person" - url: "/api/person/" - method: "POST" - body: '{"first_name": "Willim","last_name": "Adama","login": "theadmiral"}' - headers: {Content-Type: application/json}
我使用SOAP UI进行function和自动化testing。 SOAP UI允许您通过点击一个button来运行testing。 还有一个由Ted Young创build的弹簧控制器testing页面。 我用这篇文章在我们的应用程序中创build了Restunit testing。
Runscope是一个基于云的服务,可以使用一组testing来监控Web API。 testing可以通过参数化的Web钩子进行调度和/或运行。 testing也可以在世界各地的数据中心执行,以确保全球客户群可以接受响应时间。
Runscope的免费级别每月支持高达10K个请求。
免责声明:我是Runscope的开发者。
我基于REST Assured(一个用于testing宁静服务的jave DSL)实现了很多自动化案例。 https://code.google.com/p/rest-assured/
语法很简单,它支持json和xml。 https://code.google.com/p/rest-assured/wiki/Usage
在此之前,我尝试了SOAPUI,并有免费版本的一些问题。 再加上这些情况是在很难扩展和重用的XML文件,只是我不喜欢
对API进行自动化testing的一个问题是,许多工具要求您在运行testing套件之前先启动并运行API服务器。 拥有一个能够在完全自动化的testing环境中运行和查询API的unit testing框架是一个真正的优势。
使用Node.JS / Express实现的API的一个选项是使用摩卡进行自动化testing。 除了unit testing以外,还可以轻松编写针对API的functiontesting,并将其分成不同的testing套件。 您可以在本地testing环境中自动启动API服务器,并设置本地testing数据库。 使用make,npm和一个构build服务器,您可以创build一个“make test”目标和一个增量构build,每次将一段代码提交到您的存储库时,它将运行整个testing套件。 对于真正挑剔的开发者来说,它甚至会生成一个很好的HTML代码覆盖率报告,告诉你代码库的哪些部分被testing覆盖。 如果这听起来很有趣,这里有一个博客文章 ,提供所有的技术细节。
如果你不使用节点,那么无论这个语言的事实unit testing框架是什么(jUnit,cucumber / capybara等) – 看看它支持在本地testing环境中启动服务器并运行HTTP查询。 如果这是一个大型项目,那么获得自动化APItesting和持续集成工作的努力将会很快收到回报。
希望有所帮助。
您也可以使用Rest Assured库。 有关示例脚本的演示,请参阅http://artoftesting.com/automationTesting/restAPIAutomationGetRequest.html
APItesting自动化,最多每分钟一次,是通过RightAPI提供的服务。 你创build你的testing场景,并执行它们。 一旦这些testing达到您所期望的水平,您就可以安排这些testing。 对于需要validation的场景,可以将testing“链接”在一起。 例如,您可以进行向Twitter发出OAuth请求的testing,并创build一个共享令牌,然后可以由任何其他testing使用该令牌。 testing还可以附带validation标准,以确保http状态代码,甚至使用javascript或模式validation对响应进行详细检查。 一旦安排了testing,您可以在特定testing未通过validation时通知您,或者在响应时间或响应大小的范围内行为超出规定范围。
我使用了TestNG和Apache HTTP类来构build自己的REST APItesting框架,在Selenium工作了两年后,我开发了这个概念。
一切都是一样的,除了你应该使用Apache HTTP类而不是Selenium类。
试一试,它真的很可爱,很好,你有全部的能力来定制你的testing框架,以充分的可能性。