- 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
看不懂,暫聽。