Hello, 我是 Weber,一位工程師,斜槓鼓手與行銷顧問。
Rails 開發,每日一套件第 13 天,讓我們一起認識 Rails 開發好用的 30 個套件,建立出自己的常用套件庫吧!
RSpec 是開放原始碼的函示庫,是為了測試而存在的的專門語言。
要注意的是 RSpec 是 Ruby 的套件,RSpec-rails 則是專門給 Rails 使用的延伸套件。
講到 RSpec 肯定要先大略講一下測試是什麼?有什麼樣的種類。
katalon.com/resources-center/blog/unit-testing-vs-functional-testing
Unit Testing (單元測試)
第一層 Unit Test
是以程式碼的最小單位來進行測試,可以確保程式邏輯不會在系統維護的過程中被破壞。
這種測試類型通常由自己撰寫,自己寫的程式碼自己測試,是所有測試中最基礎、也最容易寫的類型。
Integration Testing (整合測試)
第二層 Integration Test
強調整合不同資源進行測試,用來確定不同的模組與模組之間的互動正確,保護在各自維護的過程中,不會因為功能調整然後壞掉。
以下就是一個 Unit Test 通過,但是 Integration Test 沒過的狀況:
很好理解吧!
即使 Unit Test 通過,獨立運作也正常,但是要進一步考量與其他模組互動是有可能發生錯誤的。
有找到這個很好笑的範例來表達,每個系統每個模組都通過Unit Test與 Integration Testing,但最後從使用者的角度無法接受!
聽說寫 E2E 的測試難度很高,執行的速度也很慢(聽說有人跑過12小時????),但目前這範疇,我還沒有接觸到,只能遠觀,還無法褻玩焉。大家先了解一樣概念吧。
講到測試,一定就會常常聽到別人提到的 TDD。
TDD 全名為 "Test-driven development",中文稱『測試驅動開發』。
TDD 是一種開發流程,重點概念就是 “先寫測試,再做開發”。
如此不斷循環,有點像是我先把功能規格開出來,然後再針對我開出的規格,再來寫程式語言去符合規格。
完成我要的功能後,再來優化我的程式碼。
www.thoughtworks.com/en-br/insights/blog/testing/tdd-as-a-scaffold-for-a-better-product
所以在做TDD的時候,有幾個重點。
那就是你要很清楚你的需求是什麼?或者你預期發生的正確結果是什麼?
如果連開發者自己都不知道預期的正確結果是什麼,那也根本無法進行測試。
再來是,透過寫測試,是可以有效避免程式的錯誤的,但並不能保證一定沒有錯!
測試的範圍先廣,沒辦法用一篇就交代得完,那就太小看測試了。
總之先試著寫寫看吧,回到套件本題:
起手式,這裡以 rspec-rails
為主
bundle add rspec-rails
記得放入 group :development, :test do
之中
緊接著:
rails g rspec:install
這個動作會產出,一個 .rspec
檔,在 app 資料夾內產生一個 spec 資料夾,並且在裡面生出 spec_helper.rb
& rails_helper.rb
,這兩個檔案多是做 RSpec 的設定。
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
在安裝完 RSpec 後,現在只要你試著 generate model,會直接一併長出給這個 model 的測試。
如下:
$ rails generate model user
invoke active_record
create db/migrate/20181017040312_create_users.rb
create app/models/user.rb
invoke rspec
create spec/models/user_spec.rb
當然也可以獨自產生測試,好比說 model 是 store。
$ rails generate rspec:model store
create spec/models/store_spec.rb
接著就可以開始寫測試啦
至於怎麼寫呢?不是這裡要討論的。
以下寫個參考:
RSpec.describe Store do
it 'have name' do
store = Store.new 'Hello Store'
expect(store.name).to eq 'Hello Store'
end
end
然後接著跑
RSpec
然後一定爆,接著就是開始寫 code 來符合 測試了
通過之後,再來重構程式碼。
大概就是這樣,測試的寫法,可能要另外寫一篇文章了,我們明天再見。