Robot Framework - 介紹一下

最近要介紹新人 Robot Framework 的時候發現自己居然沒寫過這個已經用很久的工具,所以決定來介紹一下 Robot Framework 🤩

這篇目的是讓一般人能夠看懂 Robot Framework 的文件並了解其中各個部分的目的

介紹與使用場景

Robot Framework 是一個基於 python 的 自動化框架,基本上可以用 python 達成的事情,Robot Framework 都可以做到,其應用的場景是 ATDD (Acceptance Test Driven Development)、BDD (Behavior Driven Development) 以及可以被機器化的流程。

為何使用 Robot Framework?

  • 學習資源易於取得
  • 易於理解與學習的介面
  • 已有豐富的 Keyword 可以使用

Robot Framework 對於沒有程式基礎的人來說是「相對」易於理解的,因為他有最接近人類自然語言的介面讓人閱讀,在政治條件(?)上比較能夠說服他人使用這個工具。

你通常不太需要再自行開發 Keyword 就可以完成你需要執行的自動化流程,如果需要,你也能夠透過實作 Python 來完成你需要做的事。

看懂 Robot Framework

先來張圖,這張圖是 Robot Framework 的文件,紅框的部分:

*** Settings ***

這裡是引入 library 以及初始化的地方

  • 如果你在別的 .robot 中定義好了需要被引入的 library 或是 Keywords 可以透過 Resource 來達成引入的動作
  • Suite Setup 則是在測試跑起來時會做的初始化動作

這邊幫自己挖個坑,會再發一篇 Suite Setup 跟 Test Setup 的差別。
此坑已補上: Robot Framework - Suite Setup V.S Test Setup | sqz777 der 技術小本本 - 點部落 (dotblogs.com.tw)  

看一下 settings.robot

會使用 settings.robot 來統一引入 library 的原因是為了避免 .robot 的檔案多了,每一個檔案都要重新引入那些 library 實在是麻煩,所以乾脆由一個 file 來控制需要被引入的 library,這樣簡單得多。
Variables 讓你可以直接透過檔案的形式讓你引入環境變數
Library 則是讓你可以引入 python 或是 Robot Framework 的 library
RequestsLibrary 是別人開發好的 Robot Framework 的 Library,需要使用以下指令安裝後才能使用,這個 library 可以讓我們省掉開發 Requests Keyword 的時間。

python -m pip install robotframework-requests

RequestsLibrary Keyword 使用方法的文件點我

*** Variables ***

這裡是定義這個檔案中會用到的常數

通常這裡的變數不會直接寫死在這裡,而是會在另一個檔案中定義 config.ini 之類的然後在透過變數來做取用

所以我這邊也是再挖一個坑,會再發一篇如何定義 config.ini 然後在 robot 裡面中引用那個環境變數
此坑已補上:Robot Framework - 使用 config.ini 管理環境變數 | sqz777 der 技術小本本 - 點部落 (dotblogs.com.tw)

*** Keywords ***

這裡是自定義關鍵字的地方,可以在這裡定義好關鍵字後,在 Test Case 中使用

Get Character With Beginning Of The Name,這個是 Keyword 的名稱

[Arguments] 讓 Keyword 被定義成是可以被傳入參數的,而這個參數名稱是 character_name,定義完成後即可在 Test Case 中使用

而 Keyword 再往下一層則是 python 的程式碼,以圖中行號 13 的 Get Md5 Hash 為例,這個 Get Md5 Hash 是我自行實作在 common.py 的一段 python code

P.S. common.py 已在 settings.robot 中引入。

import hashlib

def get_md5_hash(data):
    hasher = hashlib.md5()
    hasher.update(data.encode("utf-8"))
    return hasher.hexdigest()

以此為例,你可以使用 Get Md5 Hash 或是 get_md5_hash 都可以,只要文件內有統一的格式即可。

其他的 Keyword 對應官方文件有

*** Test Cases ***

這裡是定義 Test Case 的地方,會透過使用 Keyword 來組合成需要被自動化的流程

開發準備

開發前要準備的就是環境啦

  • python
  • python package: robotframework
  • python package: robotframework-requests
python -m pip install robotframework robotframework-requests

應用場景

package 安裝完成後,就可以開始寫一些需要自動化的項目了,開始寫之前先決定要做的自動化項目是什麼

  • 準備 request 過去 Marvel API 的 token 資訊,Marvel API 的 token 申請,可以參考 repo 中的 readme 
  • 透過 Marvel 的 API 取得角色名稱開頭為 "Tony" 的角色資訊
  • 唯一一個角色開頭為 "Tony" 的人就是 Tony Stark 所以必須要能取得 Tony Stark 這個名字

robot 的 Test Suite 如下

*** Settings ***
Resource    settings.robot
Suite Setup    Create Session    MARVEL_API    ${${ENV}.MARVEL_URL}

*** Variables ***
${api_private_key}=    ${${ENV}.MARVEL_PRIVATE_KEY}
${api_public_key}=    ${${ENV}.MARVEL_PUBLIC_KEY}

*** Keywords ***
Get Character With Beginning Of The Name
    [Arguments]    ${character_name}
    ${timestamp}=    Get Time    epoch
    ${hash}=    Get Md5 Hash    ${timestamp}${api_private_key}${api_public_key}
    ${params}=    Create Dictionary    ts=${timestamp}    apikey=${api_public_key}    hash=${hash}    nameStartsWith=${character_name}
    ${response}=    Get On Session    alias=MARVEL_API    url=/v1/public/characters    params=${params}    expected_status=200
    Return From Keyword    ${response}

*** Test Cases ***
Get Beginning With Tony's Character Name Info
    ${result}=    Get Character With Beginning Of The Name    Tony
    Should Be Equal As Strings    ${result.json()["data"]["results"][0]["name"]}    Tony Stark

Repo 點我

執行

若要執行指令如下

python -m robot --variable ENV:BLOG_ENV marvel.robot

執行中

執行後

在執行後可以看到 Robot Framework 產出的 report

在 report 中可以看到執行的時間與成功數量等,除此之外,你也能夠透過 report 看見執行的細節,例如 API 的 response json、該步驟的執行時間等

後記

這一篇介紹了為何要使用 Robot Framework,再到如何看懂 Robot Framework 的文件,希望大家可以因為這篇而看得懂 Robot Framework <(_ _)>

已補坑:

2021/11/16:補充執行所需的環境準備以及實際的題目應用。