robot

Robot Framework แนะนำ Pycharm IDE ช่วยให้เขียน Robot ง่ายยิ่งขึ้น EP4

3 บทความก่อนหน้านี้ พาทุกคนทำความรู้จัก Robot มากยิ่งขึ้นไปแล้ว

และเมื่อก่อนที่จะเริ่มทำการพัฒนา Robot โปรเจคของเรา จำเป็นต้องเลือกหาเครื่องมือให้เหมาะสมกับผู้ใช้งานก่อน สำหรับในแวดวงการพัฒนาซอพแวร์ เครื่องมือสำหรับนักพัฒนามีมากมาย แต่เพราะด้วยความหลากหลายของภาษาโปรแกรมมิ่ง จะหาเครื่องมือที่ดีพอ และเหมาะสมกับภาษานั้น ๆ

เมื่อพูดถึงภาษา Python จะมีเครื่องมือสำหรับใช้เพื่อพัฒนาที่ได้รับความนิยม เช่น VScode, Pycharm,Jupyter Notebook, PyDev เป็นต้น แต่ทางผู้เขียนเลือกที่จะขอแนะนำ Pycharm เพราะการใช้งานเครืองมือจะคล้าย ๆ กับ intellij idea, eclipse ide ทำให้เลือกใช้เครื่องมือนี้

ข้อดีของการเลือกใช้ IDE แทนการเลือกใช้ Editor

  • ความสะดวกในการติดตั้ง ที่มาพร้อมกับ feature, plugin ต่าง ๆ ที่พร้อมใช้งาน
  • IDE จะมีฟีเจอร์ คำสั่งช่วยเหลือสำหรับการพิมพ์โค๊ด พร้อมกับคำอธิบายโค๊ดคำสั่ง
  • Pycharm จะมาพร้อมกับ python interpreter ช่วยสร้าง virtual environment สำหรับการจัดการ python libs ต่าง ๆ ค่อนข้างใช้งานง่าย
  • สามารถปรับแต่ง IDE Theme, Fonts, Colors หน้าตาของ IDE ได้
  • ปกติ IDE จะมาพร้อมกับ version control อย่าง GIT
  • ความสะดวกในการสั่งรันโปรแกรม IDE อย่าง pycharm ตรวจสอบหาไฟล์โค๊ดเพื่อรัน python จะเรียกหา function __main__

มาเริ่มทำความรู้จัก Pycharm IDE กัน

Pycharm IDE คือเครื่องมือที่ถูกพัฒนาจากทีมงาน Jetbrains.com ที่เป็นทีมงานสร้าง IDE ดัง ๆ อย่าง IntelliJ IDEA, PhpStorm และอื่น ๆ อีกมากมาย เป็นเหตุผลนึงที่ทำให้ผู้เขียนเลือกที่จะใช้ pycharm เพื่อใช้พัฒนา Robot project

หลังจากดาวน์โหลดและทำการติดตั้ง Pycharm เป็นที่เรียบร้อยผู้เขียนจะขอแนะนำการกำหนดการตั้งค่า ที่คิดว่าจำเป็นสำหรับการโค๊ด Robot project

การเริ่มสร้าง Project ใหม่

  • เลือกเมนู File -> new Project…

Localtion : พื้นที่จัดเก็บไฟล์ project ที่ถูกสร้างใหม่นี้
Python Interpreter: New Virtualenv environment : เลือก New environment using
– Virtualenv (เลือกอันนี้)
– Pipenv
– Portry
– Conda
จากนั้นกด Create ก็เป็นอันเสร็จการสร้าง Project

อธิบาย Source Exploer ของ Project

มุมมองการแสดงไฟล์
– Project : จะแสดงเฉพาะไฟล์เกี่ยวกับโค๊ดเท่านั้น สามารถเปิดดูไฟล์ได้ง่าย มีการแบ่งชัดเจน
– Project Files : แสดงไฟล์โค๊ด และอื่น ๆ
– Open Files : แสดงไฟล์เฉพาะที่เปิดแท๊บการใช้งาน
– All Changed Files : แสดงไฟล์ที่เปลี่ยนแปลง Git change
– Scatches and Colsoles : ยังไม่ทราบว่าใช้งานอย่างไร

การตั้งค่า Virtualenv ปรับเปลี่ยน environment อื่น ๆ

  • เลือกเมนู File -> Settings… -> Project
  • เลือกเมนู Python Interpreter -> Add…
  • เลือก New environment
    • Location : พื้นที่เก็บไฟล์ environment
    • Base interpreter : python compiler กรณีมี python มากกว่า 1 เวอร์ชั่น

เรียกใข้งาน Terminal ภายใน pycharm และเลือกใช้งานจาก Python Interpreter ที่สร้างใหม่

  • เลือกแท็บ Terminal จะแสดง Terminal -> Local
  • poolsawat.com-venv1 : ชื่อ virtualenv ที่สร้างขี้นใหม่

สั่งรันง่าย ๆ เลือกไฟล์และก็รัน

  • main function เพื่อรัน
  • Edit Configuations…
  • Script path : ตำแหน่งไฟล์เพื่อสั่งรัน
  • Python interpreter : สามารถเลือกปรับเปลี่ยนได้

ติดตั้ง libs ง่ายๆ จากไฟล์ requiments.txt

  • Pycharm จะแสดง Install requirements ถ้าเกิดว่า dependencies ยังไม่ถูกติดตั้ง

EP1 Robot Framework เตรียมพร้อมก่อนเริ่มโค๊ด Robot EP1
EP2 Robot Framework เริ่มต้น กำหนดโครงสร้างโปรเจค EP2
EP3 Robot Framework อธิบายการทำงาน EP3

Robot Framework อธิบายการทำงาน EP3

ต่อจากบทความ Robot Framework เริ่มต้น กำหนดโครงสร้างโปรเจค EP2 ที่แนะนำการกำหนดโครงสร้างของโปรเจค และวิธีการรัน testcases ที่สร้าง มาต่อกันที่บทความนี้จะขอธิบายรายละเอียดของ โฟลเดอร์ ไฟล์ และข้อมูลอื่น ๆ ที่จะช่วยสนับสนุนการพัฒนา Robot project ให้รวดเร็วและดูเป็นระบบ ยิ่งขึ้น

ทำความเข้าใจ รายละเอียด ต่าง ๆ ของโค๊ด Robot

บทความนี้จะข้อใช้ตัวอย่างโค๊ดจาก github นี้ ซึ่งทุกคนสามารถ clone ไปเพื่อประกอบกับการอ่านบทความนี้

  • poolsawat.com (ชื่อโปรเจค)
    • keywords (ไฟล์ keywords ต่าง ๆ )
      • api_keywords.robot
    • pythonlibs (function ต่าง ๆ สามารถเรียกใช้งานเหมือนกับ keywords ปกติ)
      • date_util.py
    • resources (ไฟล์ data, config, data test)
      • configs
        • dev
          • env.yaml
        • staging
          • env.yaml
      • testdata
        • dev
          • example_data.yaml
        • staging
          • example_data.yaml
      • commons.yaml
      • imports.robot
    • scripts
    • testcases (ไฟล์ testcases ต่าง ๆ)
      • module1_testcase.robot
    • venv
    • requirements.txt

/keywords/api_keywords.robot

*** Keywords *** (1)
Print Message from agruments (2)
    [Documentation]    Print Message from agruments  (3)
    [Arguments]    ${arg0}   (4)
    Log To Console    'Result from Print Message from agruments keywords ::=='${arg0}    (5)

Calculate value
    [Documentation]    Calculate value
    [Arguments]    ${a}     ${b}
    ${result}=      Evaluate     ${a}+${b}   (6)
    [Return]        ${result}     (7)

อธิบายแต่ละบรรทัดของโค๊ด ของไฟล์ api_keywords.robot

(1) *** Keywords *** เพื่อเริ่มต้นสร้าง keywords ใหม่
(2) กำหนดชื่อของ keyword สำหรับการทำงาน ปกติเราจะอ้างอิงการเรียกใช้งานด้วยชื่อ ยาว ๆ นี้ เช่น Print Message from agruments เป็นต้น
(3) คำอธิบายรายะเอียดของ keyword นี้ เป็น optional คือจะกำหนด หรือไม่มีก็ได้ สามารถพิ่มรายละเอียดได้
(4) กำหนด parameters ต่าง ๆ ตัวอย่างจะเป็น ${arg0} ตัวอย่างการเรียกใช้งาน Print Message from agruments arg0=’Hello world’
(5) กำหนด logical การทำงานต่าง ๆ ตัวอย่างจะ print message กับ parameter ชื่อ arg0 เพื่อแสดงใน log ด้วย keywords Log To Console
(6) keyword Evaluate จะช่วยประเมิน การประมวลผล เพื่อเก็บข้อมูลใส่ ${result}
(7) สามารถ return data คืนให้กับส่วนที่เรียก keyword นี้

pythinlibs/date_util.py

from datetime import datetime

def get_nowdate(): (1)
    return datetime.now()

อธิบายแต่ละบรรทัดของโค๊ด ของไฟล์ date_util.py

(1) สร้าง function (จะถูกเรียกใช้งานแบบเดียวกับ keyword) เช่น get_newdate

resources/configs/${ENV}/env.yaml

welcome_message: welcome from Dev environment

อธิบายการเรียกใช้งานไฟล์ตาม environment

${ENV} จะเป็นค่า variable ที่ถูกกำหนดตั้งแต่ตอนสั่งรันด้วย

robot -L TRACE --resource ENV:dev -t "CASE_000" "testcases/episode_1.robot"

จะเรียกใช้ resorce จาก dev เมื่อส่ง ENV:dev และเรียก staging เมื่อส่ง ENV:staging

resources/testdata/$ENV{}/example_data.yaml

${ENV} จะเป็นค่า variable ที่ถูกกำหนดตั้งแต่ตอนสั่งรัน แบบเดียวกับตัวอย่าง config ก่อนหน้า

resources/commons.yaml

app_name: poolsawat.com

คล้ายกับ config ที่แตกด้วย ENV แต่ resource common จะเป็น config แบบไม่ได้แยกตาม environment เป็นค้าคงที่ ที่ทุก environment ใช้แบบเดียวกัน

resources/imports.robot

*** Settings ***  (1)
Library    Collections   (2)
Library    String    (3)
Library    DateTime   (4)
Library    ../pythonlibs/date_util.py   (5)

Variables   ./commons.yaml    (6)
Variables    ../resources/configs/${ENV}/env.yaml     (7)

Resource    ../keywords/api_keywords.robot    (8)

เป็นไฟล์ control เรื่องการ import resource ต่าง ๆ เป็นการ refactor code แบบนึง เป็นการย้าย code การ import resource ทุก ๆ ไฟล์ testcase ให้มา control ที่ไฟล์ imports.robot นี้ไฟล์เดียว จะทำให้เราจัดการเรื่องการ control การ improt libs, resources, testdata, config ต่าง ๆ ได้ง่ายยิ่งขึ้น

อธิบายแต่ละบรรทัดของโค๊ด ของไฟล์ imports.robot

(1) กำหนดเริ่มต้นเมื่อมีการเรียกใช้การ import files, libs, resources ต่างๆ
(2),(3),(4) import libs ที่ชื่อว่า Collections, String, Datetime ซึ่งเป็น standard libs จะมากับ robot system อยู่แล้ว โดยจะกำหนดการ import เป็นแบบ Library
(5) import custom function ใช้การ import แบบ Library เช่นกัน
(6),(7) import variable data จะกำหนดต่างจาก Library keyword เพราะไฟล์เหล่านี้เป็นแค่ data file จะถูกทองเป็น Variables
(8) สุดท้าย keywords file จะถูก import แบบ Resource file

testcases/episode_1.robot

*** Settings ***  (1)
Resource    ../resources/imports.robot     (2)
Resource    ../keywords/api_keywords.robot     (3)
Variables    ../resources/testdata/${ENV}/example_data.yaml     (4)

*** Variables ***   (5)
${DIRECTORY_CSV}       ../resources/testdata/csv     (6)

*** Test Cases ***   (7)
CASE_00001 lesson 1 Log to console     (8)
    Log To Console    'Hello World 1'     (9)

CASE_00002 lesson 2 use external keywords with void
    Print Message from agruments  'Hello world 2'

CASE_00003 lesson 3 use external keywords with return
    ${result}=     Calculate value   5     10
    Log To Console    'Result from Calculate value keywords::=='${result}

CASE_00004 lesson 4 get data from yaml file
    Log To Console   'request ::='${test_data.CASE_00004.request}
    Log To Console   'expect_data ::=='${test_data.CASE_00004.expect_data}

CASE_00005 lesson 5 get env global file
    Log To Console   'app_name ::=='${app_name}

CASE_00006 lesson 6 use custom lib keywords
    ${now}=     get_nowdate
    Log To Console   'now ::=='${now}

CASE_00007 lesson 7 use variable with resource environnment
    Log To Console   'welcome_message from ${ENV}::=='${welcome_message}

อธิบายแต่ละบรรทัดของโค๊ด ของไฟล์ episode_1.robot

(1) *** Settings *** จะถูกกำหนดเมื่อมีการ import file, resource data ต่าง ๆ
(2) import file imports.robot ที่ได้ทำการ control lib ต่าง ๆ ไว้แล้ว
(3) import custom keywords เข้ามาใช้งาน เพื่อรอการเรียกใช้งาน keywords ภายในไฟล์ต่อไป
(4) import testdata file สังเกตุว่าจะมีการระบุการใช้งานโดยแยก environment ด้วย /${ENV}/ ทำให้เราสามารถแยก testdata ตาม environment ได้
(5) *** Variables *** เมื่อมีการ define new variable จำเป็นต้องประกาศ *** Variables *** ก่อนเสมอ
(6) สร้าง variable ที่ชื่อ ${DIRECTORY_CSV} พร้อม assign ค่าให้
(7) *** Test Cases *** จะเป็นการเริ่มการสร้าง testcase ของเราบรรทัดของโคํดที่อยู่ภายใต้นี้จะมองเป็น keywords testcase ทั้งหมด

Resource Folders, Files อื่น ๆ

  • venv จะเป็น folder เก็บ libs, resource ต่าง ๆ สำหรับการพัฒนาโปรเจคด้วย python จะนิยมใช้ virtual env
  • log.html จะเป็น summary report ของการรัน testcase ต่าง ๆ
  • requirements.txt ไฟล์ control libs version ต่าง ๆ ปกติจะ control libs กันด้วยไฟล์นี้

EP1 Robot Framework เตรียมพร้อมก่อนเริ่มโค๊ด Robot EP1
EP2 Robot Framework เริ่มต้น กำหนดโครงสร้างโปรเจค EP2
EP4 Robot Framework แนะนำ Pycharm IDE ช่วยให้เขียน Robot ง่ายยิ่งขึ้น EP4

Robot Framework เริ่มต้น กำหนดโครงสร้างโปรเจค EP2

ต่อจากบทความ Robot Framework เตรียมพร้อมก่อนเริ่มโค๊ด Robot EP1 จะแนะนำ scripts ของ robot ที่จำเป็นต้องทราบก่อนการเพิ่มโค๊ด Robot มาต่อกันที่บทความนี้ขจะพาทุกคน เริ่มสร้าง กำหนดโครงสร้างโฟลเดอร์ ไฟล์ ต่างๆ ของ โปรเจค

คำแนะนำเกี่ยวกับข้อมูลและเนื้อหาของบทความนี้

  • ติดตั้ง python 3.8 ขึ้นไป
  • ติดตั้ง pycharm

กำหนดโครงสร้างโฟลเดอร์ ไฟล์ ต่างๆ ภายในโปรเจค

