KBTG: AUTOMATION TECH THE SERIES
[Automation Tech the Series] Ep.12 Robot Framework 7.0 มีอะไรใหม่ไปดู!
สวัสดีนักอ่านชาว Automation Tech the Series ทุกคนค่า~ ถ้าพูดถึงการทำ Test Automation ไม่มีใครไม่รู้จัก Framework ยอดนิยมอย่างเจ้า Robot Framework ที่หลายคนเคยผ่านหูผ่านตากันบ้างแล้ว ซึ่งเมื่อต้นปีนี้เองได้มีการปล่อยเวอร์ชัน 7.0 ออกมา ดังนั้นวันนี้เราไปดูกันดีกว่าว่ามีอะไรที่เพิ่มขึ้นมาใหม่และอะไรที่เปลี่ยนไปจากเดิมบ้าง ตามพวกเรามาได้เลย~
ย้อนความฟีเจอร์น่าสนใจใน Robot Framework 6.1
ก่อนจะไปดูฟีเจอร์ใหม่ในเวอร์ชัน 7.0 ขอเท้าความฟีเจอร์ที่น่าสนใจจากเวอร์ชันที่แล้วกันซักนิด ในเวอร์ชัน 6.1 ทาง Robot Framework ได้มีการเพิ่มฟีเจอร์การแปลง Test Data ให้อยู่ในรูปแบบของ Json พร้อมด้วย 3 ฟังก์ชันหลัก ได้แก่ แปลง Suite เป็น Json, สร้าง Suite จาก Json และ Execute ด้วยไฟล์ Json
ตัวอย่างการใช้งาน:
from robot.running import TestSuite
# สร้าง suite จากไฟล์ robot
suite = TestSuite.from_file_system('/path/to/data')
# ปรับแหล่งที่มาก่อนแปลงเป็น json
suite.adjust_source(relative_to='/path/to')
# แปลงโครงสร้างของ suite เป็น json และจัดรูปแบบ
suite.to_json('test.rbt', indent=2)
# สร้าง suite จากไฟล์ json
suite = TestSuite.from_json('test.rbt')
# สร้าง suite จาก json string
suite = TestSuite.from_json('{"name": "Suite", "tests": [{"name": "Test"}]}')
# 'robot test.rbt' command execute ด้วยไฟล์ json
อีกทั้งสามารถปรับ Source ของ Suite เพื่อนำไปใช้ต่าง Directory ได้ด้วย โดยใช้ TestSuite.adjust_source
เพื่อให้แหล่งที่มาของ Suite เป็นรูปแบบ Relative ก่อน และเพิ่ม Root Directory เข้าไปหลังจากที่ Suite ถูกสร้างขึ้นแล้ว
สามารถอ่านเพิ่มเติมรูปแบบของ JSON ได้ที่ running.json: schema file
นอกจากการแปลงไฟล์ที่มาช่วยอำนวยความสะดวกแล้ว ยังมีฟีเจอร์ที่ช่วยลดขนาดไฟล์ Log และ Output อีกด้วย วิธีการใช้งานทำได้ 2 แบบ คือใช้ robot:flatten
ใน [Tags] หรือใช้คำสั่ง --flattenkeywords
ผ่าน Command Line Options หรือ Rebot เพื่อลดระดับโครงสร้าง Keyword ทำให้ไฟล์ Log และ Output มีขนาดเล็กลง
เทียบโครงสร้างของ output.xml แบบปกติกับแบบที่ถูกลดขนาดลง:
หากมีการเรียกใช้
[Tags] robot:flatten
แล้ว ไม่จำเป็นต้องใช้คำสั่ง--flattenkeywords
ผ่าน Command Line Options
มาถึง Robot Framework 7.0 เวอร์ชันนี้ได้มีการเพิ่มฟีเจอร์น่าสนใจหลายอย่างเข้ามา โดยจะขอยกอันที่คิดว่าน่าจะเป็นประโยชน์กับทุกคนมาเล่าให้ฟัง ดังนี้
- ฟีเจอร์ใหม่ที่ช่วยอำนวยความสะดวกให้ Tool Developers: การปรับปรุง Listener, การรองรับการใช้งาน Mixed Arguments ใน Library Keywords
- ผู้ใช้ทั่วไปมีฟีเจอร์ใหม่มาช่วยซัพพอร์ตเช่นกัน: การใช้งาน Native VAR Syntax, Result ในรูปแบบ JSON, การลบแท็ก Global ด้วย -tag Syntax, การตั้งค่า [Return], ซัพพอร์ต Dark Mode ใน Log และ Report
- การเปลี่ยนแปลงฟีเจอร์ที่อาจส่งผลกระทบกับการทำงาน: การเปลี่ยนแปลง output.xml, การเปลี่ยนแปลงรูปแบบ Result
- สรุปฟีเจอร์ที่ถูกยกเลิกการใช้งาน
ฟีเจอร์ใหม่ที่ช่วยอำนวยความสะดวกให้ Tool Developers
เวอร์ชัน 7.0 มีการเพิ่มฟีเจอร์ใหม่เข้ามาหลายอย่าง เพื่อซัพพอร์ตการทำงานของสายพัฒนาเครื่องมือหรือเซอร์วิสให้ทำงานได้สะดวกสบายยิ่งขึ้น มาดูฟีเจอร์ที่น่าจะมีประโยชน์ต่อการใช้งานของพวกเรากัน
1. การปรับปรุง Listener
Listener Interface คือตัวช่วยอย่างนึงที่ใช้ติดตาม Event ต่างๆ ในขณะที่ Execute เพื่อดักว่า Script ของเราทำงานถึงขั้นตอนไหนแล้ว โดยเวอร์ชันนี้ได้มีการเพิ่ม Method ใหม่เข้ามาใน Listener 3 เพื่อรองรับ Keyword และรูปแบบต่างๆ ของโค้ด (Control Structure) ให้เราสามารถใช้งานได้หลากหลายและสะดวกมากยิ่งขึ้น สำหรับวิธีการเรียกใช้งาน สามารถใช้คำสั่ง --listener
ตามด้วยชื่อไฟล์ .py ผ่าน Command Line
ตัวอย่างการใช้งาน:
# ไฟล์ test_listener.py
from robot import result, running
def start_test(data, result):
print(f"\n Test Case name '{result.name}' used on line {data.lineno} started.")
def start_library_keyword(data, implementation, result):
print(f"Keyword '{implementation.name}' is implemented in library"
f" '{implementation.owner.name}' The library has {implementation.owner.scope.name} scope")
def end_test(data, result):
if not result.passed:
print(f"Test '{result.name}' fail : {result.message} ")
else :
print(f"Test '{result.name}' pass.")
# ไฟล์ test.robot
*** Test Cases ***
Test Listener Interface #1
Log To Console test robot framework 7.0
Test Listener Interface #2
Log To Console test robot framework 7.0 fail ${test_fail}
# command execute : robot --listener test_listener.py test.robot
จากตัวอย่าง เมื่อรันไฟล์ test.robot แล้ว จะเข้าไปทำงานฟังก์ชันstart_test()
ก่อนเสมอ โดยจะ Print Test Case Name ออกมาและบอกว่า Test Case นั้นอยู่ที่บรรทัดที่เท่าไหร่ จากนั้นจะเข้าฟังก์ชัน start_library_keyword()
เพื่อ Print ข้อมูลแต่ละ Keyword และเมื่อรันจบ Test Case จะเข้าไปฟังก์ชัน end_test()
เสมอ ซึ่งจากโค้ดจะทำการเช็ค Result Status แล้ว Print Message ออกมา
สามารถดูเพิ่มเติมเกี่ยวกับ Method ทั้งหมดของ Listener 3 ได้ที่นี่ 👇
Robot Framework 7.0 ไม่จำเป็นต้องระบุเวอร์ชัน Attribute โดย Default จะเป็น Listener 3 อยู่แล้ว แต่ถ้าจะใช้งาน Listener 2 ยังคงต้องระบุเวอร์ชันอยู่
2. รองรับการใช้งาน Mixed Arguments ใน Library Keywords
จากเวอร์ชันก่อนหน้าที่ได้มีการเพิ่มฟีเจอร์ช่วยให้ User Keywords สามารถใช้งาน Mixed Arguments ได้นั้น ในเวอร์ชันนี้ฟีเจอร์ดังกล่าวได้ถูกเพิ่มความสามารถให้ใช้งานได้ใน Library Keywords ด้วยเช่นกัน
ตัวอย่างการใช้งาน:
from robot.api.deco import keyword
@keyword('Number of ${animals} should be')
def example(animals):
print(f"animals : {animals}")
# Keyword ด้านบนสามารถเรียกใช้งานในไฟล์ .robot ได้แบบนี้
*** Test Cases ***
Example
Number of cat should be
ผู้ใช้ทั่วไปมีฟีเจอร์ใหม่มาช่วยซัพพอร์ตเช่นกัน
สำหรับการใช้งานทั่วไปก็มีคำสั่งและลูกเล่นใหม่ๆ มาให้ได้ใช้กัน ดังนี้
1. การใช้งาน Native VAR Syntax
เราสามารถใช้ VAR
ในรูปแบบใหม่ ให้สร้างและกำหนดระดับตัวแปร Local, Global, Suite และ Test/Task แบบ Dynamic ได้ แทนการใช้ Keyword Set Variable
นอกจากนี้เมื่อตัวแปรมีค่ายาวๆ สามารถใช้ separator
Option ร่วมด้วย เพื่อเว้นวรรคหรือขึ้นบรรทัดใหม่
ตัวอย่างการใช้งาน:
*** Test Cases ***
Example Set Variable Scope
# สร้างตัวแปรระดับ local ที่ชื่อ ${local} และมีค่าเป็น 'cat'
VAR ${local} cat
# สร้างตัวแปรระดับ suite ที่ชื่อ ${suite} และมีค่าเป็น 'dog'
VAR ${suite} dog scope=SUITE
# ระดับของ Scope ที่รองรับคือ GLOBAL, SUITE, TEST, TASK, และ LOCAL(default)
Example Set Long Value
VAR ${long}
... This value is rather long.
... It has been split to multiple lines.
... Parts will be joined together with a space.
... separator=n # การใช้ Separator=n หมายถึงจะเว้นวรรคข้อความระหว่างบรรทัด
... scope=SUITE
Example Create List
# การสร้างตัวแปร List
VAR @{list} a b c
Example Create Dictionary
# การสร้างตัวแปร Dictionary
VAR &{dict} key=value second=item
2. Result ในรูปแบบ JSON
จากก่อนหน้านี้ที่ได้มีการปล่อยฟีเจอร์ช่วยซัพพอร์ตการแปลง Test Data เป็น JSON ความสามารถนั้นได้ขยายมาให้ผู้ใช้งานทั่วไปได้ใช้ทั่วถึงกัน โดยสามารถทำได้ง่ายๆ ผ่านคำสั่ง Rebot ตามด้วย --output
และระบุชื่อไฟล์ที่มีนามสกุล .json
ตัวอย่างการใช้งาน:
rebot --output output.json output.xml
ซึ่งการแปลงไฟล์ Output เป็น JSON นี้จะช่วยให้การรับ-ส่งข้อมูลสะดวกยิ่งขึ้น ทั้งยังสามารถนำไปต่อยอดการใช้งานในอนาคตได้อีกมากมายเลยทีเดียว
3. การลบแท็ก Global ด้วย -tag syntax
เราสามารถลบแท็กที่ถูกเซ็ทไว้ระดับ Global ด้วยการใช้ -tag
ในการตั้งค่า [Tags] ของคีย์เวิร์ด
ตัวอย่างการใช้งาน:
*** Settings ***
Test Tags all most
*** Test Cases ***
TEST#1
No Operation
# output tag: all และ most
TEST#2
[Tags] one -most
No Operation
# output tag: one และ all
TEST#3
[Tags] -all
No Operation
# output tag: most
เมื่อเราสามารถลบแท็กได้ยืดหยุ่นขึ้น ก็จะทำให้การใช้งานมีประสิทธิภาพและเหมาะสมกับความต้องการของแต่ละ Test Case และ Keyword มากขึ้นตามไปด้วย
4. ซัพพอร์ต Dark mode ใน Log และ Report
เราสามารถใช้ Dark Mode ในหน้า Log และ Report ได้แล้ว โดยการใช้งานจะถูกเปิดใช้อัตโนมัติตามการตั้งค่าของบราวเซอร์และระบบปฏิบัติการ แต่ถ้าอยากสลับโหมดเอง ก็สามารถทำได้
5. การตั้งค่า [Return]
เราน่าจะได้ยินข่าวคราวกันมาสักพักแล้วว่าจะมีการเลิกใช้ Syntax [Return] ซึ่งในเวอร์ชันนี้ก็มีประกาศออกมาว่าการเขียนแบบนี้จะติด Warning และจะได้รับการซัพพอร์ตถึงแค่เวอร์ชัน 8.0 เท่านั้น โดยจะเปลี่ยนไปใช้ RETURN
แบบนี้แทน
ทั้งนี้หากก่อนหน้ามีการเรียกใช้ [Return] เป็นจำนวนมาก เราสามารถใช้ Robotidy เพื่อแปลง [Return] เป็น RETURN โดยอัตโนมัติได้
Robotidy เป็นเครื่องมือสำหรับจัดรูปแบบโค้ด Robot Framework อัตโนมัติ สามารถอ่านเพิ่มเติมเกี่ยวกับ Robotidy ได้ที่นี่👇
การเปลี่ยนแปลงฟีเจอร์ที่อาจส่งผลกระทบกับการทำงาน
นอกจากฟีเจอร์ใหม่ๆ ที่มีมาให้ใช้งานกันแล้ว ฟีเจอร์เก่าๆ บางส่วนก็มีการเปลี่ยนแปลง ซึ่งอาจส่งผลกระทบต่อการทำงานของเครื่องมือหรือเซอร์วิสที่เราสร้างขึ้นเพื่อซัพพอร์ตการทำ Test Automation ทำให้ต้องมีการปรับแก้ใหม่ โดยจะขอยกเฉพาะบางส่วนที่เด่นๆ ดังนี้
1 . การเปลี่ยนแปลง output.xml
มีการเปลี่ยนแปลงรูปแบบไฟล์ output.xml ใหม่ การเปลี่ยนแปลงหลักๆ คือ
1.1 การเปลี่ยนแปลงที่เกี่ยวกับ Timestamp การเปลี่ยนแปลงที่สำคัญที่สุดในไฟล์นี้เกี่ยวข้องกับ Timestamp เวลาเริ่มต้นและสิ้นสุดของรายการที่ดำเนินการ รวมถึงเวลาที่บันทึกข้อความของการเข้าใช้ล่าสุด เดิม Timestamp จะอยู่ในรูปแบบ YYYYMMDD HH:MM:SS.mmm แต่ในเวอร์ชันนี้จะเปลี่ยนรูปแบบเป็น YYYY-MM-DDTHH:MM เพื่อให้ตรงตามมาตฐาน ISO 8601
ตัวอย่างการเปลี่ยนแปลง:
<!-- Old format -->
<msg timestamp="20231108 15:36:34.278" level="INFO">Hello world!</msg>
<status status="PASS" starttime="20231108 15:37:35.046" endtime="20231108 15:37:35.046"/>
<!-- New format -->
<msg time="2023-11-08T15:36:34.278343" level="INFO">Hello world!</msg>
<status status="PASS" start="2023-11-08T15:37:35.046153" elapsed="0.000161"/>
นอกจากนี้ในการเรียกใช้งานเวลาเริ่มต้น เวลาสิ้นสุด และระยะเวลาในการทำงานสามารถเรียกผ่าน Attribute คือ start_time, end_time และ elapsed_time ได้ ซึ่ง Attribute ดังกล่าวสามารถใช้งานได้ตั้งแต่ Robot Framework 6.1
ISO 8601 คือมาตรฐานสำหรับการนำเสนอตามปฏิทินและเวลา ประกาศโดยองค์การระหว่างประเทศว่าด้วยการมาตรฐาน (ISO)
1.2 การเปลี่ยนแปลงที่เกี่ยวกับชื่อของ Keyword มีการเปลี่ยนแปลงชื่อของคีย์เวิร์ดที่เก็บไว้ใน output.xml เล็กน้อย โดยชื่อที่ใช้เก็บ Library จากเดิมใช้ library
เปลี่ยนเป็น owner
และชื่อ Resource ไฟล์ของคีย์เวิร์ดจากเดิม sourcename
เปลี่ยนเป็น source_name
แทน เพื่อให้ Attribute สอดคล้องกับ Attribute ในไฟล์ Result
ตัวอย่างการเปลี่ยนแปลง:
<!-- Old format -->
<kw name="Log" library="BuiltIn">...</kw>
<kw name="Number of horses should be" sourcename="Number of ${animals} should be" library="my_resource">...</kw>
<!-- New format -->
<kw name="Log" owner="BuiltIn">...</kw>
<kw name="Number of horses should be" source_name="Number of ${animals} should be" owner="my_resource">...</kw>
เพื่อให้ผู้พัฒนามีเวลาในการปรับแก้เครื่องมือเดิมให้รองรับไฟล์ในรูปแบบใหม่นั้น เราสามารถใช้คำสั่ง --legacy-output
เพื่อให้ไฟล์อยู่ในรูปแบบเดิม
2. การเปลี่ยนแปลงรูปแบบของ Result
2.1 การเปลี่ยนแปลงที่เกี่ยวกับชื่อของ Keyword การเปลี่ยนแปลงที่ใหญ่ที่สุดในไฟล์ Result นั้นเกี่ยวข้องกับชื่อของคีย์เวิร์ด โดยสิ่งที่เปลี่ยนไปคือ
- kwname เปลี่ยนชื่อเป็น name
- libname เปลี่ยนชื่อเป็น owner
- sourcename เปลี่ยนชื่อเป็น source_name
- full_name ถูกนำมาใช้แทน name
การเรียกใช้ Attribute Name เดิมจะได้ชื่อของ Library และ Keyword ออกมา เช่น BuiltIn.Log แต่ตอนนี้จะตัดเหลือแค่ชื่อของ Keyword เท่านั้น เช่น Log ซึ่ง Attribute เก่าๆ เช่น kwname, libname และ sourcename จะถูกเก็บไว้เป็น Properties โดยจะถือว่าเลิกใช้งานแล้ว ทั้งนี้ยังสามารถเข้าถึงได้อยู่และจะไม่มี Warning ขึ้นเรื่องการเลิกใช้งาน
2.2 Attributes ที่ถูกยกเลิกการใช้งาน
- TestSuite.keywords ให้ใช้ TestSuite.setup และ TestSuite.teardown แทน
- TestCase.keywords ให้ใช้ TestCase.body, TestCase.setup และ TestCase.teardown แทน
- Keyword.keywords ให้ใช้ Keyword.body และ Keyword.teardown แทน
- Keyword.children ให้ใช้ Keyword.body และ Keyword.teardown แทน
- TestCase.critical ได้ถูกลบออกแล้ว
สามารถอ่านเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงฟีเจอร์ทั้งหมดได้ที่นี่ 👇
สรุปฟีเจอร์ที่ถูกยกเลิกการใช้งาน
- ใน Robot Framework 7.0 จะไม่รองรับ Python 3.6 และ 3.7 แล้ว จะรองรับเวอร์ชัน 3.8 ขึ้นไปเท่านั้น
- Datatypes ได้ถูกลบออกจากไฟล์สเปค XML หรือ Json แล้ว โดยเปลี่ยนไปใช้ TypeDoc แทน
อ่านเพิ่มเติมเกี่ยวกับ Robot Framework 7.0 ได้ที่นี่ 👇
สำหรับใครที่อ่านมาถึงตรงนี้แล้วสนใจ Robot Framework 7.0 แต่ยังไม่ได้อัพเกรดสามารถใช้คำสั่งด้างล่างนี้ได้เลย:
pip install robotframework==7.0
หลังจากอ่านบทความนี้จบแล้ว หวังว่าทุกคนจะนำฟีเจอร์ใหม่ไปปรับใช้ในงานของตัวเองได้ หากติดขัดตรงไหนเม้นต์มาบอกกันได้นะ ขอขอบคุณผู้อ่านทุกคน แล้วเจอกันใหม่ในบทความหน้า บะบ้ายยย~~
ไว้พบกันใหม่กับการผจญภัยครั้งหน้าของ Automation Tech the Series
สำหรับใครที่ชื่นชอบบทความนี้ อย่าลืมกดติดตาม Medium: KBTG Life เรามีสาระความรู้และเรื่องราวดีๆ จากชาว KBTG พร้อมเสิร์ฟให้ที่นี่ที่แรก