RSpec All Scenario Testing
This library runs on top of RSpec to provide basically a parameterized unit testing pattern. It follows a specific pattern of writing unit tests, enabling a predictable, complete and outputs a result that is simple to analyze.
Suppose we want to create a class that checks if a number is a positive or a negative number.
require 'rast'
rast Positive do
spec 'Is Positive Example' do
execute { |number| subject.positive?(number) }
end
end---
specs:
Is Positive Example:
variables: {number: [-1, 0, 1]}
outcomes: {true: 1}The class to test:
# positive.rb
class Positive
def positive?(number)
number > 0
end
endRunning the test:
$ rspec -fd spec/examples/positive_spec.rb
Test result:
Positive: #positive?
[false]=[number: -1]
[false]=[number: 0]
[true]=[number: 1]
Finished in 0.00471 seconds (files took 0.47065 seconds to load)
3 examples, 0 failures
See the documentation for more examples.
- Run
$ bundle install - Run
$ bundle exec rspec
- Delete the Gemfile.lock and reinstall.
spec- as defined in the YAML file, the individual elements underspecs.scenario- a specific combination of tokens from vars, it can uniquely identify a fixture.token- used loosely to denote the individual variable in a rule. e.g.true: you & me,youandmeare tokens.fixture- a hash containing a scenario, references back to the spec, and the expected result for the given scenario.variables- raw list of variables to be combined into multiple fixtures.rule- set of outcomes, each paired with a rule clause.exclusions- rule defining the variable combinations to be excluded from the test.inclusions- rule that limits the scenarios to be included. Useful for isolating test cases.outcome- the left portionusof a rule, e.g.us: you&meclause- the right portionyou&meof a rule, e.g.us: you&me
When running the tests, the execution starts at the spec file, then invokes the DSL. The DSL will then invoke the parameter generator to generate the scenarios.
- Increment the .gemspec
- Modify the CHANGELOG.md
- Build gem with
gem build rast.gemspec - Publish with
gem push <gem-filename>