IT 邦鐵人賽 Day4 - TDD介紹

測試的偉大在於,當產品規模龐大時,在進行任何的系統優化、新增功能並確保原功能不被影響,這就是倚賴自動化測試。

前面花了三天的時間在說明測試的觀念與概念,接下來要介紹的是 TDDTest-Driven Development測試驅動開發

這是一套流程,先寫出測試程式碼,寫完再來開發專案程式碼,所以才叫測試驅動開發。但也不是一昧的把重點放在測試,因為 TDD 的重點是藉由測試進行開發,測試的存在是為了開發,沒有開發就沒有測試,所以重點仍是在開發上。

TDD 步驟如下:

一、製作測試、規格:

思考專案的樣子,功能與介面該如何運作,並將這些想法寫成規格,而規格下就是在測試。

二、執行測試,亮紅燈(return failed) :

完成測試程式碼的撰寫後,執行一次測試,這時會回傳一堆錯誤訊息,且會回傳failed,這是理所當然的,因為我們只寫了測試程式的程式碼,並未將實際的功能寫進去,所以通常這時跑出來的錯誤訊息就是在表示尚未加入實際的功能與介面程式碼。

三、撰寫實體的程式碼:

在這個階段就是將實際的程式碼補上。不過這時所寫的程式碼只需要能執行就好,不用再這個階段就開始用盡全力簡化你的程式碼,但仍要記得維持程式碼的可讀性,不過這不是本系列的探討重點,就無須著墨太多。

四、執行測試,亮綠燈(return passed):

寫完後就是執行測試,確認執行時都沒有跑出任何異常訊息,如果有跑出異常訊息,就跟著異常訊息的指示找bug,修正到執行測試都正常為止。

五、優化與重構 :

不論是測試的程式碼或是功能的程式碼,都一樣需要進行優化,增加程式碼的可讀性以及可維護性。

為什麼測試的程式碼也要優化?因為測試可以對專案將來的維護與新增功能時,繼續使用測試確認所做的更動是否會影響原先的功能,所以也不能忽視測試程式碼的優化。


3A 原則

Arrange

初始化參數,將測試需要的變數設定好。

1
2
3
4
5
RSpec.describe "member_login", type: :feature do
before do
user = create(:user)
end
end

Act

執行測試,包含所有的方法。

1
2
3
4
5
6
7
8
9
it "登入成功" do
visit '/'
click_on '登入'
within "div#sign_in_form" do
fill_in '電子信箱', with: User.email
fill_in '密碼', with: '123456'
end
click_on 'Log in'
end

Assert

將以上兩個步驟進行驗證。

1
expect(page).to have_content "成功登入了。"

小結

了解了 TDD 的流程後,多少有點概念了,那麼接下來我們要使用 Ruby 來操作 RSpec 測試框架,如果沒有 Ruby 與 RSpec 的讀者不用緊張,明天我們會先進行安裝的教學,讓大家也能一起操作之後的測試實際內容。