Допустим, вы пишете приложение на Ruby . Вы, вероятно, общаетесь с каждым API под солнцем и с удовольствием пишете тесты, чтобы убедиться, что ваш код не дает ошибок.
Поскольку вы не хотите полагаться на сторонних разработчиков или на подключение к Интернету, чтобы пройти тесты или не пройти, вы все высмеиваете, скажем, Webmock . Это также делает ваши тесты намного быстрее. Ведь даже самый быстрый интернет гораздо медленнее, чем процессор, говорящий с его памятью.
Если вам лень копировать все API под солнцем, вы можете использовать видеомагнитофон для записи запросов и их воспроизведения позже. Главное преимущество в том, что вам не нужно беспокоиться о тщательном переопределении всего, и вы можете в любое время уничтожить записи, чтобы убедиться, что ваш код все еще работает против реального API.
Жизнь хороша.
Введите Javascript , левая сцена
Тогда Javascript становится все более заметным. Внезапно логика вашего приложения смещается с бэкенда на браузер, и, прежде чем вы это узнаете, большинство ваших тестов довольно неактуальны.
На какое-то время ты в порядке с капибарой или огурцом.
Запустите безголовый браузер, кликните по сайту, не выходя из RSpec , и убедитесь, что пользователи видят, что им нужно. Баланс восстановлен.
Затем вы добавляете форму оплаты. Или что-то. Внезапно ваш интерфейс общается с API. В случае Stripe или Balanced это даже особенность. Большое преимущество для пользователя.
jQuery(function($) { $('#payment-form').submit(function(event) { var $form = $(this); // Disable the submit button to prevent repeated clicks $form.find('button').prop('disabled', true); Stripe.createToken($form, stripeResponseHandler); // Prevent the form from submitting with the default action return false; }); });
Ну, это отстой, ты внезапно вернулся на круги своя.
Ваши тесты занимают минуты, чтобы выполнить. Ваши тесты не пройдут без подключения к интернету. Ваши тесты основаны на работоспособности сторонних сервисов. Ваши тесты отстой.
Кто хочет кодировать, когда выполнение ~ 5 тестов занимает 3 минуты? Никто.
Войдите в пыхтя Билли, правая сцена
Проблема в том, что ни Webmock, ни видеомагнитофон не могут обрабатывать запросы, исходящие из браузера, потому что они происходят в другом потоке, и они не могут возиться с ними.
К счастью, год назад Олли Смит создала пухлого Билли .
Идея была замечательной — раскрутить веб-прокси, попросить ваш безголовый браузер использовать его, когда ваш код отправляет запрос, он будет проходить через прокси-сервер, который попытается использовать Webmock для его обработки, в противном случае передать его на огромный интернет.
Но кто хочет издеваться над всем вручную?
За последние несколько недель я поставил перед собой задачу решить эту проблему и восстановить здравомыслие в моей жизни. Хорошие тесты прозрачны для приложения, и я буду проклят, если я использую любое из предложенных решений в Интернете, например: «Ну, вы просто включаете в свой код переключатель, который знает, что вы находитесь в тесте, а затем не говорит». в полоску »
Да пошло оно.
Этим утром я отправил запрос на выдох для Билли .
Я добавил возможность, чтобы пух-билли вел себя так, как будто это видеомагнитофон, но для вашего браузера. Когда запрос сделан, он кэшируется. Кеш затем сохраняется между сеансами, и запросы воспроизводятся в браузере по мере необходимости.
Пока он не такой сложный, как видеомагнитофон, но он выполняет свою работу, и время моего тестирования сократилось с 3 минут до чуть менее минуты. Это большое дело в моей книге!
Кэширование даже понимает, что некоторые URL-адреса без необходимости различаются при каждом запросе (социальные кнопки, аналитика и т. Д.), Поэтому вы можете настроить его так, чтобы эти запросы нормализовались для одной записи, которая воспроизводится каждый раз. Ваши тесты на самом деле не полагаются на то, что gAnalytics работает правильно?
И самое главное, вам даже не нужно менять свои тесты.
Вы добавляете что-то подобное в ваш spec_helper.rb :
Billy.configure do |c| c.cache = true c.ignore_params = ["http://www.google-analytics.com/__utm.gif", "http://b.siftscience.com/i.gif", "https://r.twimg.com/jot", "http://p.twitter.com/t.gif", "http://p.twitter.com/f.gif", "http://www.facebook.com/plugins/like.php", "https://www.facebook.com/dialog/oauth", "http://cdn.api.twitter.com/1/urls/count.json"] c.persist_cache = true c.cache_path = 'spec/req_cache/' end # need to call this because of a race condition between persist_cache # being set and the proxy being loaded for the first time Billy.proxy.restore_cache Capybara.javascript_driver = :poltergeist_billy
Тест для формы оплаты выглядит так же, как обычно:
scenario "physical product" do product = start_buying build(:product, :physical, user: @seller, active: true) VCR.use_cassette('Balanced/purchase_with_cc') do within '#new_order' do fill_in 'order_email', with: Faker::Internet.safe_email fill_in_address fill_in_card click_on 'Buy Now' end page.should have_css('#receipt', :visible => true) end validate_receipt product, @seller end
Puffing-billy прозрачно кеширует все запросы, которые делает браузер, и видеомагнитофон записывает любые запросы, сделанные вашей бэкэнд-логикой. Это довольно мило.
Что вы ребята думаете? У меня всего 20 дней опыта работы с Ruby, и интернет сказал мне, что он действительно хочет что-то подобное, но я не смог найти никого, кто уже сделал это.