REST Api的自动测试

时间:2012-08-27 01:22:29

标签: api rest testing automation

我想为REST API编写一个自动化测试套件。在我们完成新服务时,我们要检查以确保所有先前创建的服务按预期工作。有关用于实现此目的的最佳工具的任何建议吗?我知道像Apigee这样的工具可以让你一次测试1个服务,但是我们想要一种方法来点击按钮来测试所有服务。

10 个答案:

答案 0 :(得分:36)

在我的工作中,我们最近整合了几个用Java编写的测试套件来测试我们构建的一些RESTful API。我们的服务可以调用他们依赖的其他RESTful API。我们把它分成两个套房。


  • 套件1 - 单独测试每项服务
    • 使用restito模拟API所依赖的任何对等服务。其他替代方案包括rest-driverwiremockbetamax
    • 测试我们正在测试的服务,并且模拟所有运行在单个JVM中
    • 在Jetty中启动服务

我肯定会建议这样做。它对我们来说非常有效。主要优点是:

  • 对等服务被模拟,因此您无需执行任何复杂的数据设置。在每次测试之前,您只需使用restito来定义您希望对等服务的行为方式,就像使用Mockito进行单元测试时的类一样。
  • 如果被调用,您可以询问模拟的对等服务。您无法使用真正的对等服务轻松地执行这些断言。
  • 套件非常快,因为模拟服务提供预先存储的内存中响应。所以我们可以获得良好的报道,而不需要套件运行年龄。
  • 该套件可靠且可重复,因为它独立于其自己的JVM中,因此无需担心其他套件/人员在套件运行的同时与共享环境混淆并导致测试失败。

  • 套件2 - 完全结束
    • Suite针对跨多台计算机部署的完整环境运行
    • 在环境中的Tomcat上部署的API
    • 同行服务是真实的“实时”全面部署

这个套件要求我们在对等服务中进行数据设置,这意味着测试通常需要更多时间来编写。我们尽可能使用REST客户端在对等服务中进行数据设置。

此套件中的测试通常需要更长时间才能编写,因此我们将大部分内容都放在套件1中。据说这套套件仍有明显价值,因为套件1中的模拟可能与真实服务不同。


答案 1 :(得分:25)

Frisby是一个基于node.js和Jasmine构建的REST API测试框架,它使测试API端点变得简单,快速和有趣。 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();

答案 2 :(得分:19)

由于这个原因,我与我的一位同事合作启动了PyRestTest框架: https://github.com/svanoort/pyresttest

虽然您可以使用Python中的测试,但正常的测试格式是YAML。

基本REST应用程序的示例测试套件 - 验证API是否正确响应,检查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}

答案 3 :(得分:2)

我使用SOAP UI进行功能和自动化测试。 SOAP UI允许您通过单击按钮来运行测试。 Ted Young还创建了一个spring controllers testing页面。我使用这篇文章在我们的应用程序中创建Rest单元测试。

答案 4 :(得分:2)

对API进行自动化测试的一个问题是,许多工具要求您在运行测试套件之前启动并运行API服务器。拥有一个能够在完全自动化的测试环境中运行和查询API的单元测试框架是一个真正的优势。

对于使用Node.JS / Express实现的API的一个选项是使用mocha进行自动化测试。除了单元测试之外,它还可以轻松编写针对API的功能测试,分为不同的测试套件。您可以在本地测试环境中自动启动API服务器并设置本地测试数据库。使用make,npm和构建服务器,您可以创建一个“make test”目标和一个增量构建,每次将一段代码提交到您的存储库时,它将运行整个测试套件。对于真正挑剔的开发人员,它甚至会生成一个很好的HTML代码覆盖率报告,显示代码库的哪些部分被测试覆盖。如果这听起来很有趣,这里有一个blog post,它提供了所有技术细节。

如果您没有使用节点,那么无论该语言的事实单元测试框架是什么(jUnit,cucumber / capybara等) - 请看它支持在本地测试环境中启动服务器并运行HTTP查询。如果它是一个大项目,那么获得自动API测试和持续集成工作的努力将会很快得到回报。

希望有所帮助。

答案 5 :(得分:2)

Runscope是一种基于云的服务,可以使用一组测试来监控Web API。可以通过参数化Web挂钩进行测试,计划和/或运行测试。还可以从世界各地的数据中心执行测试,以确保响应时间为全球客户群所接受。

Runscope的免费等级每月最多支持10K请求。

免责声明:我是Runscope的开发者倡导者。

答案 6 :(得分:1)

我实施了许多基于REST Assured的自动化案例,这是一个用于测试休息服务的jave DSL。 https://code.google.com/p/rest-assured/

语法很简单,它支持json和xml。 https://code.google.com/p/rest-assured/wiki/Usage

在此之前,我尝试过SOAPUI并且在免费版本上遇到了一些问题。此外,案例是在xml文件中,难以扩展和重用,只是我不喜欢

答案 7 :(得分:1)

您还可以使用Rest Assured库。有关示例脚本的演示,请参阅http://artoftesting.com/automationTesting/restAPIAutomationGetRequest.html

答案 8 :(得分:0)

API测试自动化,每分钟最多一次,是theRightAPI提供的服务。您可以创建测试方案并执行它们。一旦这些测试完成了您期望的测试,您就可以安排它们。对于需要身份验证的方案,可以将测试“链接”在一起。例如,您可以进行向Twitter发出OAuth请求的测试,并创建一个共享令牌,然后可以由任何其他测试使用。测试还可以附加验证标准,以确保http状态代码,甚至使用javascript或模式验证详细检查响应。一旦安排了测试,您就可以在特定测试未通过验证时立即通知您,或者在响应时间或响应大小的确定范围之外通知您。

答案 9 :(得分:0)

我已经使用TestNG和Apache HTTP类来构建自己的REST API测试框架, 在Selenium工作两年后,我开发了这个概念。

一切都是一样的,除了你应该使用Apache HTTP类而不是Selenium类。

尝试一下,它非常可爱和优秀,您可以充分利用自己的能力来定制测试框架。