robot framework

使用Robot Framework整合GitHub進行自動化測試

顏俊吉 2025/06/11 14:56:18
26

一、前言

   前陣子聽同事聊到廠商專案使用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> ***。在每個檔案中 SettingTest Cases是必需存在。

    

              圖二 robot section

    以下來簡單介紹這四個section

     (1) Setting:這邊是設定及宣告的區域,可使用Library來Import library、使用Resource來Import自定的Keyword方法,還有SetUpTearDownSuite SetupSuite 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 BeShould Not BeShould ContainShould Not ContainShould Be EqualShould 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.htmlreport.htmloutput.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

 

顏俊吉