Непрерывный мониторинг и тестирование сторонних 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"). Не совсем непрерывный, но несколько автоматизированный.


когда я был в такой ситуации несколько месяцев назад я сделал следующее:

  1. издеваться над API и писать тесты против высмеянных данных (у вас уже есть это)
  2. напишите еще один тест, который получает данные из реального 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

Итак, вы видите, вы можете изменить контекст спецификаций несколькими способами, которые позволят вам уровень управления, который вы хотите из командной строки (и, следовательно, Дженкинс). Вы хотите пометить спецификации другими метаданными, например, безопасно ли работать в реальном времени, может ли это занять много времени и т. д.