iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
Software Development

Rails 開發,每日一套件介紹! 系列 第 13

Day 13: 開開心心寫測試 - RSpec & RSpec - rails

  • 分享至 

  • xImage
  •  

Hello, 我是 Weber,一位工程師,斜槓鼓手與行銷顧問。
Rails 開發,每日一套件第 13 天,讓我們一起認識 Rails 開發好用的 30 個套件,建立出自己的常用套件庫吧!

Day 13: RSpec and RSpec - rails

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 通過,獨立運作也正常,但是要進一步考量與其他模組互動是有可能發生錯誤的。

  • End to End Testing (e2e, 端對端測試)
    常被簡稱 E2E Test,又稱 UI Tesing, 所謂 E2E 是指從使用者端出發,對系統端進行測試。

有找到這個很好笑的範例來表達,每個系統每個模組都通過Unit Test與 Integration Testing,但最後從使用者的角度無法接受!

聽說寫 E2E 的測試難度很高,執行的速度也很慢(聽說有人跑過12小時????),但目前這範疇,我還沒有接觸到,只能遠觀,還無法褻玩焉。大家先了解一樣概念吧。

什麼是 TDD ?

講到測試,一定就會常常聽到別人提到的 TDD。
TDD 全名為 "Test-driven development",中文稱『測試驅動開發』。
TDD 是一種開發流程,重點概念就是 “先寫測試,再做開發”。

TDD三步驟:

  1. 寫測試碼
  2. 寫程式碼想盡辦法讓測試通過
  3. 優化程式碼

如此不斷循環,有點像是我先把功能規格開出來,然後再針對我開出的規格,再來寫程式語言去符合規格。
完成我要的功能後,再來優化我的程式碼。

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 來符合 測試了
通過之後,再來重構程式碼。

大概就是這樣,測試的寫法,可能要另外寫一篇文章了,我們明天再見。


上一篇
Day 12 : 很抱歉,您的權限不足以閱讀這篇文章 - Pundit (上)
下一篇
Day 14: 鏈鋸工程師? - Nokogiri
系列文
Rails 開發,每日一套件介紹! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言