ตัวอย่างนี้เป็นเพียงการออกแบบจากผู้เขียนบทความเอง เท่านั้น ผู้อ่านสามารถปรับเปลี่ยน แก้ไข เพื่อให้เหมาะสม

  • poolsawat.com (ชื่อโปรเจค)
    • keywords (ไฟล์ keywords ต่าง ๆ )
      • ***_keywords.robot
    • pythonlibs (function ต่าง ๆ สามารถเรียกใช้งานเหมือนกับ keywords ปกติ)
      • ***.py
    • resources (ไฟล์ data, config, data test)
      • configs
        • dev
          • env.yaml
        • staging
          • env.yaml
      • testdata
        • dev
          • module1_data.yaml
        • staging
          • module1_data.yaml
      • commons.yaml
      • imports.robot
    • scripts
    • testcases (ไฟล์ testcases ต่าง ๆ)
      • module1_testcase.robot
    • venv
    • requirements.txt

ตัวอย่างคำสั่ง รัน testcase และ ผลลัพธ์จากการ รัน testcase

command เพื่อใช้สั่ง run testcase

robot -L TRACE --variable ENV:dev -t "CASE_000**" "testcases/episode_1.robot"
  • robot : คำสั่งจะสามารถเรียกใช้งานได้หลังจากติดตั้ง robotframework
  • -L TRACE : write log level TRACE
  • –variable ENV:dev : defined variable ENV เพื่อใช้แยก resource environment ในโค๊ด Robot
  • -t “CASE_000**” : filter cases ที่ต้องการสั่งรัน เป็นชุด testcase เพื่อใช้ในการรัน
  • “testcases/episode_1.robot” : specific file testcase ที่จะรัน
(poolsawat.com-venv1) D:\RobotFramework\poolsawat.com>robot -L TRACE --variable ENV:dev -t "CASE_000**" "testcases/episode_1.robot"
==============================================================================
Episode 1                                                                     
==============================================================================
CASE_00001 lesson 1 Log to console                                    'Hello World 1'
CASE_00001 lesson 1 Log to console                                    | PASS |
------------------------------------------------------------------------------
CASE_00002 lesson 2 use external keywords with void                   'Result from Print Message from agruments keywords ::==''Hello world 2'
CASE_00002 lesson 2 use external keywords with void                   | PASS |
------------------------------------------------------------------------------
CASE_00003 lesson 3 use external keywords with return                 .'Result from Calculate value keywords::=='15
CASE_00003 lesson 3 use external keywords with return                 | PASS |
------------------------------------------------------------------------------
CASE_00004 lesson 4 get data from yaml file                           'request ::='{'name': 'poolsawat Dev Env', 'age': 30, 'nation': 'Thai'}
.'expect_data ::=='{'status': {'code': 'API200', 'message': 'Success'}}
CASE_00004 lesson 4 get data from yaml file                           | PASS |
------------------------------------------------------------------------------
CASE_00005 lesson 5 get env global file                               'app_name ::=='poolsawat.com
CASE_00005 lesson 5 get env global file                               | PASS |
------------------------------------------------------------------------------
CASE_00006 lesson 6 use custom lib keywords                           .'now ::=='2022-07-13 14:47:23.480131
CASE_00006 lesson 6 use custom lib keywords                           | PASS |
------------------------------------------------------------------------------
CASE_00007 lesson 7 use variable with resource environnment           'welcome_message from dev::=='welcome from Dev environment
CASE_00007 lesson 7 use variable with resource environnment           | PASS |
------------------------------------------------------------------------------
Episode 1                                                             | PASS |
7 tests, 7 passed, 0 failed
==============================================================================
Output:  D:\RobotFramework\poolsawat.com\output.xml
Log:     D:\RobotFramework\poolsawat.com\log.html
Report:  D:\RobotFramework\poolsawat.com\report.html

และสามารถเปิดตรวจสอบ result ได้จากไฟล์ .\log.html

บทความถัดไปจะเป็นเนื้อหาที่เน้นลงลึกไปในรายละเอียดของไฟล์ต่าง ๆ ขอบคุณที่ติดตาม

