使用rspec 开始测试
rails new project
bundle add rspec
Test-Driven Development (TDD) with RSpec
bundle add rspec
Test-Driven Development (TDD) with RSpec
rspec -init
这个命令给我们创建测试的一个起点. 一个.rspec 文件包含一个 require spec/spec_helper.rb
.rspec -> spec/spec_helper.rb
create a new rspec test
.rspec -> spec/spec_helper.rb
create a new rspec test
#human_spec.rb RSpec.describe Human "#greet" do it "should greet sucessfully" do human = Human.new expect(human.greet).to eq "Hello, world!" end end
测试文件不同的地方在于通过 _spec.rb结尾.这是要测试的Human类的实例的greet方法.
首先是 Rspec.describe, 描述我们想测试的类 Human 和这个Human的方法 #greet
这个时候运行rspec 会报错, 这是测试驱动开发的精髓...
先写测试,报错,然后你写代码去消除这个错误.
#human.rb class Human def greet "Hello, world!" end end
然后在spec/human_spec.rb里面要去包含这个human.rb的类文件
require 'your file path/human.rb'
rspec . Finished in 0.0077 seconds (files took 0.15475 seconds to load) 1 example, 0 failures
如何只测试某个文件/某些文件/文件里面的某部分呢?
$ rspec spec/models/your_spec.rb $ rspec spec/jobs $ rspec spec/jobs spec/services #指定某个文件里面的某一行开始的那部分的测试, $ rspec spec/person_spec.rb:21 # 这一行可以describe, context,it or expect # 如果是空行,那么就从头 it 开始,如果空行在所有测试的上面,就测全部. $ rspec spec/person_spec.rb:[1:3] # [x:y]格式 x是第x个describe, y是里面的第y个content $ rspec spec/person_spec.rb:[1:1, 1:3]
#
还可以搜索describe里面的内容,并执行对应的测试例子.
$ rspec spec/person_spec.rb -e "greet"
-e 这个flag是 --example的short, short for example
这里的搜索区分大小写的. It is worth noting that this is sensitive.
Running $ rspec person_spec.rb -e "greet" -fd in on our spec file will return
Run options: include {:full_description=>/greet/} Person culture should be able to greet in local language Finished in 0.00088 seconds (files took 0.09423 seconds to load) 1 example, 0 failures
通过配置精准定位到某个测试. 使用 focus, it=> fit, describe=> fdescribe
...
RSpec.configure do |config| config.filter_run_when_matching focus: true end
you can add f to describe, context or it so it becomes fdescribe, fcontext or fit and RSpec will “focus” on that example/group.
fit 'should tell height' do expect(@person.height).to eq(160) end
is equivalent to. 上面等同于
it 'should tell height', focus: true do expect(@person.height).to eq(160) end
三\如何只测试失败的的测试.
$ rspec file_name_spec.rb --only-failures
如果你只想测试之前失败的test的,那么你就要跟踪哪些是上次失败的tests.
那就需要增加一个配置告诉rspec去存储哪些tests是失败的/通过的.
那就需要增加一个配置告诉rspec去存储哪些tests是失败的/通过的.
RSpec.configure do |config| config.example_status_persistence_file_path = 'some_file.txt' end
如果你用github,那么记得把some_file.txt加入到.gitignore
需要先把全部的examples运行一遍后,再来执行
rspec person_spec.rb --only-failures
在上面的基础上, 如果错误太多,只run一个失败的test怎么弄?
rspec person_spec.rb --next-failure
一次只run一个错误
四\通过标签去运行对应的test
你可以tag examples/groups通过一个hash, RSpec称她为 "metadata" 元数据?
比如:force: true 就是一个metadata.
你可以用arbitrary 的key/values ,随你怎么定义key/values
比如想标注那些重要的tests.
我们加一个 important: true
context 'identity', important: true do # 👈 it 'should tell first name' do expect(@person.first_name).to eq('Emmanuel') end it 'should tell last name' do expect(@person.last_name).to eq('Hayford') end endcontext 'physical features', important: false do # 👈 it 'should be able to tell height' do expect(@person.height).to eq(160) end it 'should be able to tell eye colour' do expect(@person.eye_colour).to eq('grey') end end
rspec person_spec.rb --tag important
那就只会运行 important: true的tests.
通过上面的选择性测试, 这样会节约我们很多测试运行的时间. 让我们做点别的事. 建议在开发中使用这些方法挑选tests去执行,提升开发速度.
阅读量: 1057
发布于:
修改于:
发布于:
修改于: