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

test-queue makes your tests run fast

test-queue makes your tests run fast

Will Farrington

December 11, 2014
Tweet

More Decks by Will Farrington

Other Decks in Technology

Transcript

  1. test-queue

    View Slide

  2. makes your
    TESTS

    View Slide

  3. RUN
    FAST

    View Slide

  4. tmm1/test-queue

    View Slide

  5. HOW?

    View Slide

  6. DISTRIBUTE THE LOAD

    View Slide

  7. WITH CORES
    USE THEM IF YOU
    HAVE THEM

    View Slide

  8. BRING YOUR OWN

    View Slide

  9. USE SOMEONE ELSE'S

    View Slide

  10. THERE ARE SO MANY
    CLOUDS OUT THERE

    View Slide

  11. WHICH CLOUD?

    View Slide

  12. PICK ONE
    I AM NOT HERE TO SELL YOU
    ANYTHING

    View Slide

  13. BUT NO, REALLY, HOW?

    View Slide

  14. 1. TAKE A SOCKET

    View Slide

  15. 2. FORK SOME
    WORKERS

    View Slide

  16. 3. SMARTLY
    DISTRIBUTE TESTS

    View Slide

  17. 4. SPEND LESS TIME
    WAITING ON CI

    View Slide

  18. 5. SPEND MORE TIME
    SHIPPING CODE

    View Slide

  19. GETTING STARTED

    View Slide

  20. INSTALL
    # Gemfile
    group :test do
    gem "test-queue"
    end

    View Slide

  21. ANATOMY OF A SCRIPT/TEST-QUEUE
    #!/usr/bin/env ruby
    $LOAD_PATH.unshift File.expand_path("./../../rspec", __FILE__)
    unless ENV["TEST_QUEUE_WORKERS"]
    abort "TEST_QUEUE_WORKERS must be set in env!"
    end
    require "test_helper"
    require "test_queue"
    require "test_queue/runner/rspec"
    class CustomTestRunner < TestQueue::Runner::RSpec
    end
    CustomTestRunner.new.execute

    View Slide

  22. SETTING UP YOUR AFTER_FORK
    class RailsRSpecRunner < TestQueue::Runner::RSpec
    def after_fork(num)
    # ActiveRecord
    ActiveRecord::Base.configurations["test"]["database"] << num.to_s
    ActiveRecord::Base.establish_connection(:test)
    # Redis
    $redis.client.db = num
    $redis.client.reconnect
    end
    end

    View Slide

  23. SETTING UP YOUR PREPARE
    class RailsRSpecRunner < TestQueue::Runner::RSpec
    def prepare(num)
    # grab a copy of your database schema
    num.times do |i|
    # load it into a clean copy of your test database
    end
    end
    end

    View Slide

  24. DEMO

    View Slide

  25. ADVANCED USAGE
    AT A HIGH LEVEL

    View Slide

  26. REMOTE WORKERS

    View Slide

  27. AN EXAMPLE
    # shared secret
    export TEST_QUEUE_RELAY_TOKEN=12345
    # tell us what you're doing
    export TEST_QUEUE_VERBOSE=1
    # create a master test-queue instance
    TEST_QUEUE_SOCKET=1.2.3.4:12345 bundle exec rspec-queue
    # on a server, far, far away...
    # create a worker that sends results back to the master
    TEST_QUEUE_RELAY=1.2.3.4:12345 bundle exec rspec-queue

    View Slide

  28. COMBINE WITH YOUR
    CI SYSTEM

    View Slide

  29. RUN YOUR TESTS
    FASTER

    View Slide

  30. THANKS
    I AM @WFARR

    View Slide

  31. GITHUB.COM/WFARR/SIX_MINUTE_BLOG
    !⚡
    GITHUB.COM/TMM1/TEST-QUEUE

    View Slide