Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rack::ClientSpec

Harukasan
November 17, 2014

 Rack::ClientSpec

Rack::ClientSpec can test your client behavior
社内勉強会用資料

Harukasan

November 17, 2014
Tweet

More Decks by Harukasan

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  3. Web is based on a browser
    • Web͸͍͍ͩͨϒϥ΢β͕ਖ਼͍͜͠ͱ͕લఏʹͳ͍ͬͯΔ
    • ϒϥ΢β͕HTTP/HTML/CSS/JSΛ࣮૷ͯ͘͠ΕͯΔ͓͔͛Ͱ

    ๻Β͸αʔϏεΛఏڙͰ͖Δ
    • ϒϥ΢β੍࡞ऀʹ͸಄͕͕͋Βͳ͍

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. Test a client

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide

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

    View Slide