This gem provides you with a way to do AB testing in a deterministic way without the need for Redis or any other service.
** NOTICE **
The gem is in very early development
Since other gems need all kinds of extra services to work, and we didn't want any extra dependencies, we created a gem that will serve your users an A/B/C or whatever version based on for example a user-id
You can then use e.g. a tool like Mixpanel to track which user saw what, and make your AB testing decisions.
The gem works in a Rails and non rails environment. It's tested on ruby 1.8.7, 1.9.3, 2.1.5, 2.2.2, jruby-1.7.8 and rubinius-2.4.0.
In your view (haml):
-ab(:options=>["dude","your royal highness"], :chances=>"20/80",:name=>"greeting").for(@current_user.id) do |option|
="Well hello #{option}"You can also create a tester, for example in your app/controllers/application_controller.rb
class ApplicationController
before_filter :ab_tests
def ab_tests
@greeting_test = Ab::Tester.new(:options=>["Yo", "Hello"], :chances=>"50/50", :name=>"greeter")
end
endThen in your view (haml style):
-@greeting_test.for(@current_user) do |option|
="#{option} Bro!"Let's say you have a hypothetical MixPanel Tracker you want to use for AB testing. You can for example implement it like this:
class ApplicationController
before_filter :ab_tests
after_filter :track_ab_choices
def ab_tests
@greeting_test = Ab::Tester.new(:options=>["Yo", "Hello"], :chances=>"50/50", :name=>"greeter")
end
def track_ab_choices
MixpanelTracker.track(@current_user, "experiment:greeting", :version=>@greeting_test.call(@current_user.id))
end
endThe chances option of the ab view helper as well as in Ab::Tester takes a
string as an argument. With a format using /. It normalized the chances
afterwards, so the following chances result in the exact same chance
distribution:
Ab::Tester.new(:chances=>"10/60/30")
Ab::Tester.new(:chances=>"1/6/3")
Ab::Tester.new(:chances=>"35/210/105")Add this line to your application's Gemfile:
gem 'ab'
And then execute:
$ bundle
Or install it yourself as:
$ gem install ab
The main class is the Ab::Tester class which takes several options as arguments:
tester = Ab::Tester.new(:name=>"test_name", :options=>[true, false], :chances=>"50/50")
tester.for(user.id) # Will return true or false, depending on the user.idAb::Tester options:
name: Name of the tester, used as a seed to the random number generatoroptions: (required) Array of options to choose from in the test, the options can be anythingchances: (required) String representing the chances of the options e.g."10/20/70"indexer: A class that responds a class levelcall(opts={})which contains the logic on how to get from a value, seed and chances to a choice. See the source code of the basic Indexer.
You can also use the view helper ab with the exact same options as above
option 1: using the output directy
Hello there <%=ab(:options=>["stranger", "you"], :chances=>"80/20").for(@current_user.id) %>option 2: using a block:
<%=ab(:options=>[:stranger, :you], :chances=>"80/20").for(@current_user.id) do |option| %>
<% if option == :stranger %>
Hello there stranger!
<% elsif options == :you %>
Could you please introduce yourself?
<% end %>
<% end %>- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request