第一個測試

TDD (Test-Driven Development)

書中使用 TDD 方法測試,查詢網路的時候發現幾篇有趣的文章:

關於 TDD 的教學:


測試的好處

  • 測試能避免 regression,比如因為某種原因導致之前的功能無法使用
  • 有了測試、重構(改變實作方式但功能不變)時更有自信
  • 測試就像是客戶端的程式碼一樣,可以幫助我們判定程式的設計和介面如何與系統互動

依照:Red -> Green -> Refactor

也就是先撰寫失敗的測試 (Red),再根據失敗測試提供的錯誤訊息,一步一步撰寫讓測試能通過的程式 (Green),測試通過後,便能有自信的開始重構程式碼 (Refactor)。

什麼時候該測試?

  • 如果和程式碼相比,測試程式碼比較簡短,就先撰寫測試
  • 如果對實作的功能還沒有很確定,先撰寫程式碼,再寫測試來改進實作方式
  • 安全性很重要,先為安全性的相關功能撰寫測試
  • 每當發現一個 bug,就撰寫一個測試重現這個 bug,以避免 regression,然後再重新撰寫程式碼修復這個 bug
  • 盡量不要為未來可能會變動的程式碼撰寫測試(例如 HTML結構)
  • 重構之前要撰寫測試,集中測試容易出錯的程式碼

Red

剛剛建立兩個頁面「Home」、「Help」,現在要透過撰寫測試來建立「About」頁面。

Rails 已經自動產生「Home」、「Help」的測試程式碼:

=> test/controllers/static_pages_controller_test.rb

require 'test_helper'

class StaticPagesControllerTest < ActionController::TestCase

  test "should get home" do
    get :home
    assert_response :success
  end

  test "should get help" do
    get :help
    assert_response :success
  end
end

現在幫「About」頁面增加測試程式碼:

require 'test_helper'

class StaticPagesControllerTest < ActionController::TestCase

  ..
  ..

  test "should get about" do
    get :about
    assert_response :success
  end
end

執行測試,結果是失敗 (Red):

$ rake test
3 tests, 2 assertions, 0 failures, 1 errors, 0 skips

Green

一一查看錯誤訊息,可以知道缺少了路由設定、action 設定和 tamplate。上述都設定好之後,再次執行測試,就會成功了 (Green):

$ rake test
3 tests, 3 assertions, 0 failures, 0 errors, 0 skips

Refactor

測試通過之後,便可以開始檢視、重構程式碼,把重複的地方拿掉,撰寫更簡潔的架構。