使用Robot Framework整合GitHub進行自動化測試
一、前言
前陣子聽同事聊到廠商專案使用Robot framework來做自動化測試工具,所以好奇Robot framework是什麼?並進行學習摸索,以及它是怎麼在GitHub上做到自動化執行。
二、Robot Framework
1.介紹
它是一個開源測試自動化框架,核心框架使用 Python實現,它的測試能力可以透過 Python 實作的測試函式庫來擴展,它使用關鍵字驅動的來編寫測試案例。
2.環境及套件安裝
環境:
我們使用Python來開發,所以當然要安裝Python,這邊使用的Python版本是3.11.1
套件:
需要安裝robot framework相關套件
pip install robotframework
pip install robotframework-seleniumlibrary
3.專案結構
圖一 專案結構
簡單介紹一下專案的結構,
.github:因為先在GitHub上建立分支,然後Clone到本地有案,所以會有.github的資料夾,在這個資料夾內會放置GitHub Actions會使用到的設定檔,之前會再提到
lib:這邊是用來放置額外的library或是自行開發的python檔
res:這邊是用來放置resource檔,可能是第三方套件,也可以放自行開發keyword方法的robot檔
tests:這邊是用來放置測試檔(*.robot)
requirements.txt:這個檔案是列出所需要安裝的 Python套件,內容為
robotframework == 7.2.2
robotframework-seleniumlibrary == 6.7.1
selenium == 4.31.0
4.Section
Rotbot Framework的測試檔案(*.robot)最多可以有四個section。
每個section都會用以下格式寫成: *** <section name> ***。在每個檔案中 Setting及Test Cases是必需存在。
圖二 robot section
以下來簡單介紹這四個section
(1) Setting:這邊是設定及宣告的區域,可使用Library來Import library、使用Resource來Import自定的Keyword方法,還有SetUp、TearDown、Suite Setup、Suite Teardown可用來設定Test Case開始或結束時要執行什麼Keyword。
(2) Keywords:可在此區域編寫自定的Keyword方法,可將較複雜、步驟較多或是共同步驟包裝成自定Keyword。但是要注意在Keyword的命名上避免與其他Keyword衝突。
舉個例子,在每個Test Case都會登入後進行某些功能的測試,就可以開啟瀏覽器與輸入正確帳密合成一個Keyword,這樣在Test Case中就會變的簡潔一些
調整前
*** Test Cases ***
Title Correct
Open Browser ${URL} ${BROWSER}
Input Text id=username ${username}
Input Text id=password ${password}
Click Button id=submit
Title Should Be ${title}
JobName Correct
Open Browser ${URL} ${BROWSER}
Input Text id=username ${username}
Input Text id=password ${password}
Click Button id=submit
Element Text Should Be ${jobname}
調整後
*** Keywords ***
Open Browser And Login Success
[Arguments] ${URL} ${BROWSER} ${username} ${password}
Open Browser ${URL} ${BROWSER}
Input Text id=username ${username}
Input Text id=password ${password}
Click Button id=submit
*** Test Cases ***
Title Correct
Open Browser And Login Success ${URL} ${ BROWSER } ${username} {password}
Title Should Be ${title}
JobName Correct
Open Browser And Login Success ${URL} ${ BROWSER } ${username} {password}
Element Text Should Be ${jobname}
(3)Variables:在此區域可設定變數給Test Case使用,例如url、browser類型
*** Variables ***
${URL}= http://www.google.com
${BROWSER}= chrome
(4)Test Cases:這個區域為該測試檔案的重點,使用關鍵字方法來撰寫測試案例。與驗證相關的關鍵字方法會包含Should Be、Should Not Be、Should Contain、Should Not Contain、Should Be Equal、Should Not Be Equal...。
在Test Case中可使用以下關鍵字來截圖做為測試驗證結果
Capture Element Screenshot
Capture Page Screenshot
以Capture Page Screenshot,截圖時未指定檔名時會以 selenium-screenshot-{index}.png格式自動命名,並以流水號往下延伸產生檔案。
Capture Element Screenshot,截圖時未指定檔名時會以 selenium-element-screenshot-{index}.png格式自動命名,並以流水號往下延伸產生檔案。
圖三 Screenshot keyword
(5)除了以上四個section外,還有個特別的section是「*** Comments ***」,在這個section中就會被當成註解
5.執行測試
(1)單檔執行測試
robot tests/example_test.robot
(2)多檔執行測試
robot tests/
(3)指定測試結果存放位置
測試執行完成後,會產出測試結果檔log.html、report.html、output.xml,預設存放在專案目錄,可使用以下指令指定存在位置
robot --output results/output.xml --log results/log.html --report results/report.html tests/
以上完成robot檔案的開發及測試
三、GitHub Actions
接下來就介紹如何結合GitHub來自動執行測試
當我們在GitHub有執行動作,GitHub會尋找專案中 .github/workflows/*.yml檔,並尋找目前的動作是否符合Job的執行時機。
圖四 YAML檔案內容
在yml檔中我們做兩個設定
1.on:在這個yml檔最開始有指定動作 (on:),它告知github有2個動作符合執行Job的時機
(1)push到dev分支
(2)pull_request到main分支
當然你也可以自行設定動作及分支,例如只保留push到dev或是pull_request到main分支時執行Job,或是另外建個分支讓它在被push時執行Job。
2.jobs
在jobs我們需要告知github我們使用python哪個版本,
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
並且需要安裝哪些套件,套件清單存在 requirements.txt
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
job 如何執行測試
- name: Run Robot Framework tests
run: |
mkdir -p results
robot --output results/output.xml --log results/log.html --report results/report.html tests/
測試報告上傳
- name: Upload Robot Framework Report
uses: actions/upload-artifact@v4
with:
name: robot-test-report
path: |
results/
yml檔設定完成後,接下來我們就把檔案push到GitHub的dev分支。依據yml的設定,當分支推到dev分支後,job就會執行。
我們可到GitHub查看repositories,最上方有個Action連結
圖五 GitHub repositories
點擊後進到Actions頁面,右方有個 All workflows,並顯示批次執行結果。這裡要注意一下,workfolw會以commit的comment做為workfolw的名稱。
圖六 GitHub All workflows
點擊workflow,右下方的Artifacts有個下載圖案,點擊後就可下載測試報告
圖七 測試報告下載
測試報告(report.html)
圖八 report.html
下載測試報告後,發現GitHub Actions 自動化測試時截圖,中文變亂碼
圖九 截圖中文亂碼
應該是截圖時系統沒安裝中文字型或Selenium使用的瀏覽器沒正確渲染中文字,只要在yml中加字型安裝指令
- name: Install Chinese font
run: |
sudo apt-get update
sudo apt-get install -y fonts-noto-cjk
批次重新執行後下載測試報告,截圖中的網頁中文就正常顯示了
圖十 截圖中文正常顯示
另外,有個需要特別注意的一點,在撰寫Test Case時會直接使用Open Browser讓瀏覽器啟動,方便看到執行時的結果,但是GitHub Action在執行測試時是不會開啟Browser,並且會造成job執行發生錯誤。
只要把瀏覽器設定為headless模式就可解決,我們同時也可將這段設定自定成Keywords讓其他測試檔可共用
res/mykeywords.robot
*** Keywords ***
Open Browser With Headless
[Arguments] ${url} ${browser}
${options}= Evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys
${arg}= Set Variable --headless=new
Call Method ${options} add_argument ${arg}
Open Browser ${url} ${browser} options=${options}
四、結論
雖然robot framework不是一個很新的自動化測試框架,使用上它是以Keyword方式來撰寫,對於正常程式開發者剛開始接觸時會很不習慣,並且它的執行速度會稍慢,我覺得他比較適合用在回歸測試上。在整合GitHub Actions後,因為每次執行Job都會安裝一次套件,速度上相對而言也就不是那麼快,只是勝在方便,把分支推上去就會自動執行測試。
不過它可自動產生測試報告和日誌這方面還是不錯的,而且格式清析好看,可幫助用戶快速定位和分析問題。
五、參考
https://robotframework.org/#introduction
https://robotframework.org/SeleniumLibrary/SeleniumLibrary.html
https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html
https://docs.robotframework.org/docs