此專案使用 Robot Framework 實現 SWAG 平台的自動化測試,包含 Web UI 測試和 API 測試。
作者:Jason Lee
聯絡方式:crazy85128x@gmail.com
- Windows 10/11
- macOS 10.15+
- Linux (Ubuntu 20.04+)
- Python 3.12.x 或以上
- pip (Python 套件管理工具)
- Chrome 瀏覽器 (最新版本)
- Git
# 1. 安裝 Python 3.12.x
# 從 https://www.python.org/downloads/ 下載並安裝
# 2. 克隆專案
git https://github.com/JasonLeeSwag/swag_Automation_QA
cd swag_Automation_QA
# 3. 建立虛擬環境
python -m venv venv
.\venv\Scripts\activate
# 4. 安裝依賴套件
pip install -r requirements.txt
# 1. 安裝 Python 3.12.x
# macOS:
brew install python@3.12
# Linux:
sudo apt-get install python3.12
# 2. 克隆專案
git clone https://github.com/crazy85128x/SWAG-Automation-QA
cd swag_Automation_QA
# 3. 建立虛擬環境
python3 -m venv venv
source venv/bin/activate
# 4. 安裝依賴套件
pip install -r requirements.txt
swag_Automation_QA/
├── TestCase/ # 測試案例
│ ├── login/ # 登入相關測試
│ │ ├── Login.robot # UI 登入測試
│ │ └── Login_API.robot # API 登入測試
│ ├── myprofile/ # 個人資料相關測試
│ │ └── Myprofile.robot
│ ├── register/ # 註冊相關測試
│ │ ├── Register.robot # UI 註冊測試
│ │ └── Register_API.robot # API 註冊測試
│ └── video/ # 影片相關測試
│ └── Video.robot
│
├── keyword/ # 關鍵字定義
│ └── swag/
│ ├── Swag.sources.robot # 共用資源定義
│ ├── component/ # 共用元件
│ │ └── Swag_Footer.robot
│ ├── domain/ # 領域服務
│ │ └── Swag_LoginService.robot
│ └── page/ # 頁面物件
│ ├── Swag_Home.robot
│ ├── login/
│ │ └── Swag_Login.robot
│ ├── myprofile/
│ │ └── settings/
│ │ └── Swag_Settings.robot
│ ├── register/
│ │ └── Swag_Register.robot
│ └── video/
│ └── Swag_Video.robot
│
├── robotframework/ # 框架核心組件
│ ├── API/ # API 測試框架
│ │ ├── API.robot
│ │ └── api_sources.robot
│ ├── browser/ # 瀏覽器操作相關
│ │ ├── AlertAction.robot
│ │ ├── BrowserAction.robot
│ │ └── ... (其他瀏覽器相關操作)
│ ├── robot_lib/ # Python 自定義庫
│ │ ├── Calculate.py
│ │ ├── Chrome.py
│ │ └── ... (其他 Python 模組)
│ └── utilities/ # 工具類庫
│ ├── FileUtils.robot
│ ├── StringUtils.robot
│ └── ... (其他工具類)
│
├── reports/ # 測試報告
│ ├── login_api_report_*.txt
│ └── register_api_report_*.txt
│
├── TestData/ # 測試資料
│ ├── test_data01.jpg
│ └── test_data02.jpg
│
├── data/ # 測試資料目錄
├── country.yaml # 國家設定
├── data.yaml # 基礎測試資料
├── qat_domain.yaml # 測試環境配置
├── requirements.txt # 依賴套件清單
└── README.md # 專案說明文件
- 存放所有測試案例檔案
- 依功能模組分類組織
- 每個測試檔案對應一個具體功能模組的測試
- component/: 存放可重用的頁面元件
- page/: 依照頁面功能分類的頁面物件
- domain/: 業務邏輯相關的服務層
- Swag.sources.robot: 共用資源定義
- test_data/: 測試所需的資料檔案
- config/: 環境配置相關檔案
- api/: API測試相關資料
- drivers/: 瀏覽器驅動程式
- scripts/: 輔助腳本檔案
- logs/: 測試執行日誌
- reports/: 測試報告
- screenshots/: 測試失敗時的截圖
- 測試案例檔案:使用功能名稱,如
Login.robot
- 頁面物件檔案:加上
Swag_
前綴,如Swag_Login.robot
- 共用元件檔案:同樣加上
Swag_
前綴,如Swag_Footer.robot
- 設定檔案:使用小寫字母,如
data.yaml
- requirements.txt: 列出所有 Python 依賴套件
- README.md: 專案說明文件
- .gitignore: Git 版本控制忽略規則
本專案使用 GitHub Actions 實現自動化測試,支援以下觸發方式:
-
排程執行
- 每週一上午 9 點自動執行
- 執行環境:UAT
- 執行範圍:BVT 測試
-
Pull Request 觸發
- 條件:PR 包含特定標籤
- 支援兩種標籤模式:
fulltest
:執行完整測試套件e2e
:根據 PR 標題智能選擇測試範圍
- 標題關鍵字對應:
login/sign-in → 執行登入測試 register/sign-up → 執行註冊測試 video/stream/rtc → 執行影片測試 profile/account → 執行個人資料測試
-
手動觸發
- 支援參數:
- 測試環境:QAT/UAT
- 測試類型:bvt/login/register/video/myprofile
- 自定義網域:支援多種格式
完整 URL:https://v3-210.app.swag.live/?lang=zh-TW 域名:v3-210.app.swag.live 版本號:v3-210 子版本:v3-210.1
- 支援參數:
測試執行完成後會生成以下格式的報告:
[狀態圖示]-test-results-[測試類型]_Total[測試案例數]_[時間戳記].zip
例如:
- ✅PASS-test-results-login_Total15_20241211_153000.zip
- ❌FAIL-test-results-register_Total12_20241211_153000.zip
報告內容包含:
- 測試執行日誌(log.html)
- 測試結果報告(report.html)
- 測試執行記錄(output.xml)
專案的自動化測試工作流程定義在 .github/workflows/cicd.yml
中,主要包含:
-
工作流程觸發條件
on: schedule: - cron: '0 9 * * 1' pull_request: types: [opened, synchronize, reopened, labeled] workflow_dispatch: # 手動觸發時的輸入參數配置
-
主要工作(Jobs)
pr_test
:處理 PR 觸發的測試manual_scheduled_test
:處理手動和排程觸發的測試
-
環境設定
- 支援 QAT/UAT 環境切換
- 支援自定義測試網域
- 自動備份和還原配置文件
-
結果處理
- 詳細的測試案例執行統計
- 自動化測試報告生成
- 測試結果存檔
# 執行特定 API 測試標籤的測試
robot TestCase/login/Login_API.robot
# 執行全部 API 測試標籤的測試
robot -i api TestCase/
# or 執行全部檔案名稱內有包含 _API 的測試
robot TestCase/**/[*_API]*.robot
# 執行特定測試檔案
robot -V data.yaml -V country.yaml -V qat_domain.yaml -i login TestCase
robot -V data.yaml -V country.yaml -V qat_domain.yaml -i register TestCase
robot -V data.yaml -V country.yaml -V qat_domain.yaml -i video TestCase
# 執行全部測試檔案
robot -V data.yaml -V country.yaml -V qat_domain.yaml -i bvt TestCase
測試執行時需要配置以下 YAML 檔案:
- data.yaml: 基本測試資料
- country.yaml: 國家/地區設定
- qat_domain.yaml: 測試環境網域設定
- 頁面元素定位統一管理
- 關鍵字應具有良好的抽象層級
- 測試案例應保持獨立性
- 避免硬編碼測試數據
- 頁面 URL:
url
- 頁面標題:
title
- 頁面標題文字:
page_heading
- 按鈕元素:
xxx_btn
- 連結元素:
xxx_link
- 輸入欄位:
xxx_input
- 點擊動作:
點擊xxx
(例如:點擊登入按鈕、點擊選單) - 選擇動作:
點選xxx
(用於選項類操作,例如:點選性別選項、點選國家) - 輸入動作:
輸入xxx
(例如:輸入帳號、輸入密碼) - 清除動作:
清除xxx
(例如:清除輸入欄位、清除搜尋框)
- 檢查動作:
檢查xxx
(檢查特定元素或狀態,例如:檢查頁面標題、檢查錯誤訊息) - 確認動作:
確認xxx
(確認特定條件或結果,例如:確認登入成功、確認訂單成立) - 驗證動作:
驗證xxx
(較嚴謹的檢查,例如:驗證表單資料、驗證計算結果) - 判斷動作:
判斷xxx是否xxx
(回傳布林值,例如:判斷按鈕是否可點擊、判斷元素是否存在)
- 前往動作:
前往xxx頁面
(例如:前往首頁、前往設定頁面) - 切換動作:
切換至xxx
(例如:切換至新視窗、切換至iframe) - 捲動動作:
捲動至xxx
(例如:捲動至頁面底部、捲動至特定元素) - 重整動作:
重整xxx
(例如:重整頁面、重整資料)
- 取得動作:
取得xxx
(例如:取得表格資料、取得使用者資訊) - 設定動作:
設定xxx
(例如:設定預設值、設定測試環境) - 儲存動作:
儲存xxx
(例如:儲存表單資料、儲存設定) - 刪除動作:
刪除xxx
(例如:刪除測試資料、刪除暫存檔)
- 等待動作:
等待xxx
(例如:等待頁面載入、等待元素出現) - 暫停動作:
暫停xxx秒
(明確的等待時間,例如:暫停3秒)
- 登入相關:
執行xxx登入
(例如:執行一般會員登入、執行管理者登入) - 登出相關:
執行登出
(例如:執行系統登出、執行強制登出) - 流程相關:
完成xxx流程
(例如:完成註冊流程、完成購物流程)
- 保持一致性:相同類型的操作使用相同的動詞
- 具體明確:清楚描述動作的目的和對象
- 適當抽象:避免過於具體的實作細節
- 使用中文:統一使用繁體中文命名
- 避免縮寫:除非是普遍認可的縮寫,否則使用完整名稱
執行一般會員登入
輸入帳號 ${USERNAME}
輸入密碼 ${PASSWORD}
點擊登入按鈕
確認登入成功
填寫個人資料表單
輸入姓名 ${NAME}
點選性別選項 男
輸入生日 ${BIRTHDAY}
點擊送出按鈕
確認資料更新成功
判斷元素是否存在
[Arguments] ${element}
${status}= Run Keyword And Return Status Element Should Be Visible ${element}
[Return] ${status}
這樣的命名規則更加系統化和完整,可以幫助團隊成員:
- 更容易理解每個關鍵字的用途
- 保持程式碼風格的一致性
- 提高測試案例的可讀性和可維護性
- 降低撰寫新測試案例的學習曲線
如遇到 WebDriver 相關問題,請確認:
- Chrome 瀏覽器版本是否最新
- WebDriver 版本是否與 Chrome 版本匹配
- WebDriver 是否已正確安裝在系統路徑中
- 檢查網路連接狀態
- 確認測試環境是否正常
- 查看詳細的測試報告和日誌
-
PR 測試未觸發
- 檢查 PR 是否有正確的標籤(e2e 或 fulltest)
- 確認 PR 標題是否包含相關關鍵字
-
手動觸發失敗
- 確認輸入參數是否正確
- 檢查目標環境是否可用
-
測試報告問題
- 確保測試過程中生成了必要的報告文件
- 檢查報告文件的權限設定
//div[@class='example'] # 使用 class 屬性
//input[@id='username'] # 使用 id 屬性
//button[contains(@class, 'btn')] # 使用 contains 函數
//div[contains(@class, 'card')][position()=1] # 使用位置函數
//table//tr[./td[contains(text(), '數據')]] # 使用文字內容
//[contains(@data-test-id, 'submit')] # 使用自訂屬性
.//div[contains(@class, 'child')] # 當前節點下搜尋
../div[contains(@class, 'sibling')] # 同層節點搜尋
//div[@class='parent' and @id='main'] # AND 條件
//div[@class='item' or @class='card'] # OR 條件
//div[starts-with(@id, 'dynamic-')] # ID 開頭匹配
//div[ends-with(@class, '-container')] # 類別結尾匹配