科技與技術系列 - 1: 自動化測試

更新於 發佈於 閱讀時間約 3 分鐘

這是「科技與技術系列」的第一篇文章,將介紹一些在實務中廣泛使用,但較難歸類的技術。回顧上週的《Laravel 系列 - 6: 自動化測試相關套件與使用》,我們已經探討過一些在 Laravel 框架下應用的自動化測試套件。今天,這篇文章將把焦點放在自動化測試這個概念本身,帶你了解它的核心與實際應用。

簡介

自動化測試的目的是模擬實際運行環境,確保系統在各種情境下能穩定運作。除了測試程式碼本身,還會涵蓋與其他系統互動的架構,如資料庫、外部 API 等,並考慮各種可能的使用情境。透過這些測試,我們可以確保系統在不同情況下的行為符合預期,進而提高穩定性與可靠性。

自動化測試的主要優點包括:

  • 確保程式碼在多種情境下正常運作。
  • 測試與其他系統互動時的錯誤處理,像是資料庫連線失敗時的錯誤拋出與處理。
  • 降低其他開發人員在修改程式碼過程中的失誤風險。
  • 確保方法傳遞的型別正確性,這不僅能減少開發過程中的錯誤,還能協助在版本升級時檢查潛在問題。

需要注意的是,以上優點很大程度上取決於開發者如何設計和實作測試[ 註1 ]。因此,僅僅撰寫測試並不代表一定會達到預期的效果。

步驟

曾經讀過一篇文章提到:「要先確定情境,接著寫測試,最後才寫功能。」這是因為透過情境的設計,我們可以界定功能的範圍,並確保測試能隨著功能逐步完成而逐漸成功。這樣的流程,當然是建立在一開始就決定要進行測試的前提下。

然而,在實際開發過程中,撰寫測試的時間往往並不會被納入開發時程中。因此,自動化測試通常會在功能開發完成後才補寫,或者是軟體工程師們在所剩不多的時間內匆忙完成。雖然這樣的系統在短期內可能不會顯現問題,但一旦需要重構、升級或新增功能,系統的不穩定性往往隨之而來,甚至可能導致重大問題。

模擬實例與方法 Mock

在測試過程中,我們常會遇到需要越過重重判斷條件來達成特定情境的情況,但卻難以找到符合條件的資料;或是需要某些方法回傳特定的值,但又無法輕易調整程式碼來達到這些效果。

此時,Mock 就成為一個非常有效的工具。我們可以通過 Mock 整個類別或方法,並指定它們應該回傳的值。這樣,我們就能將焦點集中在測試功能本身,而不必過多關注其他依賴的功能或資料處理。

不過,使用 Mock 時需要特別注意它的實例設定。如果出現類似「參數 must not be accessed before initialization」的錯誤訊息,通常表示某個 Mock 方法模擬的實例有誤,導致流程中需要用到的實例或方法並沒有被模擬出來,導致出現這則沒有初始化的提示訊息。

判斷回傳 ——斷言方法 Assertion

另外,每個程式語言使用斷言方法的方式有些許不同,需要稍微注意一下。

在每個測試情境的最後,我們需要使用斷言方法來判斷測試結果是否符合預期。可以進行判斷的項目非常多樣,包括回傳的狀態碼、輸出的型別,甚至是輸出的具體值等。當然,判斷的細節越多,系統發生錯誤的機會就越低,開發與維護的風險也會隨之降低。

另外,需要注意的是,不同程式語言在使用斷言方法時會有些微差異,因此在實作時要留意特定的語法與使用方法。

範例參考

由於我比較熟悉 PHP 的關係,我以 PHP 與 Laravel 框架的方式來稍微舉例。

private array $header;
protected function setUp(): void
{
//先在初始方法裡面設定這個測試類別中設置需要初始化的內容
//由於是整個類別一起初始化,所以如果像是資料庫每個情境測試完需要清空,就不能在這裡統一清空,需要在每個情境本身開始時清空
parent::setUp();
$this->header = ['CLient-ID' => 'test'];
$this->apiPath = route('api.test');
$this->mockUser();
$this->withoutMiddleware();
}

/**
* @testdox 測試XXX
*/
public function testXXX(): void
{
$data = ['message' => 'test'];
$this->mockHandle();
$this->post($this->apiPath, $data, $this->header)
->assertStatus(204);
}

private function mockUser(): void
{
$user = Mockery::mock(NormalUser::class)->makePartial();
$user->login_id = self::USER_ID;
$this->instance(NormalUser::class, $user);
}

加速自動化測試

當專案越來越大以後,對應的單元測試數量自然也會越來越多,如此一來,每次合併分支前的自動化測試時間就會越來越長。

有個簡單的方法,讓共用的非測試項目使用 Redis 和 Cache,這樣便能大幅減少重新創建新資料的時間。例如,當我們想測試一位用戶創建、更新、刪除訂單時的情境時,用戶的資料本身就是非測試項目(因為要測試的是訂單行為),那麼我們就可以創建一個 Mockery Table 並加入一筆用戶資料後,讓這三個測試共用這筆資料,而不是每個測試單獨創建、單獨使用。


[ 註1 ] 筆者曾遇過一位前輩編寫的測試,無論輸入參數為何,測試結果總是回傳 true,實在非常神奇。

參考資料

  1. https://laravel.tw/docs/4.2/testing
  2. https://ms0680146.medium.com/從零到有建立-laravel-測試-fd9d24986774
留言
avatar-img
留言分享你的想法!
avatar-img
林柏宇的沙龍
2會員
43內容數
test
林柏宇的沙龍的其他內容
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
2025/04/06
本篇文章簡要介紹自動化測試的基本概念及相關的測試套件,並探討了在CI/CD流程中整合自動化測試的重要性,及如何使用Faker和Mockery來生成測試資料和模擬物件。最後,分享了自動化測試在後端開發中的必要性與實踐建議,旨在提升程式碼品質及降低維護成本。
Thumbnail
2025/04/06
本篇文章簡要介紹自動化測試的基本概念及相關的測試套件,並探討了在CI/CD流程中整合自動化測試的重要性,及如何使用Faker和Mockery來生成測試資料和模擬物件。最後,分享了自動化測試在後端開發中的必要性與實踐建議,旨在提升程式碼品質及降低維護成本。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
經過這麼多年的觀察與實踐,一個成熟的軟體工程師還需要第四個要素,它是讓決定你通往熟手的重要關鍵沒有之一。
Thumbnail
經過這麼多年的觀察與實踐,一個成熟的軟體工程師還需要第四個要素,它是讓決定你通往熟手的重要關鍵沒有之一。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News