编写运行RSpec用例

135 阅读2分钟

Spec分组

RSpec提供了context方法用于spec分组,通过这个方法,可以进行spec的嵌套定义(包括分组内spec共享的设置),如:

RSpec.describe 'A cup of coffee' do
  let(:coffee) { Coffee.new }

  it 'costs $1' do
    expect(coffee.price).to eq(1.00)
  end

  context 'with milk' do
    before {coffee.add :milk}
    it 'costs $1.25' do
      expect(coffee.price).to eq(1.25)
    end
  end
end

context其实是describe方法的别名,可以互换使用。不过,当对测试对象有更改的时候,语义上推荐使用context。

输出结果格式化

当执行如下命令时 rspec --format documentation,RSpec的测试输出结果不再是简单的点(.)和F(表示spec执行失败),而是以文档形式按缩进的方式展示spec的执行结果,绿色表示成功,红色表示失败。上述命令使用的是RSpec自带的输出格式化工具。

CodeRay

如果想进一步句法高亮的话,可以使用CodeRay gem。RSpec在运行时,会自动搜索CodeRay是否安装,如果安装会自动使用。注意看expect方法和1.25的高亮。通常,在复杂的spec定义的时候,使用CodeRay高亮输出结果会对分析很有帮助。

找到运行慢的spec

使用rspec --profile 命令,可以找到运行最慢的spec,如:

运行rspec --profile 2即可输出运行最慢的2个spec。

选择要执行的Spec

文件夹/文件

我们可以指定文件夹或者文件,RSpec只会运行我们指定的文件夹及文件中定义的spec,命令如下:

example/e选项

还可以指定--example/-e选项及关键字来圈定要执行的spec,如:

rspec -e milk -fd,RSpec会遍历每个spec的描述(description),执行包含milk的所有spec。

失败的spec

给定文件名和行号,rspec会执行所在位置的spec。

only-failures选项

该选项告知RSpec执行所有最近失败的specs。使用这个选项前,我们需要进行一些配置,告知RSpec将失败的spec信息存储的位置。在xxxx_spec.rb的顶部,添加如下代码:

RSpec.configure do |config|
  config.example_status_persistence_file_path = ​'spec/examples.txt' # 告知RSpec将失败的spec信息存在spec/examples.txt文件内
end

聚焦特定的spec

通过在RSpec的方法前加字母f(focused - 聚焦),让RSpec只运行“聚焦”的spec。

  1. context变成fcontext
  2. it变成fit
  3. describe变成fdescribe

同样,使用聚焦特性的时候,也需要在RSpec.configure代码块里添加配置,如:

RSpec.configure do |config|
  config.filter_run_when_matching(focus: true)
  config.example_status_persistence_file_path = ​'spec/examples.txt' # 告知RSpec将失败的spec信息存在spec/examples.txt文件内
end

为spec打tag

当我们在定义spec或者spec group的时候,我们可以提供hash来为spec或者spec group添加tag, 又名metadata。hash里可以包含任意的key和value,如:

fcontext 'with milk' do其实就是context 'with milk', focus: true do的简略写法。

RSpec为每一个spec都添加了执行成功或者失败的metadata - last_run_status。所以,

rspec --only-failuresrspec --tag last_run_status:failed的简写。

Content mainly from 「Effective testing with Rspec 3」by Myron Maston, Ian Dees