第一個測試
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
測試通過之後,便可以開始檢視、重構程式碼,把重複的地方拿掉,撰寫更簡潔的架構。