Robot Framework คืออะไร?
Robot framework คือเครื่องมือสำหรับทำ automated testing ที่สามารถเขียน script ได้ใกล้เคียงกับภาษามนุษย์มากที่สุด ซึ่งนั่นทำให้การใช้งาน Robot framework นั้นง่ายมากๆ
ในบทความนี้เราจะแบ่งออกเป็นหัวข้อต่างๆ ดังนี้
- ทำไมต้องใช้ Robot Framework
- Robot Framework vs Selenium
- ติดตั้ง Robot Framework
- เริ่มต้นใช้งาน Robot Framework
ทำไมต้องใช้ Robot Framework
ก่อนจะเข้าไปที่วิธีใช้งานเราลองมาดูข้อดีของ Robot Framework กันก่อน
-
Cross-Platform สามารถ run ได้ทั้ง MacOS, Linux และ Windows
-
ภาษาที่เขียนเหมือนภาษามนุษย์มากๆ เช่น
Open Browser https://www.amazon.com chrome Wait Until Page Contains Spend less. Smile more Close Browser
ในบรรทัดนี้เป็นการสั่งให้ chrome เปิด browser ขึ้นมาแล้วเข้าไปที่ https://www.amazon.com หลังจากนั้นรอจนกว่าใน page จะมีคำว่า “Spen less. Smile more” และปิด browser
การทำงานของ Robot Framework เราจะใช้ Keywords เป็นหลัก เช่น Open เป็น keyword ที่เราใช้สั่งให้เปิด browser ซึ่งชุดของ Keywords จะถูกเก็บอยู่ใน Library
ข้อควรระวัง หลังจาก Keywords ต้องใช้ TAB ในการคั่น parameters แต่ละตัว ห้ามใช้ SAPCE
-
มี Third-party Library ให้เลือกใช้เยอะมากๆ ดังนั้นเราสามารถนำ Robot Framework ไปทดสอบ API, Database หรือ Mobile ได้ด้วย Library เหล่านี้
นอกจากการทดสอบ function การทำงานของระบบแล้วเรายังสามารถนำเอา Robot Framework ไปทำ Automated Security Testing ได้อีกด้วย โดยใช้ SSHLibrary ในการ remote เข้าไป execute command ในเครื่อง server
-
เลือก test ที่จะ run ได้ง่าย(ใช้การกำหนด tag ให้กับ test cases)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
*** Test Cases *** User can search for products [Documentation] This is some basic info about the test [Tags] Smoke Open Browser http://www.amazon.com chrome ... Close Browser User can view a product [Documentation] This is some basic info about the test [Tags] Smoke Open Browser http://www.amazon.com chrome ... Close Browser
-
มีรายงานสรุปผลออกมาเป็น XML และ HTML สามารถนำไปใช้ต่อได้ง่าย ซึ่งถ้าเกิดปัญหาเราสามารถเข้าไปดู Test Execution Log ด้วยการกดปุ่ม Log ที่มุมขวาบนในหน้า report ซึ่งจะรายละเอียดของการ execution แต่ละคำสั่งออกมาแบบนี้
-
สามารถ Capture screen เมื่อมีข้อผิดพลาด
-
สามารถพัฒนา library ขึ้นมาใช้งานเองได้ด้วย python
การทำงานของ Robot Framework คือการเขียนไฟล์ .robot ขึ้นมาหลังจากนั้น Robot Framework จะไปเรียกใช้งาน library ที่อยู่ด้านล่าง ซึ่ง Robot Framework นั้นมี Library ให้เลือกใช้เยอะมากๆ
Robot Framework vs Selenium
Robot Framework เป็นแค่ภาษาที่ไปเรียกใช้งาน Selenium ด้านล่าง ผ่านทาง Selenium Library ซึ่งคนที่ควบคถมการทำงานของ browser คือ Selenium ไม่ใช่ Robot Framework
ส่วนใหญ่เราจะนิยมนำ Robot Framework ไปใช้ทดสอบ Web Application เราจึงต้องติดตั้ง SeleniumLibrary ก่อนใช้งาน ซึ่งใน SeleniumLibrary จะบรรจุคำสั่งต่างๆเหล่านี้
- Open Browser สั่งให้เปิด browser
- Close Browser สั่งให้ปิด browser
- Wait Until Page Contains รอจนกว่าจะมีข้อความที่เรากำหนดแสดงขึ้นมาใน page
- Wait Until Page Does Not Contain รอจนกว่าจะไม่มีข้อความนี้ เช่น รอจนกว่าจะไม่มีคำว่า Please wait เป็นต้น
- Wait Until Page Contains Element รอจนกว่าจะมี HTML element นี้
- Wait Until Page Does Not Contain Element รอจนกว่าจะไม่มี HTML element นี้
- Input Text สำหรับการ input ข้อความลงไปใน textbox ที่เรากำหนด
- Button Click สั่งให้ click ปุ่มที่เราต้องการ
นอกจากนี้ยังมีคำสั่งอื่นๆอีกมากมายคุณสามารถเข้าไปดูเพิ่มเติมได้ที่ Selenium Library References
และนอกจาก Selenium Library แลัวยังมี Library อื่นๆอีกหลายตัวเลยทีเดียว ลองดูรายชื่อของ Library ต่างๆได้ที่ Robot Framework Libraries
ติดตั้ง Robot Framework
ถึงเวลาที่เราจะเริ่มต้นติดตั้ง Robot Framework กันแล้ว สิ่งที่ต้องติดตั้งมีดังนี้
-
ติดตั้ง Python และ PIP
- เราสามารถติดตั้ง Python ด้วยการ Download python installer ได้ที่นี่(เลือกตาม OS ที่เราใช้งานอยู่)
-
ติดตั้ง Robot Framework
เมื่อเราติดตั้ง Python และ PIP เสร็จเรียบร้อยแล้ว ขั้นตอนต่อไปเราก็จะติดตั้ง Robot Framework ด้วยคำสั่ง
$ pip install robotframework
ถ้าเราต้องการ upgrade Robot Framework เราจะใช้คำสั่ง
$ pip install --upgrade robotframework
หลังจากขั้นตอนนี้เราจะสามารถตีความไฟล์ .robot ได้แต่จะยังไม่สามารถ ควบคุมการทำงานของ browser ได้
-
ติดตั้ง Selenium Library
ในขั้นตอนนี้เราจะต้องติดตั้ง Selenium Library เพื่อให้เราใช้ความสามารถของ Selenium เพื่อควบคุมการทำงานของ browser โดยที่เราจะใช้คำสั่ง
$ pip install robotframework-seleniumlibrary
หรือถ้าต้องการ update ให้ Selenium Library เป็น version ใหม่เราจะใช้คำสั่ง
$ pip install --upgrade robotframework-seleniumlibrary
-
ติดตั้ง Selenium Webdrivers
Selenium Webdrivers คือ driver ที่จะเข้าไปควบคุมการทำงานของ browser ซึ่งเราต้องติดตั้งแยกตาม browser ที่เราต้องการทดสอบ
- ถ้าเราต้องการใช้ Chrome เราก็จะต้องติดตั้ง Chrome Webdriver
- ถ้าเราต้องการใช้งาน Firefox เราต้องติดต้ัง Geckodriver
- ถ้าเราต้องการใช้งาน Microsoft Edge เราต้องติดต้ัง Edge Webdriver
Robot Resources
หนึ่งในข้อดีของการใช้งาน Robot Framework คือเรามีเครื่องมือและ library ที่จะช่วยให้เราทำงานได้ง่ายขึ้น ซึ่งจะแบ่งออกเป็น 3 กลุ่ม ดังนี้
- Built-in เป็นกลุ่มของ Libraries ที่ติดตั้งมาพร้อมกับ robot framework
- Libraries เป็นกลุ่มของ Library ที่ไม่ได้รวมอยู่ใน Framework
- Tools เป็นเครื่องมืออื่นๆ ที่จะช่วยให้การทำงานกับ Robot Framework นั้นง่ายขึ้น
Built-in
เป็นกลุ่มของ Libraries ที่ติดตั้งมาพร้อมกับ robot framework เราสามารถเรียกใช้งานได้เลยไม่ต้องติดตั้งเพิ่ม ซึ่งจะประกอบไปด้วย Libraries หลักๆที่เราต้องรู้จักไว้ ดังนี้
Builtin
ตัวนี้จะเป็นกลุ่มของ Keywords หลักๆ ที่เราต้องใช้แน่ๆ เราสามารถใช้งาน keywords ในกลุ่มนี้ได้เลย ไม่ต้อง import keywords ที่อยู่ในกลุ่มนี้ตือ
- Should Be Empty
- Should Contain
- Should End With
- Variable Should Exists
Collections
เป็นกลุ่มของ keywords ที่ใช้จัดการกับ Lists และ Dictionaries ใน python ตัวอย่างของ keywords หลักๆในกลุ่มนี้คือ
- Append To List
- Dictionary Should Contain Item
- Remove From List
- SortList
เราจะเรียกใช้งาน Collections โดยระบุ Library ไว้ใน Settings แบบนี้
*** Settings ***
Library Collections
DateTime
เป็นกลุ่มของ keywords ที่ทำงานกับวันที่ ซึ่งจะประกอบไปด้วย keywords หลักๆ ดังต่อไปนี้
- ConvertDate
- Get Current Date
- Subtract Date From Date
เราจะเรียกใช้งาน DateTime โดยระบุ Library ไว้ใน Settings แบบนี้
*** Settings ***
Library DateTime
Operating System
เป็นกลุ่มของ keywords ท่ี่ทำงานกับ Operating System(OS) ซึ่ง keywords หลักๆท่ี่อยู่ในกลุ่มนี้ตือ
- Create Directory
- Create File
- Copy File
- Directory Should Exists
- File Should Not Exists
เราจะเรียกใช้งาน Operating System โดยระบุ Library ไว้ใน Settings แบบนี้
*** Settings ***
Library OperatingSystem
นอกจากนี้ยังมี Built-in Library อื่นๆอีกมากมายเช่น ScreenShot, String และอื่นๆ
Robot Framework Libraries
อย่างที่เล่าให้ฟังว่า Robot Framework นั้นมี Library ให้เราเลือกใช้เยอะมากๆ ดังนั้นผมได้เลือก Library ที่เราน่าจะได้ใช้ ยกเว้น Selenium Library ที่เราพูดถึงกันไปก่อนหน้านี้แล้ว มาเป็นทางเลือกในการใช้งาน
RPA Framework
เป็นกลุ่มของ Library ที่เป็น Open-Source ที่เราสามารถนำมาใช้งานได้ข้างในจะมี libraries ย่อยๆข้างในเช่น
- JSON
- Excel.Files
- Cloud.AWS
และอื่นๆอีกมากมายเข้าไปดู RPA Framework ต่อได้ที่นี่
Requestslibrary
สำหรับการทดสอบ API ซึ่งจะใช้ RequestLibrary ในการส่ง Http Request ไปยัง API และจัดการกับ Data ด้วย Collections ซึ่งอยุ่ใน Built-in ที่เราพูดถึงไปก่อนหน้านี้ Keywords หลักๆที่อยู่ใน RequestLibrary มีดังต่อไปนี้
- GET, POST, PUT, PATCH, DELETE
- Create Session
- Status Should Be
DatabaseLibrary
เป็น Library ที่ใช้ในการทดสอบ database ซึ่งจะใช้การ query ของมูลออกมาแล้วทำการทดสอบว่า โครงสร้างของ database หรือ data ที่มีอยู่ใน database นั้นตรงกับที่ต้องการหรือไม่ keywords ต่างๆ ที่อยู่ใน DatabaseLibrary มีดังต่อไปนี้
- Connect To Database
- Query
- Row Count
- Table Must Exists
AppiumLibrary
เป็น Library ที่ใช้สำหรับการทดสอบ Mobile Application ซึ่งรองรับทั้ง iOS และ Android ซึ่งตัวอย่างของ keywords ที่อยู่ใน AppiumLibrary มีดังต่อไปนี้
- Open Application
- Click Element
- Element Text Should Be
BrowserLibrary
เป็นรูปแบบการทดสอบที่มาใหม่ในปี 2021 เราจะใช้ PlayWrite(เราต้องติดตั้ง NodeJs เพิ่ม) ซึ่งตอนนี้ PlayWrite ถือได้ว่าเป็นน้องใหม่ที่น่าจับตามากเลยทีเดียว Keywords ที่อยู่ใน BrowserLibrary มีดังต่อไปนี้
- New Browser
- New Page
- Get Text
- Get Console Log
อ่านบทความเรื่อง End-To-End Testing ด้วย Playwright ต่อได้ที่นี่
SSHLibrary
เราสามารถ execute command บน remote server ผ่านทาง secure shell(ssh) โดยใช้ SSHLibrary ซึ่งส่วนใหญ่เราจะนำไปใช้ในการทำ Automated Security Testing และ Keyword หลักๆที่อยู่ใน SSHLibrary มีดังต่อไปนี้
- Open Connection
- Login
- Execute Command
- File Should Exist
การใช้งาน Libraries
สำหรับกลุ่มที่ไม่ใช่ built-in เราจำเป็นจะต้องติดตั้งก่อนใช้งาน เหมือนที่เราติดตั้ง SeleniumLibrary ในขั้นตอนที่ 4 ในขั้นตอนการ ติดตั้ง Robot Framework ด้านบน
Robot Framework Tools
Robot Framework มีเครื่องมือที่จะช่วยให้เราทำงานได้ง่ายขึ้นอยู่หลายตัว แต่ที่เราต้องทำความรู้จักไว้มีอยู่ 3 ตัวด้วยกันคือ
1. RIDE
เป็น GUI สำหรับผู้ที่ไม่ถนัดเขียน Code เราสามารถสร้าง robot script และจัดการกับ data ของ robot ได้โดยใช้ RIDE ในการจัดการ
เราจะใช้ PIP ในการติดตั้ง RIDE โดยใช้คำสั่ง
$ pip install robotframework-ride
บน Windows เราจะต้องเข้าไปเพิ่ม Path ใน Environment Variables แล้วเพิ่ม Folder นี้เข้าไป
C:\ProgramFiles\Python\Scripts
หรือบางเครื่องอาจอยู่ที่ AppData
C:\Users\[username]\AppData\Local\Programs\Python\Python36\Scripts
หลังจากนั้นให้เราเข้าไปยัง folder ที่มี Robot Test Script(.robot) แล้วก็ run คำสั่ง
$ python ride.py
2. robot commad
เป็น command line ที่ใช้ run robot script ซึ่งคำสั่งที่เราใช้ในการ run robot script ซึ่งหลังจากที่เราติดตั้ง robot framework เราจะได้ robot command ซึ่งมี options ต่างๆให้เราเลือกใช้งานดังนี้
- Run robot script
หรือถ้าจะ run ทุกๆไฟล์ใน folder ปัจจุบัน เราจะใช้คำสั่ง
$ robot hello.robot
$ robot .
- Run เฉพาะ Test cases ที่กำหนด Tag เป็น smoke
$ robot -i smoke .
- Run robot script โดยระบุ folder ที่จะเอา report ไปวาง ในตัวอย่างนี้ให้วางไว้ใน folder reports
$ robot -d reports .
- Rerun เฉพาะ case ที่ Fail
เราต้องโยน output ที่มี Failure(output.xml) เข้าไปด้วย
$ robot --rerunfailed ./reports/output.xml .
3. Plug-ins หรือ Linter สำหรับ IDE
หลังจากนี้เมื่อเราต้องเขียน Robot script เราจำเป็นต้องมี plugins ที่เป็นตัวช่วยเหลือระหว่างการเขียน script คอยเตือนว่าเราเขียนผิดตรงไหน แต่ละ Library มี Keywords อะไรบ้าง ดังนั้นในการทำงานจริง แนะนำให้ติดตั้ง Robot Framework plugins หรือ extensions สำหรับ IDE ที่เราใช้งานอยู่
ในตัวอย่างนี้เราขอแนะนำ Robot Framework Language Server สำหรับผู้ที่ใช้งาน VSCode
เริ่มต้นเขียน Script ใน Robot Framework
ในตัวอย่างนี้เราจะเริ่มจากการเขียน Script ง่ายๆโดยจะทำการค้นหาสินค้าใน Amazon.com
เริ่มจากการสร้าง script โดยส่วนใหญ่เราจะแบ่ง folders ออกเป็น 3 folders ดังต่อไปนี้
├── amazon
│ ├── Resources
│ ├── Results
│ ├── Tests
- Resources เวลาเราเขียน Keywords ซ้ำกันบ่อยๆ เราจะยุบมาเป็น Keywords ใหม่(เหมือนเขียน function เพื่อใช้ซ้ำ) หลังจากนั้นเราจะนำมารวมกันไว้ใน Folder นี้
- Results ใช้เก็บผลลัพธ์ที่ได้จากการทดสอบ เช่น output.xml, log.html หรือ report.html
- Tests ใน folder นี้จะเป็น folder หลักที่เก็บไฟล์ .robot ที่จะถูกเรียกใช้ใน robot command
และในตัวอย่างนี้ ผมจะตั้งชื่อไฟล์ที่ใช้ทดสอบ(Test Suite)ว่า amazon-search-products.robot และเก็บไว้ใน folder Tests โดยที่ใส่เนื้อหาเข้าไปดังนี้
การจัดแบ่งไฟล์เราจะรวมการทดสอบที่มีจุดประสงค์เดียวกันไว้ในไฟล์เดียวกันเรียกว่า Test Suite และในไฟล์นี้จะแบ่งออกเป็น Test cases หลายๆ Test Cases
Settings
ส่วนแรกเป็นการ Load Library, Resources และ Information ต่างๆที่เราจะใช้อธิบายจุดประสงค์ของการทดสอบ ในตัวอย่างนี้เราจะเรียกใช้ SeleniumLibrary และ Collections เราจึงต้องกำหนด Settings แบบนี้
*** Settings ***
Documentation คำอธิบายของ Test Suite
Library SeleniumLibrary
Library Collections
Test cases
หลังจากนั้นเราจะสร้าง Test Case สำหรับการทดสอบแต่ละกรณี ดังนี้
*** Test Cases ***
User can search for products
[Documentation] This is some basic info about the test
[Tags] Smoke
Open Browser https://www.amazon.com chrome
Wait Until Page Contains Shop by
Input Text id=twotabsearchtextbox robot framework
Click Button xpath=//*[@id="nav-search-submit-button"]
Wait Until Page Contains results for "robot framework"
Close Browser
User can view a product
[Documentation] This is some basic info about the test
[Tags] Smoke
Open Browser https://www.amazon.com chrome
Wait Until Page Contains Shop by
Input Text id=twotabsearchtextbox robot framework
Click Button xpath=//*[@id="nav-search-submit-button"]
Wait Until Page Contains results for "robot framework"
Click Link css=#result_0 a.s-access-detail-page
Wait Until Page Contains Back to search results
Close Browser
หลังจากนี้เราสามารถทำการทดสอบ Test Suite นี้ได้ด้วยคำสั่ง
$ cd amazon
$ robot -d Results Tests/amazon-search-products.robot
Variables
จากตัวอย่างด้่นบน เราต้องเขียน URL ซำ้กันหลายครั้ง ทำให้เปลี่ยนแปลง URL ได้ยาก เช่นถ้าอยากเปลี่ยนไป test บน localhost หรือ staging ก็ต้องตามไปแก้ทุกจุด ดังนั้นจุดไหนที่ต้องการให้เปลี่ยนง่ายเราจะนำมาประกาศไว้เป็นตัวแปร
ในตัวอย่างนี้เราเลยเปลี่ยนจากการ Hardcode URL ไปเป็นการประกาศตัวแปรแบบนี้
*** Variables ***
${amazon_url} https://www.amazon.com
${browser} chrome
*** Test Cases ***
User can search for products
[Documentation] This is some basic info about the test
[Tags] Smoke
Open Browser ${amazon_url} ${browser}
และนอกจากการใช้ตัวแปรที่มี data type เป็น string แล้วเรายังสามารถใช้สัญลักษณ์ข้างหน้าตัวแปรเพื่อบอกประเภทของตัวแปรได้อีกด้วย โดยเราจะใช้
- @{variable} ในการบอกว่าตัวแปรนี้เป็น List
- &{variable} ในการบอกว่าตัวแปรนี้เป็น Dictionary
Keywords
และถ้าเราต้องเขียน Keywords ซ้ำกันหลายๆรอบให้เรานำ Keywords ที่ต้องเขียนซ้ำๆกัน ดึงออกมาสร้างเป็น Keyword ใหม่
ในตัวอย่างนี้เราจะสร้าง Keyword ใหม่คือ Verify Amazon Page โดยจะสร้างเป็นไฟล์ใหม่ชื่อว่า Amazon.robot แล้วนำไปวางไว้ใน folder Resources ที่เราสร้างขี้น
|
|
เวลานำไปเรียกใช้ในไฟล์ amazon-search-products.robot ก็จะเป็น
|
|
จะเห็นว่าการที่เราสร้าง Keywords ขึ้นมาใช้งานเองนั้นไม่ใช้เรื่องยากและช่วยให้ script ของเราเขียนและอ่านง่ายขึ้นมากๆ
สุดท้ายเราจะได้โครงสร้างของไฟล์ที่เราได้จะหน้าตาแบบนี้
├── amazon
│ ├── Resources
│ | ├── amazon.robot
│ ├── Results
│ | ├── output.xml
│ | ├── log.html
│ | ├── report.html
│ ├── Tests
│ | ├── amazon-search-products.robot
การใช้ IF/ELSE
ในการเขียน Robot Script เราสามารถใช้ IF/ELSE ในการสน้างเงื่อนไขในการเลือก Keyword ขึ้นมาทำงาน โดยที่โครงวสร้างของ IF/ELSE ใน Robot Framework จะเป็นแบบนี้
*** Test Cases ***
Example IF
IF ${rc} > 0
First keyword
Second keyword
END
ในตัวอย่างนี้ ถ้าตัวแปร rc มีค่ามากกว่า 0 จะ run First Keyword
และ Second Keyword
ถ้าเรามี Keyword ที่ต้องการ Run แค่ตัวเดียวเราสามารถใช้ Inline IF แทนได้
Example Inline IF
IF ${rc} > 0 First keywork
IF ${rc} <= 0 Second keyword
นอกจาก IF แล้วเราสามารถเพิ่ม ELSE เข้าไปได้แบบนี้
*** Test Cases ***
Example If Else
IF ${rc} > 0
First keyword
ELSE
Second keyword
END
ในตัวอย่างนี้ถ้าตัวแปร rc มีค่ามากกว่า 0 First keyword
จะถูก run ส่วนถ้า rc ทีค่าน้อยกว่าหรือเท่ากับ 0 Second keyword
จะถูก run แทน และนอกจากนี้ ถ้าเรามีหลายๆเงื่อนไขเราสามารถ ใช้ ELSE/IF แบบนี้ก็ได้
*** Test Cases ***
Example Else If
IF $rc > 0
First keyword
ELSE IF $rc < 0
Second keyword
ELSE
Fail Unexpected rc: ${rc}
END
ในตัวอย่างนี้ถ้าตัวแปร rc มีค่าเป็น 0 Test นี้จะ Fail และแสดงข้อคววมว่า Unexpected rc: 0
เพราะใน script นี้จะเข้า Else ก็ต่อเมื่อ rc มีค่าเป็น 0