雖然我們已經讓測試可以成功地在 Github / Gitlab 上運行,但是在不同專案、不同環境,或是不同機器上,測試結果可能大相逕庭,如何確保測試環境的一致性、可控性以及可重現性,就是非常關鍵的問題,因此,我們需要利用 Docker 打造一個輕量、隔離的測試基地。
對於 Docker 的概念想更深入研究的玩家們,推薦參考小賴的《Docker 實戰 6堂課:56個實驗動手做,掌握 Linux 容器核心技術》,這邊就不多作探討。
前一篇我們在建立 GitLab CI/CD 流程時有提到 Playwright 官方的 Docker image,在 Microsoft Artifact Registry 頁面可以看到每一個版本都會發布三個 tags 的 Docker image,主要差異在於 Ubuntu 版本不同,由後綴就能直接對應到代號相同的 Ubuntu 版本。
例如目前最新的 v1.55.1 版本,會釋出:
v1.55.1
- 建立在 Ubuntu 24.04 LTS (Noble Numbat)
作業系統之上v1.55.1-noble
- 建立在 Ubuntu 24.04 LTS (Noble Numbat)
作業系統之上v1.55.1-jammy
- 建立在 Ubuntu 22.04 LTS (Jammy Jellyfish)
作業系統之上準備好之後,我們就來打造 Docker 環境吧!
docker run --rm -it --ipc=host -v "<本機路徑>:<容器路徑>" mcr.microsoft.com/playwright:v1.55.1-noble bash
如果沒有本地沒有對應的 image ,會自動 pull 下來:docker run
Docker 指令,啟動一個新的容器--rm
關閉容器後自動刪除-it
進入容器並操作命令列-v <本機路徑>:<容器路徑>"
掛載專案目錄到容器內,請自行將本機路徑替換成自己的專案目錄路徑,容器路徑可設定為你喜歡的路徑或資料夾名稱--ipc=host
允許容器與主機共享 IPC namespace (稍微降低隔離性,但可避免高負載情況下遇到 shared memory 限制導致測試不穩定)mcr.microsoft.com/playwright:v1.55.0-noble
指定的 Docker image/bin/bash
進入 bash shellroot@<container ID>:/#
表示順利進入容器cd /<容器路徑>
進入剛剛掛載好專案的容器路徑裡npm ci
使用 package-lock.json 安全且可重現地安裝 node 套件npx playwright install --with-deps
安裝 Playwright 的瀏覽器與系統相依套件npx playwright test
就能看到開始執行測試,執行完畢會顯示測試結果:在執行 npm ci
這個步驟時,可能會出現以下錯誤訊息:
這個問題困擾了我好一陣子,我的本機 npm 版本已經更新了,但每次執行都還是會出現這個問題。
後來才終於搞懂,這是因為我們執行的 npm
不是本機的版本,而是 container 裡 Playwright 官方的 image,所以我們使用的是 image 裡內建的 npm 版本,因此需要先在容器內手動升級 npm ,才能順利繼續往下執行。
其實這正好體現了 Docker container 的環境隔離特性,本機環境的設定與套件不會汙染 container,確保每次啟動 container 時都能擁有一個乾淨且可重現的執行環境。
到這裡,我們已經學會如何透過 Docker 打造一個輕量的測試環境,接下來,要更進一步運用 Dockerfile 來建立測試環境,提高環境一致性與可重現性。