在Ruby中编写单元测试用于REST API

时间:2011-01-27 02:32:53

标签: ruby unit-testing api

我使用sinatra编写了一个基本的REST API。

有谁知道为它编写测试的最佳方法?我想用Ruby做这件事。

我使用curl进行了初步测试。但我想做一些更强大的事情。这是我的第一个API - 有什么具体的我应该测试吗?

5 个答案:

答案 0 :(得分:6)

最好的方法是意见问题:)就个人而言,我喜欢简单干净。使用minitest,Watirrest-client等工具,您可以对REST接口进行非常简单的测试,并通过实际浏览器测试您的Web服务(支持所有主流浏览器)。

#!/usr/bin/ruby
#
# Requires that you have installed the following gem packages: 
# json, minitest, watir, watir-webdrive, rest-client
# To use Chrome, you need to install chromedriver on your path

require 'rubygems'
require 'rest-client'  
require 'json'
require 'pp'
require 'minitest/autorun'
require 'watir'
require 'watir-webdriver'

class TestReportSystem < MiniTest::Unit::TestCase
   def setup
      @browser = Watir::Browser.new :chrome # Defaults to firefox. Can do Safari and IE too.
      # Log in here.....
   end

   def teardown
      @browser.close
   end

   def test_report_lists   # For minitest, the method names need to start with test
      response = RestClient.get 'http://localhost:8080/reporter/reports/getReportList'
      assert_equal response.code,200
      parsed = JSON.parse response.to_str
      assert_equal parsed.length, 3 # There are 3 reports available on the test server
   end

   def test_on_browser
      @browser.goto 'http://localhost:8080/reporter/exampleReport/simple/genReport?month=Aug&year=2012'
      assert(@browser.text.include?('Report for Aug 2012'))
   end
end

只需执行脚本即可运行测试用例。 Ruby有许多其他测试系统和REST客户端,可以以类似的方式工作。

答案 1 :(得分:4)

您可以查看此方法http://anthonyeden.com/2013/07/10/testing-rest-apis-with-cucumber-and-rack.html

虽然许多人可能会说使用Cucumber实际上是更多的应用程序或验收测试而不是单元测试,但它确实包含一种创建HTTP标头并形成http请求的方法,我猜这可能是你被卡住的地方?

我个人对此没有任何问题,因为如果你真的要对API进行单元测试,你可能不得不模拟api可能正在讨论的任何代码单元(例如,你是否持久化数据) )

看到我是QA的家伙而不是开发者,我会非常高兴使用黄瓜并在那个级别进行测试,但是当开发单元测试时我也非常感激,所以你可能会使用rSpec代替Cuke,也许是“机架测试”的提示对你想要完成的事情有用。

答案 2 :(得分:3)

您可以尝试使用airborne,这是为此目的而编写的框架:

https://github.com/brooklynDev/airborne

您可以针对实时API或针对Sinatra,Grape,Rails应用程序进行测试。

答案 3 :(得分:0)

我会使用fakeweb gem对Web服务进行单元测试。

答案 4 :(得分:0)

我建议使用 client-api 宝石-它具有许多api automation特有的有用功能,易于使用和维护脚本。

https://github.com/prashanth-sams/client-api

有趣的是,这个gem在自己内部绑定了一个api自动化框架。因此,您甚至不需要框架设置。

client-api库的主要功能:

  • 自定义标题,URL和超时支持
  • URL查询字符串定制
  • 数据类型和密钥对值验证
  • 单密钥对响应验证
  • 多密钥对响应验证
  • JSON响应模式验证
  • JSON响应内容验证
  • JSON响应大小验证
  • JSON响应为空?验证
  • JSON响应具有特定的密钥吗?验证
  • JSON响应数组列表排序验证(降序,升序)
  • 响应头验证
  • JSON模板作为主体和架构
  • 支持存储当前运行的每个测试的JSON响应
  • 记录对调试的支持
  • 自定义日志删除器
  • 针对HTTP方案自动处理SSL

Example specshttps://github.com/prashanth-sams/client-api/tree/master/spec/client


spec_helper.rb文件中添加此配置代码段:

ClientApi.configure do |config|
  config.base_url = 'https://reqres.in'
  config.headers = {'Content-Type' => 'application/json', 'Accept' => 'application/json'}
  config.basic_auth = {'Username' => 'ahamilton@apigee.com', 'Password' => 'myp@ssw0rd'}
  config.json_output = {'Dirname' => './output', 'Filename' => 'test'}
  config.time_out = 10  # in secs
  config.logger = {'Dirname' => './logs', 'Filename' => 'test', 'StoreFilesCount' => 2}
end

RSpec测试场景如下,

api = ClientApi::Api.new
it "GET request" do  
  api.get('/api/users')
  expect(api.status).to eq(200)
  expect(api.message).to eq('OK')
end

it "POST request" do
  api.post('/api/users', {"name": "prashanth sams"})
  expect(api.status).to eq(201)
end

注意:这是一个活跃的项目,可根据用户要求处理问题和新功能