Slide 1

Slide 1 text

Rack::ClientSpec @harukasan / ͸Δ͔͞Μ

Slide 2

Slide 2 text

ωλͳͷͰਅʹड͚ͯ͸͍͚ͳ͍

Slide 3

Slide 3 text

Web is based on a browser • Web͸͍͍ͩͨϒϥ΢β͕ਖ਼͍͜͠ͱ͕લఏʹͳ͍ͬͯΔ • ϒϥ΢β͕HTTP/HTML/CSS/JSΛ࣮૷ͯ͘͠ΕͯΔ͓͔͛Ͱ
 ๻Β͸αʔϏεΛఏڙͰ͖Δ • ϒϥ΢β੍࡞ऀʹ͸಄͕͕͋Βͳ͍

Slide 4

Slide 4 text

Some clients are in the blackbox • ͱ͸͍͑શͯͷΫϥΠΞϯτͷڍಈ͕Θ͔ͬͯΔΘ͚Ͱ͸ͳ͍ • ISUCONͩͱΫϥΠΞϯτͷڍಈ͸Ṗ

Slide 5

Slide 5 text

E2E test for server Server Mock send a request get a response

Slide 6

Slide 6 text

Capybara it "returns 200" do visit '/' expect(page).to have_content 'Success' end

Slide 7

Slide 7 text

Test a client

Slide 8

Slide 8 text

Test a client Mock Client send a response (if you need) get a request

Slide 9

Slide 9 text

Rack::ClientSpec rubygems.org/gems/rack-client_spec

Slide 10

Slide 10 text

Rack::ClientSpec • ΫϥΠΞϯτͷڍಈΛαʔό͔ΒςετͰ͖Δ • Rack MiddlewareͳͷͰRackΠϯλʔϑΣʔεͳΒ͍͍ͩͨ૊ΈࠐΊΔ • Θ͟Θ͟ϞοΫΛͭ͘Βͳͯ͘΋αʔόʹ૊ΈࠐΊͯศར • power_assertศར github.com/harukasan/rack-client_spec

Slide 11

Slide 11 text

Insert ClientSpec to your rack Server Client send a response (if you need) get a request ClientSpec

Slide 12

Slide 12 text

Insert ClientSpec to your rack app require 'rack' require 'rack/lobster' require 'rack/client_spec' require 'rack/lobster_spec' use Rack::ClientSpec, LobsterSpec # <- Insert Clientspec run Rack::Lobster.new

Slide 13

Slide 13 text

Write a test case require 'rack/client_spec' class LobsterSpec < Rack::ClientSpec::TestCase # <-- test case def test_flip # <-- test method get '/' do |req, res| # <-- expect request assert { res.status == 200 } end get '/?flip=left' do |req, res| # <-- expect request assert { req['HTTP_REFERER'] == 'http://localhost:9292/' } end end end

Slide 14

Slide 14 text

TODO • ϦΫΤετͷ్தʹ༨ܭͳϦΫΤετ͕དྷΔͱ͚͜ΔͷΛͳ͓͢ • ϦΫΤετ͕དྷͳ͍͜ͱΛςετ͍ͨ͠ • Cache-Controlςετ͍ͨ͠ • όάϑΟοΫε