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。
- context变成fcontext
- it变成fit
- 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-failures 是 rspec --tag last_run_status:failed的简写。
Content mainly from 「Effective testing with Rspec 3」by Myron Maston, Ian Dees