今天我們要來聊聊,測試寫完之後,該如何讓測試是具有強制力,並且實際融入開發流程中,能夠持續進行迭代的方法。
在目前的工作經驗中發現在CI Pipeline中進行測試是個很好的方式,比如PR的時候就可以綁定測試的通過率或是coverage作為其中一項檢核標準,用以確保推上版控的程式碼都有進行測試。
那麼首先,什麼是CI呢?
其實 CI 和另外一個名詞是一組的,也就是 CI/CD。
CI/CD 指「持續整合(Continuous Integration)和 持續交付/部署(Continuous Delivery/Deployment)」的縮寫。
首先 持續整合(Continuous Integration)的核心概念是把開發者的Code 頻繁,定期的倂回主程式中。並且每當有人推新的 Code 上來的時候,部屬好的自動化工具會對程式碼自動進行 編譯、測試。以確保程式碼符合品質要求且不會破壞既有的功能。
CI可以幫助我們,透過每次提交就進行的測試即時發現錯誤,同時提升程式的品質。
持續交付(CD, Continuous Delivery)則是指開發完成的代碼可以隨時部署到生產環境。觸發點可以是手動抑或是排程。重點是,整個打包過程都已經自動化。
而持續部署(CD, Continuous Deployment)則是在進一步延伸,不只是打包,而是將整個自動化流程一直延伸到,自動將程式碼部署到PROD環境。CD的好處是,減少版本更新時的時間和人為操作的失誤。
那麼具體來說整個流程大概是如何執行的呢?
git commit
)並推送(git push
)到雲端的專案管理服務(ex: Azure, GitHub 等)。用一行簡單的敘述來表示 CI/CD 的話,大致上會像是這樣。
***提交程式碼 -> CI(編譯與測試) -> CD(打包和部屬) -> 在測試環境中進行驗收測試 -> 部屬到正式環境 **
在了解了CI/CD大致在做什麼之後,我們就來嘗試將我們寫好的前端測試,於Azure Pipeline中運行。而CI pipeline中,通常會以專案中的yaml檔作為執行腳本。pipeline運行的時候,就會按照yaml腳本中的步驟一步一步進行。
以下是一些常用的語法。
trigger
trigger:
branches:
include:
- main
main
分支,表示當有代碼推送到 main
分支時,Pipeline 將會自動運行。branches
: 定義要監視的分支。include
: 表示包含哪些分支來觸發 Pipeline。pool
pool:
vmImage: 'ubuntu-latest'
vmImage
: 設定要使用的虛擬機操作系統映像。可選值包括 'ubuntu-latest'
, 'windows-latest'
, 'macOS-latest'
等。steps
steps:
- task: NodeTool@0
inputs:
versionSpec: '16.x'
displayName: 'Install Node.js'
steps
包含了一系列步驟,這些步驟定義了在 Pipeline 中要執行的操作。每個步驟可以是腳本、任務或者其他操作。task
- task: NodeTool@0
inputs:
versionSpec: '16.x'
NodeTool
任務來安裝特定版本的 Node.js。task
: 指定要運行的 Azure DevOps 任務名稱。這裡使用了 NodeTool@0
,表示安裝 Node.js 工具。inputs
: 提供給任務的輸入參數。versionSpec
: 指定要安裝的 Node.js 版本,16.x
表示安裝 Node.js 16 的最新版本。script
- script: |
npm install -g @angular/cli
npm install
displayName: 'Install dependencies'
script
用於執行一段自定義的命令行腳本。在這裡,它用來安裝 Angular CLI 和項目依賴。script
: 定義要執行的命令行腳本。可以是一個或多行命令,用 |
符號表示多行腳本。displayName
: 為此步驟設置一個友好的名稱,便於在 Azure Pipelines 的 UI 中識別此步驟。下方就是一個建立pipeline的簡單操作手順:
登錄到 Azure DevOps,進入你的專案。
進入 Pipelines,然後點選 Create Pipeline。
選擇Repo
選擇 Starter pipeline,然後編輯 azure-pipelines.yml
文件。
配置 azure-pipelines.yml
這個文件用來定義 Azure Pipeline 如何運行你的 CI/CD 流程。
以Angular專案來說,CI基本會包含裝依賴、執行測試、打包測試
trigger:
branches:
include:
- main # 設定觸發分支,例如 main 分支
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
inputs:
versionSpec: '16.x' # 安裝 Node.js 的版本
displayName: 'Install Node.js'
- script: |
npm install -g @angular/cli
npm install
displayName: 'Install dependencies'
- script: |
ng lint
displayName: 'Run linter'
- script: |
ng test --watch=false --browsers=ChromeHeadless
displayName: 'Run unit tests'
- script: |
ng build --prod
displayName: 'Build Angular app'
npm install
安裝項目所需的依賴項。ChromeHeadless
,因為這是 Azure 上 CI 執行環境所需的無頭模式。azure-pipelines.yml
的編輯後,提交並推送到你的 repo。可以發現其實大部分的事情,託管平台都幫我們做好了,其實要建立pipeline是非常容易的,且大部分的託管平台都有詳細的手順和文件說明。所以我認為重要的是,了解背後為什麼要導入,概念是什麼,優劣是什麼。
到這邊我們基本上也把整個前端的開發流程跑完一輪了,希望可以做為一個敲門磚,給大家一些方向,一些關鍵字下去搜尋。其實每個階段要研究下去還有太多太多細節和知識了。讓我們一起加油!! 繼續努力精進吧!!