iT邦幫忙

2023 iThome 鐵人賽

DAY 22
1
自我挑戰組

富士大顆系列 第 22

vol. 22 Rails 的「測試-測試-測試!」:「環境」怎麼設定?(中)

  • 分享至 

  • xImage
  •  

你好,我是富士大顆 Aiko
此篇會談到:

  • 基本的測試環境設定步驟
  • TDD

基本的測試環境設定步驟

在 Rails 專案裡,預設的環境是 development ,也就是你不呼喚轉換環境的特定指令,輸入 $rails s
連到的 http://127.0.0.1:3000/ 就是開發環境的狀態。

總共有 3 個環境:

  • development
  • test
  • production

以上的順序也是比較常見的使用順序。

環境 特點/用途 資料庫 錯誤追蹤
development 即時重新載入更改的程式碼,提供錯誤報告。 獨立的資料庫(預設是本地端)。 提供俗稱的紅畫面。
test 用於運行自動化測試。 獨立的測試資料庫。每次測試運行前,資料庫會被重置。 為了不干擾測試結果的閱讀,通常只在失敗時才提供錯誤訊息。
production 實際 user 互動的環境,是最安全的。 獨立的資料庫。可以用命名區分 e.g project_prod 不會公開錯誤訊息,通常會有專門的日誌和監控系統。

在 Rails 中如何轉換環境?

切換指令只有在 development 要轉 production 的時候。

  1. 設定環境變數

    設定 RAILS_ENV 環境變數來轉換環境。

    $export RAILS_ENV=production
    

    除了使用 RAILS_ENV 環境變數外,也可以在 config/environments/ 資料夾中對各個環境進行設定。
    這個設定僅在當前有效。也就是說,如果關閉了終端機或開啟了新的終端機視窗,這個設定就會消失。
    如果希望這個設定能在未來都保持有效,可以將這個 export 指令加入到 .bashrc(如果使用 Bash)或 .zshrc(如果使用 Zsh)檔案中。這樣,每次開一個新的終端機視窗時,這個設定都會自動載入,也就是每輸入 $rails s 環境預設都會是 production!

  2. 啟動伺服器

    在啟動 Rails 伺服器時,也可以指定環境。

    $rails server -e production
    
  3. 資料庫操作

    在執行資料庫相關任務時,也可以指定環境。

    $RAILS_ENV=production rails db:migrate
    

    意指完成 production 環境的資料遷徙

  4. Rails Console

    進入不同環境的 Rails Console。

    $rails console production
    

想轉成 test 不用輸入類似這個的指令,只要開 Rspec 就可以了!

設定和執行測試環境在不同的測試框架和程式語言中會有所不同。以下是在 Ruby on Rails 中使用 RSpec 和 MiniTest 的一些基本步驟:

使用 RSpec

  1. 安裝 RSpec

    在你的 Rails 專案的 Gemfile 中加入以下程式碼:

    group :development, :test do
      gem 'rspec-rails', '~> 5.0'
    end
    

    這邊之所以寫在 development & test 環境是因為在開發環境中執行 rails generate 指令(例如,rails g model、rails g controller 等)時,RSpec 會自動為你生成對應的測試檔案。如果 rspec-rails 僅在 :test 環境中,這些 g 就不會自動幫你加檔案。

    然後執行 bundle install

  2. 初始化 RSpec

    在終端機中:

    $rails generate rspec:install
    

    這會生成一些初始化檔案和資料夾: spec_helper.rbrails_helper.rb

  3. 撰寫測試

    spec 資料夾中撰寫測試,通常會在 spec/models、spec/controllers 等資料夾下撰寫對應的測試。

  4. 執行測試

    在終端機中:

    $rspec
    

    這個指令會自動使用測試環境(Test Environment)。

    或者可以執行特定的測試檔案:

    rspec spec/models/your_model_spec.rb
    
  5. 查看結果

    RSpec 會在終端機中顯示測試結果,不需要啟動伺服器來查看測試結果。

