Непрерывный мониторинг и тестирование сторонних API на Rails
мы хотели бы настроить автоматические задания (через Jenkins
), чтобы предупредить, если сторонний API не работает или они развернули несовместимые API.
Я говорю о том, чтобы проверить против реального HTTP APIs
и не макет, а как у нас уже есть макет, написанный с помощью rspec
, Я не уверен, что мы должны дублировать усилия, написав два независимых яичек.
у кого есть такой опыт раньше?
(Я не ограничиваюсь Ruby/Rspec
если другие инструменты могут помочь)
4 ответов
насмешки используются для проверки СВОЙ код без касания реального API. И вы хотите протестировать реальный API.
поэтому я думаю, что вам нужно написать набор тестов в RSpec, например, для ненавязчивой тест стороннего API.
Под " ненавязчивым "я имею в виду трек, чем вы не выдаете случайные" удалить " запросы API, например, или использовать все ваши ежедневные запросы API лимит одним тестовым набором запуска.
Не знаю, указаны ли инструменты тестирования API существовать.
Что касается меня, я использовал RSpec для тестирования моих собственных удаленных API/серверов с успехом.
вы посмотрели на видео? Используя его, вы можете "записывать HTTP-взаимодействия вашего набора тестов и воспроизводить их во время будущих тестовых запусков для быстрых, детерминированных, точных тестов". Я использовал его с RSpec при тестировании ожидаемых ответов от внешних API и думаю, что это здорово. Я бы рекомендовал вам проверить вопросы StackOverflow с тегом видео если это то, что вы думаете, может работать на вас.
Не уверен в его интеграции Дженкинса, но когда Я использовал VCR, я автоматизировал некоторые регулярные задачи, где мне нужно было попасть в API с , когда ("задания Cron в Ruby"). Не совсем непрерывный, но несколько автоматизированный.
когда я был в такой ситуации несколько месяцев назад я сделал следующее:
- издеваться над API и писать тесты против высмеянных данных (у вас уже есть это)
- напишите еще один тест, который получает данные из реального API и утверждает, что он (все еще) в той же форме и содержит те же данные, которые мы ожидаем
Я сделал это так, поскольку для меня было невозможно угадать / знать, какой контент будет предоставлен Live API.
есть 2 вещи, которые я бы сделал с существующим набором тестов, чтобы его можно было использовать вживую, первый использует возможность для describe
и it
блоки для получения метаданных (здесь есть хороший пост в блоге). Второй использует возможность для shared_contexts
взять блок.
во-первых, отметьте спецификации, которые вы хотите запустить против реального API с метаданными. Например, вы хотите знать, что они могут быть запущены по-настоящему, например
describe "Hitting the API with a call", :can_be_real do
# …
end
эти спецификации можно после этого побежать из командной строки использование опции тега.
второе, это заменить насмешки на настоящую вещь. Это зависит от того, как вы определили насмешки, будь то before
или let
использовался, и сколько вы издевались. В качестве глупого примера см. ниже:
require 'rspec'
RSpec.configure do |c|
c.treat_symbols_as_metadata_keys_with_true_values = true
end
shared_context "all my mocks and stubs" do
let(:this) { false }
end
describe "a", :real do
include_context "all my mocks and stubs" do
let(:this) { true } if ENV["REAL_API_CALL"] == 'true'
before do
stub_const( "URI", Class.new ) unless ENV["REAL_API_CALL"] == 'true'
end
end
it "should be real when it's real" do
this.should == true
end
it "should escape things when it's real" do
URI.should respond_to :escape
end
end
когда файл запускается через bin/rspec example.rb
выход:
a
should be real when it's real (FAILED - 1)
should escape things when it's real (FAILED - 2)
Failures:
1) a should be real when it's real
Failure/Error: this.should == true
expected: true
got: false (using ==)
# ./example.rb:19:in `block (2 levels) in <top (required)>'
2) a should escape things when it's real
Failure/Error: URI.should respond_to :escape
expected URI to respond to :escape
# ./example.rb:22:in `block (2 levels) in <top (required)>'
Finished in 0.00349 seconds
2 examples, 2 failures
при запуске через env REAL_API_CALL=true bin/rspec example.rb
:
a
should be real when it's real
should escape things when it's real
Finished in 0.00301 seconds
2 examples, 0 failures
Итак, вы видите, вы можете изменить контекст спецификаций несколькими способами, которые позволят вам уровень управления, который вы хотите из командной строки (и, следовательно, Дженкинс). Вы хотите пометить спецификации другими метаданными, например, безопасно ли работать в реальном времени, может ли это занять много времени и т. д.