Как протестировать 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::TestCase
→ Test::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.
-
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