- external testing strategy ✅
- the service integration test✅
- introduce VCR✅
- Client Unit Tests ❌
- Why an Adapter?
- Testing for Error Cases
- Smoke Tests and VCR Options 冒烟测试!🌿
- The world is a Service
使用test isolation 和 使用mock来限制测试的scope.能够帮助你成功测试一个额外的服务,而且能够断网。web
External Testing Strategy
api
额外服务的测试故事包含2个主要角色:服务器
- client:使用额外API的你的一部分程序代码。既由于他须要经过API来存取数据,也由于他发送给某人使用的data给API。每一个案例,都会处理一个request和一个response
- server:在你的应用程序以外,经过一些类型的网络request能够到达这个服务。(本章使用的一些策略在没有断网的时候也可使用)
做者也介绍2个角色用于设计和测试目的:
- a fake server: 在一个测试和返回一个回复对象的期间,拦截HTTP request。使用VCR gem来关联fake server
- a adapter:是一个对象,用与client和server之间的调节。
- Smoke test: 从client到真实服务器的完整的交互的测试。client->adapter->Fake server->Server (完整)
- integration test:从client->adapter->Fake Server的测试。也是完成的测试,但不是真实的测试,由于使用了stubbed response来代替真实server。 这里会使用go-to 策略。
- Client Unit test: 从client到adapter结束。调节器的response是stubbed。调节器没有真正使用fake server调用。这个好处就是:让单元测试客户端彻底和server API相隔离。
- a adapter unit test: 从adapter到Fake server。总体测试链条的中间。用于验证 调节器从客户端开始或者事件服务端的行为。
The Service Integration Test 网络
增长三个gemapp
gem 'twitter' 和twitter交互的。4千+🌟
gem 'vcr' , group: :test 用于请求测试。 4千+🌟
gem 'webmock' , group: :test 用于模拟。2千+🌟工具
首先须要twitter API key和秘匙 。从它的程序管理页面https://apps.twitter.com/, 生成本身的应用程序的keys单元测试
shared:
api_key: 123
development:
secret_key_base: 1fe3edb870eff077105cff3ed19f0bdf15a5f999ef09ba1043a4916
test:
secret_key_base: 8baba343e347eadbfcbfa77afb3ba0b13b403fa2dcfb643edf18e44
twitter_api_key: "FuiCOb9knp5USp6Si1rlAscHa"
twitter_api_secret: "WYcZZdrPBteO4UCbjqFDfm8SakmeVILgO3tJ7SFADwqLjnPNsJ"
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
而后保存rake db:migrate
创建关联:测试
task.rb是 belongs_to :user, optional: true #不会进行关联的存在验证,能够没有关联。ui
user.rb是:has_many :tasks, dependent: nullify #删除user,关联的tasks的user_id设置为空。 url
require "rails_helper"
RSpec.describe "task display" do
let(:project) { create(:project, name: "Project Bluebook") }
let(:user) { create(:user, twitter_handle: "noelrap") }
let!(:task) { create(:task, project: project, user: user,
completed_at: 1.hour.ago, project_order: 1) }
before(:example) do
project.roles.create(user: user)
sign_in(user)
end
it "shows a gravatar", :vcr do
visit project_path(project)
url = "http://pbs.twimg.com/profile_images/40008602/head_shot_bigger.jpg"
within("#task_1") do
expect(page).to have_selector(".completed", text: user.email)
expect(page).to have_selector("img[src='#{url}']")
end
end
end
Introducing VCR (Fake server)
做者最喜欢的测试工具。concept is simple。当VCR生效时,会拦截第三方的HTTp request。默认设置,第一次请求正常经过,VCR会把response数据储存下来。当测试再运行时,VCR拦截请求而后使用以前储存的response数据,返回这个数据对象。
个人理解:使用VCRgem让第二次运行相同的集成测试无需再请求远程的服务器了。就是虚假的服务器端的响应,在离线的时候天然可使用了。猜想,就是别人复查你的测试代码后再运行一次,无需等待很长时间。
不过,但改变了一个测试,还得手动让VCR重新记录response。 能够设置一个时间段,超出时间才会再次改变response的记录
让任意一个it or describe块来使用一个VCR cassette,须要本身配置。
spec/support/vcr.rb
VCR.configure do |c|
c.cassette_library_dir = "spec/cassettes"
c.hook_into :webmock
c.configure_rspec_metadata!
c.ignore_localhost = true
end
几段解释没看...minit 和 cucumber略过
Client Unit Tests
看不懂,暂听。