Hypothesis for Ruby

Hypothesis is a powerful, flexible, and easy to use library for property-based testing.

In property-based testing, in contrast to traditional example-based testing, a test is written not against a single example but as a statement that should hold for any of a range of possible values.

Usage

In Hypothesis for Ruby, a test looks something like this:

require "hypothesis"

RSpec.configure do |config|
  config.include(Hypothesis)
  config.include(Hypothesis::Possibilities)
end

RSpec.describe "removing an element from a list" do
  it "results in the element no longer being in the list" do
    hypothesis do
      # Or lists(of: integers, min_size: 1), but this lets us
      # demonstrate assume.
      values = any array(of: integers)

      # If this is not true then the test will stop here.
      assume values.size > 0

      to_remove = any element_of(values)

      values.delete_at(values.index(to_remove))

      # Will fail if the value was duplicated in the list.
      expect(values.include?(to_remove)).to be false

    end
  end
end

This would then fail with:

  1) removing an element from a list results in the element no longer being in the list
     Failure/Error: expect(values.include?(to_remove)).to be false

       Given #1: [0, 0]
       Given #2: 0

       expected false
            got true

The use of RSpec here is incidental: Hypothesis for Ruby works just as well with minitest, and should work with anything else you care to use.

Getting Started

Hypothesis is available on rubygems.org as a developer preview. If you want to try it today you can use the current development branch by adding the following to your Gemfile:

gem 'hypothesis-specs'

The API is still in flux, so be warned that you should expect it to break on upgrades! Right now this is really more to allow you to try it out and provide feedback than something you should expect to rely on. The more feedback we get, the sooner it will get there!

Note that in order to use Hypothesis for Ruby, you will need a rust toolchain installed. Please go to https://www.rustup.rs and follow the instructions if you do not already have one. You will most likely need to compile your Ruby executable with the --enable-shared option. See here.

Project Status

Hypothesis for Ruby is currently in an early alpha stage. It works, and has a solid core set of features, but you should expect to find rough edges, it is far from feature complete, and the API makes no promises of backwards compatibility.

Right now you should consider it to be more in the spirit of a developer preview. You can and should try it out, and hopefully you will find all sorts of interesting bugs in your code by doing so! But you'll probably find interesting bugs in Hypothesis too, and we'd appreciate you reporting them, as well as any just general usability issues or points of confusion you have.