Codding Gun

Robot Framework คืออะไร?

Robot framework คือเครื่องมือสำหรับทำ automated testing ที่สามารถเขียน script ได้ใกล้เคียงกับภาษามนุษย์มากที่สุด ซึ่งนั่นทำให้การใช้งาน Robot framework นั้นง่ายมากๆ

ในบทความนี้เราจะแบ่งออกเป็นหัวข้อต่างๆ ดังนี้

ทำไมต้องใช้ Robot Framework

ก่อนจะเข้าไปที่วิธีใช้งานเราลองมาดูข้อดีของ Robot Framework กันก่อน

  1. Cross-Platform สามารถ run ได้ทั้ง MacOS, Linux และ Windows

  2. ภาษาที่เขียนเหมือนภาษามนุษย์มากๆ เช่น

    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

  3. มี Third-party Library ให้เลือกใช้เยอะมากๆ ดังนั้นเราสามารถนำ Robot Framework ไปทดสอบ API, Database หรือ Mobile ได้ด้วย Library เหล่านี้

    นอกจากการทดสอบ function การทำงานของระบบแล้วเรายังสามารถนำเอา Robot Framework ไปทำ Automated Security Testing ได้อีกด้วย โดยใช้ SSHLibrary ในการ remote เข้าไป execute command ในเครื่อง server

  4. เลือก 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
    
  5. มีรายงานสรุปผลออกมาเป็น XML และ HTML สามารถนำไปใช้ต่อได้ง่าย

    ตัวอย่างรายงานที่ได้จาก Robot Framework
    ตัวอย่างรายงานที่ได้จาก Robot Framework
    ซึ่งถ้าเกิดปัญหาเราสามารถเข้าไปดู Test Execution Log ด้วยการกดปุ่ม Log ที่มุมขวาบนในหน้า report ซึ่งจะรายละเอียดของการ execution แต่ละคำสั่งออกมาแบบนี้
    ตัวอย่าง Log ที่ได้จาก Robot Framework
    ตัวอย่าง Log ที่ได้จาก Robot Framework

  6. สามารถ Capture screen เมื่อมีข้อผิดพลาด

  7. สามารถพัฒนา library ขึ้นมาใช้งานเองได้ด้วย python

Robot Framework Architecture

การทำงานของ 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 จะบรรจุคำสั่งต่างๆเหล่านี้

นอกจากนี้ยังมีคำสั่งอื่นๆอีกมากมายคุณสามารถเข้าไปดูเพิ่มเติมได้ที่ Selenium Library References

และนอกจาก Selenium Library แลัวยังมี Library อื่นๆอีกหลายตัวเลยทีเดียว ลองดูรายชื่อของ Library ต่างๆได้ที่ Robot Framework Libraries

ติดตั้ง Robot Framework

ถึงเวลาที่เราจะเริ่มต้นติดตั้ง Robot Framework กันแล้ว สิ่งที่ต้องติดตั้งมีดังนี้

  1. ติดตั้ง Python และ PIP

    • เราสามารถติดตั้ง Python ด้วยการ Download python installer ได้ที่นี่(เลือกตาม OS ที่เราใช้งานอยู่)
  2. ติดตั้ง Robot Framework

    เมื่อเราติดตั้ง Python และ PIP เสร็จเรียบร้อยแล้ว ขั้นตอนต่อไปเราก็จะติดตั้ง Robot Framework ด้วยคำสั่ง

    $ pip install robotframework
    

    ถ้าเราต้องการ upgrade Robot Framework เราจะใช้คำสั่ง

    $ pip install --upgrade robotframework
    

    หลังจากขั้นตอนนี้เราจะสามารถตีความไฟล์ .robot ได้แต่จะยังไม่สามารถ ควบคุมการทำงานของ browser ได้

  3. ติดตั้ง Selenium Library

    ในขั้นตอนนี้เราจะต้องติดตั้ง Selenium Library เพื่อให้เราใช้ความสามารถของ Selenium เพื่อควบคุมการทำงานของ browser โดยที่เราจะใช้คำสั่ง

    $ pip install robotframework-seleniumlibrary
    

    หรือถ้าต้องการ update ให้ Selenium Library เป็น version ใหม่เราจะใช้คำสั่ง

    $ pip install --upgrade robotframework-seleniumlibrary
    
  4. ติดตั้ง Selenium Webdrivers

    Selenium Webdrivers คือ driver ที่จะเข้าไปควบคุมการทำงานของ browser ซึ่งเราต้องติดตั้งแยกตาม browser ที่เราต้องการทดสอบ

    • ถ้าเราต้องการใช้ Chrome เราก็จะต้องติดตั้ง Chrome Webdriver
    • ถ้าเราต้องการใช้งาน Firefox เราต้องติดต้ัง Geckodriver
    • ถ้าเราต้องการใช้งาน Microsoft Edge เราต้องติดต้ัง Edge Webdriver

