今天我們會把 RSpec 安裝到 Rails 內,以及一些基本的設定。
主要會介紹:
rspec-rails
安裝的方式- 自動根據
rails generate
的指令來產生_spec.rb
的檔案 - 介紹一些 rails 特定的 matcher
- rails 一定會寫的測試種類
- 一定會用到的測試套件!
rspec-rails 的安裝方式
在 rails 的專案目錄中找到 Gem.file
檔案。
並且同時在 development
以及 test
的 group 下加入最新版本的 rspec-rails
最新版本 ( 記得要加上版本號喔! )
group :development, :test do
gem 'rspec-rails', '~> 5.0', '>= 5.0.2'
end
接著我們在終端機輸入指令:
$ bundle install
這步主要是把這個 gem
安裝進入我們這專案的裡面,接著我們需要繼續輸入指令:
$ rails generate rspec:install
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
裡面的 .spec
以及 spec
資料夾和 spec_helper.rb
已經在頭五天就有介紹過了,忘記的可以 點擊這裡回去看
但其實 rails_helper.rb
在一開始沒有什麼太多的東西需要設定,畢竟測試的核心還是在 spec_helper.rb
裡面。
rails_helper.rb
裡面比較多的是額外插件的設定,或是更換關於 Rails 相關的東西,例如不想要用 ActiveRecord
也可以關掉,路徑以及環境的設定會放在這邊。
之後介紹的 Factory-bot
以及資料庫的清洗都會在這邊設定,到時候會有額外的示範。
自動產生測試檔案
自動產生檔案這件事情,在前面安裝完後其實就有了這項功能。
我們可以使用指令 rails g model --help
來看看有什麼不同。
我這邊截圖的是全新 new 出來的專案,看看指令後的情況!
一開始的預設是 test_unit
,也就是我們在根目錄中會看到一整包 test
的資料夾,在我們安裝 RSpec 後可以直接全部刪掉了,那是 Rails 內建的測試框架,我們這次不會討論到。
接著看看安裝完 RSpec 的專案是什麼樣子吧!
這就是為什麼在 rails g model / controller
時,會自動產生測試檔案的原因。
rspec-rails 特別的 matcher
眾所皆知 rails 是一個 Web 開發的框架,所以當然有些比較特別的 matcher 是為了網站所打造的!
此圖片截圖自
rspec-rails
的 github README
其實用看的就能理解他要測試的東西都和網際網路有相關,所以才需要特製,關於 render
頁面,path
& http_status
等等,都能夠在 rspec-rails
中使用!
Rails 測試的優先順序
一般來說測試是寫的越多越好,甚至可以達到傳說中的覆蓋率 100% 那當然是無話可說!
但現實並不常常是如此,如果不是規模特別大的公司,工程師常常是身兼多職,從前端寫到後端,甚至測試以及 CI/CD 等等,都需要一條龍掌握住!
但這個時候問題就來了,工時其實就是那樣,除非你無限爆肝,不然也不可能達到 100% 的測試覆蓋率。
那我們就可以針對比較重要的項目來進行測試,以下是 Rails 的測試項目:
- Model specs
- System specs / feature specs*
- Request specs / controller specs*
- Helper specs
- View specs
- Routing specs
- Mailer specs
- Job specs
上面的順序其實也反應了我自己對於測試的重要度感受。
Model 的測試不用說了,肯定是整個 Rails 的根基,也為了我們後面的 Feature / System test 打下基礎!
而 Feature / System test 則是會讓我感覺到最安心的一個測試模式,畢竟他是真的模仿使用者在瀏覽網站,但也因為它的測試規模較大,耗時較長,所以我們才需要 Model test 來幫助我們檢查小螺絲。
至於 Request 的測試就相對比較少,因為我自己覺得有點和 System test 重疊的部分,如果我的 Controller 壞了,那我的 System test 也不會通過才對!
所以單獨測試 Controller 會讓我覺得有點小題大作~
至於從 Helper 到 Job 的測試都是平常比較少寫的,但如果是 API 模式,少了 Feature / System test 的話,可能就要把測試覆蓋到各個小地方去才好!
最常使用的延伸套件
絕對非 Capybara
以及 FactoryBot
為主,這兩項在開發 Rails 的過程中很難不使用到才對。
明天也會介紹 FactoryBot
的基本使用以及一些在撰寫不同測試需要注意的事情!
而後天則會介紹 Capybara
,也是我們在撰寫 Feature / System test 時最為重要的夥伴!
結語
之後的文章也會盡量加入一些自己在撰寫專案中踩到的小雷,或是需要特別注意的地方!
因為其實寫 RSpec 常常會遇到一些奇奇怪怪的情況,或是不知道為什麼就是沒辦法正確測試,但其實有一些小撇步可以讓寫測試也變得開心喔!
希望讓大家在寫測試的時候,都能夠感覺像是在實作功能一樣輕鬆簡單快快樂樂!