EP1 Robot Framework เตรียมพร้อมก่อนเริ่มโค๊ด Robot EP1
EP3 Robot Framework อธิบายการทำงาน EP3
EP4 Robot Framework แนะนำ Pycharm IDE ช่วยให้เขียน Robot ง่ายยิ่งขึ้น EP4

Robot Framework เตรียมพร้อมก่อนเริ่มโค๊ด Robot EP1

Robot Framework เครื่องมือสำหรับช่วยพัฒนา application ที่ได้รับความนิยมในระดับนึง เพราะด้วยความเป็น opensource และง่ายต่อการนำไปใช้งาน จึงทำให้ Robot Framework ยังได้รับความนิยมจนถึงปัจจุบัน

Robot Framework ถูกพัฒนาจากภาษาโปรแกรมมิ่ง Python ฉะนั้นเมื่อนำไปใช้งาน จำเป็นต้องติดตั้ง Python ให้เรียบร้อยก่อนการเริ่มใช้งาน อีกทั้งความเป็น keyword approach กล่าวคือ keyword (function, method แล้วแต่จะเรียก) มีความเป็นภาษาอ่านที่เข้าใจง่าย

แนะนำ Scripts ของ Robot ที่จำเป็นต้องรู้

  • Settings (*** Settings ***) เรียกใช้ Library ต่าง ๆ เช่น
*** Settings ***
Library    Collections
Library    String
Library    DateTime
Library    ../pythonlibs/date_util.py

Variables   ./commons.yaml
Variables    ../resources/configs/${ENV}/env.yaml

Resource    ../keywords/api_keywords.robot
  • Variables (*** Variables ***) สร้างกำหนด Variable global scope
*** Variables ***
${DIRECTORY_CSV}       ../resources/testdata/csv
  • Test Cases (*** Test Cases ***) กำหนดสร้าง testcases ต่าง ๆ ที่จำใช้ทดสอบระบบ
*** Test Cases ***
CASE_00001 lesson 1 Log to console
    Log To Console    'Hello World 1'

CASE_00002 lesson 2 use external keywords with void
    Print Message from agruments  'Hello world 2'

CASE_00003 lesson 3 use external keywords with return
    ${result}=     Calculate value   5     10
    Log To Console    'Result from Calculate value keywords::=='${result}

CASE_00004 lesson 4 get data from yaml file
    Log To Console   'request ::='${test_data.CASE_00004.request}
    Log To Console   'expect_data ::=='${test_data.CASE_00004.expect_data}

CASE_00005 lesson 5 get env global file
    Log To Console   'app_name ::=='${app_name}

CASE_00006 lesson 6 use custom lib keywords
    ${now}=     get_nowdate
    Log To Console   'now ::=='${now}

CASE_00007 lesson 7 use variable with resource environnment
    Log To Console   'welcome_message from ${ENV}::=='${welcome_message}
  • Keywords (*** Keywords ***) กำหนด keywords ของเรา เหมือนการสร้าง function ของ Javascript หรือ method ของภาษา Java
*** Keywords ***
Print Message from agruments
    [Documentation]    Print Message from agruments
    [Arguments]    ${arg0}
    Log To Console    'Result from Print Message from agruments keywords ::=='${arg0}

Calculate value
    [Documentation]    Calculate value
    [Arguments]    ${a}     ${b}
    ${result}=      Evaluate     ${a}+${b}
    [Return]        ${result}

4 scripts ที่แนะนำมา จะค่อนข้างใช้งานบ่อย ๆ ที่สุด สำหรับ EP ถัดไปจะพาทุกคนมาเริ่มวางโครงสร้างของ Project เพิ่มเริ่มการพัฒนาด้วย Robot Framework กันครับ

EP2 Robot Framework เริ่มต้น กำหนดโครงสร้างโปรเจค EP2
EP3 Robot Framework อธิบายการทำงาน EP3
EP4 Robot Framework แนะนำ Pycharm IDE ช่วยให้เขียน Robot ง่ายยิ่งขึ้น EP4