Robot Resources

หนึ่งในข้อดีของการใช้งาน Robot Framework คือเรามีเครื่องมือและ library ที่จะช่วยให้เราทำงานได้ง่ายขึ้น ซึ่งจะแบ่งออกเป็น 3 กลุ่ม ดังนี้

  1. Built-in เป็นกลุ่มของ Libraries ที่ติดตั้งมาพร้อมกับ robot framework
  2. Libraries เป็นกลุ่มของ Library ที่ไม่ได้รวมอยู่ใน Framework
  3. Tools เป็นเครื่องมืออื่นๆ ที่จะช่วยให้การทำงานกับ Robot Framework นั้นง่ายขึ้น

Built-in

เป็นกลุ่มของ Libraries ที่ติดตั้งมาพร้อมกับ robot framework เราสามารถเรียกใช้งานได้เลยไม่ต้องติดตั้งเพิ่ม ซึ่งจะประกอบไปด้วย Libraries หลักๆที่เราต้องรู้จักไว้ ดังนี้

Builtin

ตัวนี้จะเป็นกลุ่มของ Keywords หลักๆ ที่เราต้องใช้แน่ๆ เราสามารถใช้งาน keywords ในกลุ่มนี้ได้เลย ไม่ต้อง import keywords ที่อยู่ในกลุ่มนี้ตือ

Collections

เป็นกลุ่มของ keywords ที่ใช้จัดการกับ Lists และ Dictionaries ใน python ตัวอย่างของ keywords หลักๆในกลุ่มนี้คือ

เราจะเรียกใช้งาน Collections โดยระบุ Library ไว้ใน Settings แบบนี้

*** Settings ***
Library  Collections

DateTime

เป็นกลุ่มของ keywords ที่ทำงานกับวันที่ ซึ่งจะประกอบไปด้วย keywords หลักๆ ดังต่อไปนี้

เราจะเรียกใช้งาน DateTime โดยระบุ Library ไว้ใน Settings แบบนี้

*** Settings ***
Library  DateTime

Operating System

เป็นกลุ่มของ keywords ท่ี่ทำงานกับ Operating System(OS) ซึ่ง keywords หลักๆท่ี่อยู่ในกลุ่มนี้ตือ

เราจะเรียกใช้งาน 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 ย่อยๆข้างในเช่น

และอื่นๆอีกมากมายเข้าไปดู RPA Framework ต่อได้ที่นี่

Requestslibrary

สำหรับการทดสอบ API ซึ่งจะใช้ RequestLibrary ในการส่ง Http Request ไปยัง API และจัดการกับ Data ด้วย Collections ซึ่งอยุ่ใน Built-in ที่เราพูดถึงไปก่อนหน้านี้ Keywords หลักๆที่อยู่ใน RequestLibrary มีดังต่อไปนี้

DatabaseLibrary

เป็น Library ที่ใช้ในการทดสอบ database ซึ่งจะใช้การ query ของมูลออกมาแล้วทำการทดสอบว่า โครงสร้างของ database หรือ data ที่มีอยู่ใน database นั้นตรงกับที่ต้องการหรือไม่ keywords ต่างๆ ที่อยู่ใน DatabaseLibrary มีดังต่อไปนี้

AppiumLibrary

เป็น Library ที่ใช้สำหรับการทดสอบ Mobile Application ซึ่งรองรับทั้ง iOS และ Android ซึ่งตัวอย่างของ keywords ที่อยู่ใน AppiumLibrary มีดังต่อไปนี้

BrowserLibrary

เป็นรูปแบบการทดสอบที่มาใหม่ในปี 2021 เราจะใช้ PlayWrite(เราต้องติดตั้ง NodeJs เพิ่ม) ซึ่งตอนนี้ PlayWrite ถือได้ว่าเป็นน้องใหม่ที่น่าจับตามากเลยทีเดียว Keywords ที่อยู่ใน BrowserLibrary มีดังต่อไปนี้

อ่านบทความเรื่อง End-To-End Testing ด้วย Playwright ต่อได้ที่นี่

SSHLibrary

เราสามารถ execute command บน remote server ผ่านทาง secure shell(ssh) โดยใช้ SSHLibrary ซึ่งส่วนใหญ่เราจะนำไปใช้ในการทำ Automated Security Testing และ Keyword หลักๆที่อยู่ใน SSHLibrary มีดังต่อไปนี้

การใช้งาน Libraries

