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