使用 MiniTest

  1. 初始化 MiniTest

    Rails 預設就包含了 MiniTest,所以不需要另外安裝。

  2. 撰寫測試

    test 資料夾中撰寫測試。

  3. 執行測試

    在終端機中:

    $rails test
    

    或者可以執行特定的測試檔案:

    rails test test/models/your_model_test.rb
    
  4. 查看結果

    MiniTest 會在終端機中顯示測試結果,同樣也不需要啟動伺服器。

其他注意事項

  • 資料庫設定

    確任有一個測試用的資料庫,並在 config/database.yml 中進行適當的設定。

  • FactoryBot 和資料生成

    如果使用 FactoryBot 來生成測試資料,記得在 spec/rails_helper.rbtest/test_helper.rb 中加入相關設定。使用方法可以詳閱文件

  • CI/CD 整合

    如果用 CI/CD 工具(如 Jenkins、GitHub Actions、Travis CI 等),記得執行測試的必要步驟。


TDD(Test-Driven Development)測試驅動開發

先寫測試再開發的意思!
是一種軟體開發方法,開發過程會循環以下三個步驟:

  1. 紅燈(Red):首先故意寫一個會失敗的測試。這邊聽起來很怪,但是如果不會錯,就不會知道知道寫的測試是不是「對」的。這個階段就當成是寫規格吧!老師說可以先從熟悉的中文下手,寫下來清楚的功能目的,再試著轉換成程式碼。
  2. 綠燈(Green):仔細閱讀錯誤訊息,一直修修改改,然後試著讓這個測試通過。
  3. 重構(Refactor):最後,優化已有的程式碼,同時確保測試仍然能夠通過。接著再寫其他新的測試!

這個循環會持續到軟體功能開發完成。

為什麼要用 TDD?

  • 確保程式功能正確:因為先寫測試,所以可以確保開發出來的功能是符合需求的。
  • 簡化除錯:測試提供了一個很好的除錯工具,可以很快地知道哪部分的程式碼出了問題。
  • 促進重構:有了一個好的測試套件,你可以更有信心地進行程式碼重構。
  • 文件:測試本身就是一種很好的文件,新的開發者可以透過測試更快地瞭解程式碼的功能。這個運用在團隊開發上也會有很好的效果,接手的同伴可以好上手繼續開發、維護或是重構優化。

TDD in Rails:RSpec & MiniTest

在 Rails 中,最常見的是用 RSpec 和 MiniTest 來進行 TDD。

  • RSpec:提供了更多自然語言式的語法,使得測試更容易閱讀和編寫。
  • MiniTest:是 Rails 的預設測試框架,但功能也相對較少。

老師說最大的不同除了是語法上的易讀性,工具比喻起來 RSpec 像是 word ; MiniTest 像是記事本。

其他工具和資源

  • FactoryBot:生成測試資料。
  • Capybara:模擬 user 在網頁瀏覽器中的行為,如點擊按鈕、填寫表單等。它常用於功能測試和整合測試。
  • SimpleCov:用於測量測試覆蓋率。它會告訴你哪些程式碼行已經被測試,哪些還沒有,幫助你提高測試的全面性。
  • Database Cleaner:清理資料庫,確保每次測試都是在乾淨、一致的狀態下進行。
  • WebMock:模擬 HTTP 請求和響應,這樣就不必依賴外部服務(需要與第三方服務(例如 API、資料庫或其他跨伺服器服務)進行互動)。
  • VCR:可以錄製測試中發出的所有 HTTP 請求和收到的響應。之後可以重播這些錄製的請求和響應,這樣在未來的測試中就不需要實際發送 HTTP 請求。

下一篇!
直接來寫測試範例!


上一篇
vol. 21 Rails 的「測試-測試-測試!」(上)
下一篇
vol. 23 Rails 的「測試-測試-測試!」:筆試直接寫起來!(下)
系列文
富士大顆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言