Как протестировать API-интерфейс JSON REST

Я новичок в рубине (первый день работает с рубином), поэтому, пожалуйста, простите любые новички и непонимание.

Я пытаюсь проверить ответы на http-выноски.

Например, предположим, что конечная точка следующая:

https://applicationname-api-sbox02.herokuapp.com 

И я пытаюсь выполнить аутентификацию пользователя, отправив запрос на получение следующим образом:

get_response = RestClient.get( "https://applicationname-api-sbox02.herokuapp.com/api/v1/users", 
                    {
                        "Content-Type" => "application/json",
                        "Authorization" => "token 4d012314b7e46008f215cdb7d120cdd7",
                        "Manufacturer-Token" => "8d0693ccfe65104600e2555d5af34213"
                    }
                ) 

Теперь я хочу проверить ответ и сделать следующее: - проанализировать ответ, чтобы убедиться, что он действителен. JSON - выполните некоторую проверку и убедитесь, что JSON имеет правильные данные (убедитесь, что id == 4, например) - если возникла ошибка, вызовите исключение с помощью метода "raise".

В моей первой неудачной попытке я пробовал следующее:

puts get_response.body
if get_response.code == 200
puts "********* Get current user successful"
else
puts "Get current user failed!!"
end 

Теперь это вернуло то, что получение текущего пользователя прошло успешно, но как я на самом деле разбираю json, проверяю правильный идентификатор и создаю исключение, если произошла ошибка?

Ответы

Ответ 1

Вместо того, чтобы создавать исключение, напишите тест.

Прямой подход, используя json-парсер и unit test framework из std lib:

require 'minitest/autorun'
require 'rest_client'
require 'json'

class APITest < MiniTest::Unit::TestCase
  def setup
    response = RestClient.get("https://applicationname-api-sbox02.herokuapp.com/api/v1/users", 
      {
         "Content-Type" => "application/json",
         "Authorization" => "token 4d012314b7e46008f215cdb7d120cdd7",
         "Manufacturer-Token" => "8d0693ccfe65104600e2555d5af34213"
      }
    ) 
    @data = JSON.parse response.body
  end

  def test_id_correct
    assert_equal 4, @data['id']
  end
end

Выполнить с помощью ruby $filename

JSON.parse анализирует строку JSON в рубине hash

Начало работы с minitest

Если вы используете ruby ​​1.8, вам нужно установить json gem и либо установить minitest gem или переключиться на более старый API-интерфейс testunit. Если вы выберете последнее, вам нужно будет изменить require 'minitest/autorun'require 'test/unit' и MiniTest::Unit::TestCaseTest::Unit::TestCase

Ответ 2

Я немного опаздываю на вечеринку, но недавно я создал совместную структуру rspec под названием Airborne для этой цели. Проверьте это: https://github.com/brooklynDev/airborne

Ответ 3

вот пример из наших спецификаций, чтобы вы могли увидеть, как мы тестируем json api:

it 'returns charge' do
  get "/charges/#{charge.id}", '', headers

  expect(response.status).to eq(200)
  expect(response).to match_response_schema(:charge)
  expect(response).to match_json(<<-JSON)
  {
    "id":"{id}",
    "email": "{email}",
    "ip": "127.0.0.1",
    "amount": 10500,
    "state": "captured",
    "captured_amount": 10500,
  }
  JSON
end

Давайте посмотрим на это внимательно

  • match_response_schema(:charge)

Этот матчи проверяет, что json, который мы получаем в ответ, в целом действителен. Мы используем json-schema (jason schema validator) для него. Ребята из Thoughtbot подробное руководство, как использовать валидатор схемы json и создать собственный матчи в этом сообщении в блоге.

Понимание схемы JSON - вот где я получил много полезной информации о том, как создавать схемы для документов JSON.

  1. match_json

Это наш собственный совпадение, и мы недавно выпустили match_json gem. Используя его, вы можете проверить структуру и значения вашего json. Вот две отличные функции этого помощника:

  • Если вы не знаете точных значений, вы можете использовать такие шаблоны, как {id}, {uuid} {date_time} и т.д. У нас есть предопределенные шаблоны, но вы также можете добавить свои собственные.
  • вы получаете сообщение о неисправности с ошибкой, что не так с вашим json, например. "5" не найдено в " > массиве": [1,2,3]

Ответ 4

Разбор json можно выполнить с помощью json gem: http://flori.github.com/json/

Доступ к Parsed json осуществляется через ключ/значение, как в javascript. Вы можете легко проверить значения и условно увеличить ошибки.

Поднятие ошибок выполняется следующим образом:

raise "the ID was #{id} instead of 4"

И пишущие модульные тесты могут быть выполнены с помощью Test:: Unit - http://www.ruby-doc.org/stdlib-1.9.3/libdoc/test/unit/rdoc/Test/Unit.html