單元測試是在應用程式中粒度最小的測試程式,這一系列文章的一開始就先來了解什麼是單元測試。
在開發應用程式時,常會將不同職責的實作邏輯放置於不同方法中,單元測試就是以方法做為測試的範圍,來驗證程式是否與預期一樣。
在撰寫單一的單元測試程式時,除了只會針對一個方法或單一職責進行測試外,並不會包含任何邏輯實作,也不會使用到如網路、資料庫或是檔案等外部資源;且在各單元測試各自獨立,兩兩之間不會有任何的相依關係或是執行的順序性。因此在減少各種對象的相依性下,讓我們可以降低在撰寫測試程式的準備成本,進一步可以在應用程式被變更時,能更快更容易且隨時的執行測試程式來確認目標程式的正確性。
3A 原則是常在撰寫單元測試時所使用的依據,此原則說明了單元測試內應該有的三大部份:
在實務上,我們會針對目標方法所回傳的結果,或是目標物件所記錄的狀態屬性值,來驗證是否與預期相同。但是現實總是比想像來得複雜,有時候目標物件方法會進一步呼叫其他相依的物件方法,甚至使用到網路等外部資源;最常見的例子是在前端頁面中,利用 Ajax 的方法去存取後端資料。因為單元測試不會相依於外部資源,所以在驗證上則會準備模擬存取後端的假物件,進一步去驗證目標物件與此假相依物件之間的互動。
這一篇很簡單的介紹什麼是單元測試以及 3A 原則,然而實際的撰寫才真去了解理譣的概念。接下來會先說明在 Angular 應用程式中,所用於撰寫測試程式的 Jasmine 框架與執行測試程式的 Karma。