我想为 REST API 编写一个自动化测试套件。当我们完成新服务时,我们会检查以确保所有之前创建的服务都按预期工作。有关用于完成此任务的最佳工具的任何建议?我知道像 Apigee 这样的工具可以让您一次测试一项服务,但我们想要一种通过单击按钮来测试所有服务的方法。
10 回答
在我的工作中,我们最近整理了几个用 Java 编写的测试套件来测试我们构建的一些 RESTful API。我们的服务可以调用它们所依赖的其他 RESTful API。我们把它分成两个套房。
- 套件 1 - 单独测试每个服务
- 使用restito模拟 API 依赖的任何对等服务。其他替代品包括rest-driver、wiremock和betamax。
- 测试我们正在测试的服务和模拟都在单个 JVM 中运行
- 在 Jetty 中启动服务
我肯定会推荐这样做。它对我们来说非常有效。主要优点是:
- 对等服务是模拟的,因此您无需执行任何复杂的数据设置。在每次测试之前,您只需使用restito 来定义您希望对等服务的行为方式,就像您在使用Mockito 的单元测试中使用类一样。
- 您可以询问模拟的对等服务是否被调用。您无法使用真正的对等服务轻松地进行这些断言。
- 该套件速度非常快,因为模拟服务提供预先存储的内存响应。因此,我们可以在套件运行时间不长的情况下获得良好的覆盖率。
- 该套件是可靠且可重复的,因为它隔离在自己的 JVM 中,因此无需担心其他套件/人员在套件运行的同时在共享环境中乱搞并导致测试失败。
- 套房 2 - 完整的端到端
- 套件针对部署在多台机器上的完整环境运行
- 环境中部署在Tomcat上的API
- 对等服务是真实的“实时”完整部署
该套件要求我们在对等服务中进行数据设置,这意味着测试通常需要更多时间来编写。我们尽可能使用 REST 客户端在对等服务中进行数据设置。
该套件中的测试通常需要更长的时间来编写,因此我们将大部分覆盖范围放在套件 1 中。话虽如此,该套件仍然具有明显的价值,因为我们在套件 1 中的模拟可能与实际服务不太一样。
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();
为此,我与我的一位同事合作启动了 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}
Runscope是一种基于云的服务,可以使用一组测试来监控 Web API。测试可以通过参数化的网络挂钩进行、计划和/或运行。还可以从世界各地的数据中心执行测试,以确保全球客户群可以接受响应时间。
Runscope 的免费层每月最多支持 10K 请求。
免责声明:我是 Runscope 的开发者倡导者。
对 API 进行自动化测试的问题之一是,许多工具要求您在运行测试套件之前启动并运行 API 服务器。拥有一个能够在全自动测试环境中运行和查询 API 的单元测试框架可能是一个真正的优势。
对于使用 Node.JS / Express 实现的 API 来说,一个很好的选择是使用 mocha 进行自动化测试。除了单元测试之外,它还可以轻松编写针对 API 的功能测试,分成不同的测试套件。您可以在本地测试环境中自动启动 API 服务器并设置本地测试数据库。使用 make、npm 和构建服务器,您可以创建一个“make test”目标和一个增量构建,每次将一段代码提交到您的存储库时,它将运行整个测试套件。对于真正挑剔的开发人员,它甚至会生成一个很好的 HTML 代码覆盖率报告,显示代码库的哪些部分被测试覆盖。如果这听起来很有趣,这里有一篇提供所有技术细节的博客文章。
如果您不使用 node,那么无论该语言的实际单元测试框架是什么(jUnit、cucumber/capybara 等) - 查看它对在本地测试环境中启动服务器和运行 HTTP 查询的支持。如果这是一个大型项目,那么进行自动化 API 测试和持续集成工作的努力将很快得到回报。
希望有帮助。
我使用SOAP UI进行功能和自动化测试。SOAP UI 允许您在单击按钮时运行测试。还有一个由 Ted Young 创建的spring 控制器测试页面。我使用这篇文章在我们的应用程序中创建了 Rest 单元测试。
您还可以使用 Rest Assured 库。有关示例脚本的演示,请参阅http://artoftesting.com/automationTesting/restAPIAutomationGetRequest.html
我基于 REST Assured 实现了许多自动化案例,这是一种用于测试 RESTful 服务的 java DSL。 https://code.google.com/p/rest-assured/
语法简单,支持json和xml。 https://code.google.com/p/rest-assured/wiki/Usage
在此之前,我尝试了 SOAPUI,但在使用免费版本时遇到了一些问题。另外,这些案例都在难以扩展和重用的 xml 文件中,只是我不喜欢
API 测试自动化(最多每分钟一次)是一项可通过theRightAPI获得的服务。您创建测试场景并执行它们。一旦这些测试按照您的预期进行,您就可以安排它们。对于需要身份验证的场景,测试可以“链接”在一起。例如,您可以有一个测试向 Twitter 发出 OAuth 请求,并创建一个共享令牌,然后任何其他测试都可以使用该令牌。测试还可以附加验证标准以确保 http 状态代码,甚至使用 javascript 或模式验证对响应进行详细检查。一旦安排了测试,您就可以让警报在特定测试未通过验证或响应时间或响应大小超出既定范围时立即通知您。
我使用 TestNG 和 Apache HTTP 类来构建我自己的 REST API 测试框架,我在 Selenium 工作了两年后开发了这个概念。
一切都是一样的,除了你应该使用 Apache HTTP 类而不是 Selenium 类。
试一试,它真的很可爱,很好,你有所有的能力来定制你的测试框架,以充分发挥你的潜力。