--tag option

Use the --tag (or -t) option to run examples that match a specified tag. The tag can be a simple name or a name:value pair.

If a simple name is supplied, only examples with :name => true will run. If a name:value pair is given, examples with name => value will run, where value is always a string. In both cases, name is converted to a symbol.

Tags can also be used to exclude examples by adding a ~ before the tag. For example, ~tag will exclude all examples marked with :tag => true and ~tag:value will exclude all examples marked with :tag => value.

Filtering by tag uses a hash internally, which means that you can’t specify multiple filters for the same key. For instance, if you try to exclude :name => 'foo' and :name => 'bar', you will only end up excluding :name => 'bar'.

To be compatible with the Cucumber syntax, tags can optionally start with an @ symbol, which will be ignored as part of the tag, e.g. --tag @focus is treated the same as --tag focus and is expanded to :focus => true.

Background

Given a file named “tagged_spec.rb” with:

RSpec.describe "group with tagged specs" do
  it "example I'm working now", :focus => true do; end
  it "special example with string", :type => 'special' do; end
  it "special example with symbol", :type => :special do; end
  it "slow example", :skip => true do; end
  it "ordinary example", :speed => 'slow' do; end
  it "untagged example" do; end
end

Filter examples with non-existent tag

When I run rspec . --tag mytag

Then the process should succeed even though no examples were run.

Filter examples with a simple tag

When I run rspec . --tag focus

Then the output should contain “include {:focus=>true}”

And the examples should all pass.

Filter examples with a simple tag and @

When I run rspec . --tag @focus

Then the output should contain “include {:focus=>true}”

Then the examples should all pass.

Filter examples with a name:value tag

When I run rspec . --tag type:special

Then the output should contain:

include {:type=>"special"}

And the output should contain “2 examples”

And the examples should all pass.

Filter examples with a name:value tag and @

When I run rspec . --tag @type:special

Then the output should contain:

include {:type=>"special"}

And the examples should all pass.

Exclude examples with a simple tag

When I run rspec . --tag ~skip

Then the output should contain “exclude {:skip=>true}”

Then the examples should all pass.

Exclude examples with a simple tag and @

When I run rspec . --tag ~@skip

Then the output should contain “exclude {:skip=>true}”

Then the examples should all pass.

Exclude examples with a name:value tag

When I run rspec . --tag ~speed:slow

Then the output should contain:

exclude {:speed=>"slow"}

Then the examples should all pass.

Exclude examples with a name:value tag and @

When I run rspec . --tag ~@speed:slow

Then the output should contain:

exclude {:speed=>"slow"}

Then the examples should all pass.

Filter examples with a simple tag, exclude examples with another tag

When I run rspec . --tag focus --tag ~skip

Then the output should contain “include {:focus=>true}”

And the output should contain “exclude {:skip=>true}”

And the examples should all pass.

Exclude examples with multiple tags

When I run rspec . --tag ~skip --tag ~speed:slow

Then the output should contain one of the following:

exclude {:skip=>true, :speed=>“slow”}
exclude {:speed=>“slow”, :skip=>true}

Then the examples should all pass.