สำหรับกลุ่มที่ไม่ใช่ built-in เราจำเป็นจะต้องติดตั้งก่อนใช้งาน เหมือนที่เราติดตั้ง SeleniumLibrary ในขั้นตอนที่ 4 ในขั้นตอนการ ติดตั้ง Robot Framework ด้านบน

Robot Framework Tools

Robot Framework มีเครื่องมือที่จะช่วยให้เราทำงานได้ง่ายขึ้นอยู่หลายตัว แต่ที่เราต้องทำความรู้จักไว้มีอยู่ 3 ตัวด้วยกันคือ

1. RIDE

เป็น GUI สำหรับผู้ที่ไม่ถนัดเขียน Code เราสามารถสร้าง robot script และจัดการกับ data ของ robot ได้โดยใช้ RIDE ในการจัดการ

Robot Framework GUI
Robot Framework IDE(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 ต่างๆให้เราเลือกใช้งานดังนี้

  1. Run robot script
    $ robot hello.robot
    
    หรือถ้าจะ run ทุกๆไฟล์ใน folder ปัจจุบัน เราจะใช้คำสั่ง
    $ robot .
    
  2. Run เฉพาะ Test cases ที่กำหนด Tag เป็น smoke
    $ robot -i smoke .
    
  3. Run robot script โดยระบุ folder ที่จะเอา report ไปวาง ในตัวอย่างนี้ให้วางไว้ใน folder reports
    $ robot -d reports .
    
  4. Rerun เฉพาะ case ที่ Fail
    $ robot --rerunfailed ./reports/output.xml .
    
    เราต้องโยน output ที่มี Failure(output.xml) เข้าไปด้วย

3. Plug-ins หรือ Linter สำหรับ IDE

หลังจากนี้เมื่อเราต้องเขียน Robot script เราจำเป็นต้องมี plugins ที่เป็นตัวช่วยเหลือระหว่างการเขียน script คอยเตือนว่าเราเขียนผิดตรงไหน แต่ละ Library มี Keywords อะไรบ้าง ดังนั้นในการทำงานจริง แนะนำให้ติดตั้ง Robot Framework plugins หรือ extensions สำหรับ IDE ที่เราใช้งานอยู่

ในตัวอย่างนี้เราขอแนะนำ Robot Framework Language Server สำหรับผู้ที่ใช้งาน VSCode

Robot framework plugins for VSCode
Extensions สำหรับ VSCode

เริ่มต้นเขียน Script ใน Robot Framework

ในตัวอย่างนี้เราจะเริ่มจากการเขียน Script ง่ายๆโดยจะทำการค้นหาสินค้าใน Amazon.com

เริ่มจากการสร้าง script โดยส่วนใหญ่เราจะแบ่ง folders ออกเป็น 3 folders ดังต่อไปนี้

├── amazon
│   ├── Resources
│   ├── Results
│   ├── Tests
  1. Resources เวลาเราเขียน Keywords ซ้ำกันบ่อยๆ เราจะยุบมาเป็น Keywords ใหม่(เหมือนเขียน function เพื่อใช้ซ้ำ) หลังจากนั้นเราจะนำมารวมกันไว้ใน Folder นี้
  2. Results ใช้เก็บผลลัพธ์ที่ได้จากการทดสอบ เช่น output.xml, log.html หรือ report.html
  3. 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 แล้วเรายังสามารถใช้สัญลักษณ์ข้างหน้าตัวแปรเพื่อบอกประเภทของตัวแปรได้อีกด้วย โดยเราจะใช้

Keywords

และถ้าเราต้องเขียน Keywords ซ้ำกันหลายๆรอบให้เรานำ Keywords ที่ต้องเขียนซ้ำๆกัน ดึงออกมาสร้างเป็น Keyword ใหม่

ในตัวอย่างนี้เราจะสร้าง Keyword ใหม่คือ Verify Amazon Page โดยจะสร้างเป็นไฟล์ใหม่ชื่อว่า Amazon.robot แล้วนำไปวางไว้ใน folder Resources ที่เราสร้างขี้น

1
2
3
4
5
*** Keywords ***
Search for Products
    Wait Until Page Contains "Spend less. Smile more"
    Input Text  id=twotabsearchtextbox  robot framework
    Click Button  xpath=//*[@id="nav-search"]/form/div[2]/div/input

เวลานำไปเรียกใช้ในไฟล์ amazon-search-products.robot ก็จะเป็น

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
*** Settings ***
Resource  Resources/Amazon.robot

*** Test Cases ***
User can search for products
    [Documentation]  This is some basic info about the test
    [Tags]  Smoke
    Open Browser  ${amazon_url}  chrome
    Amazon.Search for Products
    Close Browser

จะเห็นว่าการที่เราสร้าง 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

Phanupong Permpimol
Follow me