Test API By Robot Framework สำหรับผู้เริ่มต้น

Ananyaporn Panklam
Stories of Sellsuki
5 min readSep 29, 2022

สวัสดีค่ะทุกคนนนนนนน ก่อนอื่นขอแนะนำตัวกันก่อนเนื่องจากบทความนี้เป็นบทความแรกของพวกเรา พวกเราคือชาว QA Engineer จาก Sellsuki & Akita วันนี้จะมาแนะนำการ Test API ด้วย Robot Framework

Test API By Robot Framework

ก่อนอื่นมาทำความรู้จักกับ API Testing กันก่อน

API Testing เป็นประเภทการทดสอบซอฟต์แวร์ ผ่าน API โดยมีจุดประสงค์เพื่อตรวจสอบการทำงาน ความน่าเชื่อถือ ประสิทธิภาพ และความปลอดภัยของอินเทอร์เฟซการเขียนโปรแกรมของเรานั่นเอง โดยการทดสอบ API จำเป็นต้องรู้เกี่ยวกับ HTTP Method ก่อน

แล้วอะไรคือ HTTP Method ล่ะ ?
HTTP Method
คือส่วนที่ใช้กำหนดประเภทของคำร้องขอ โดยจะมีอยู่ 4 Methods ที่เรามักจะใช้งานกันบ่อยๆ

  1. GET : เป็น method สำหรับร้องขอข้อมูลจาก resource
  2. POST : เป็น method สำหรับสร้างข้อมูลใหม่ใน resource
  3. PUT : เป็น method สำหรับอัพเดตข้อมูลของข้อมูลที่มีอยู่แล้วใน resource หรือสร้างใหม่
  4. DELETE : เป็น method สำหรับลบข้อมูลที่มีอยู่ใน resource

ก่อนที่เราจะเริ่มการทำความเข้าใจในการเขียนโค้ด เราต้องมาติดตั้งโปรแกรมกันก่อน โดยจำเป็นต้องติดตั้งทั้ง Python และเจ้า Robot

ขั้นตอนการติดตั้งโปรแกรม มีดังนี้

  1. Download Python version ล่าสุดที่ https://www.python.org/downloads/ และติดตั้งโปรแกรมโดยเลือกดาวน์โหลดตาม OS ของเครื่องที่ใช้ เช่น macOS (ในบทความนี้จะรันโปรแกรมบน macOS)
  2. เปิด Spotlight Search ขึ้นมา
  3. ค้นหา Terminal และทำการเปิด Terminal
  4. พิมพ์คำสั่ง pip install robotframework
  5. พิมพ์คำสั่ง pip install robotframework-requests สำหรับใช้งาน Library RequestLibrary เช่น GET, POST

ขั้นตอนต่อมาหลังจากที่เราติดตั้ง Python และเจ้า Robot Framework เรียบร้อยแล้ว สิ่งสำคัญที่ต้องรู้ต่อไปก็คือส่วนของ Data Sections ซึ่ง Data Sections จะแบ่งออกเป็น 4 ส่วน คือ Settings, Variables, Keywords, Test Cases ดังนี้

มาเริ่มกันที่ส่วนแรกของไฟล์ Robot: Settings
เป็นส่วนของการตั้งค่าให้กับไฟล์ Robot ของเราก่อนเริ่มทดสอบทั้ง Import Library, Resource และ Setup

*** Settings ***
Documentation API Testing in Robot Framework
Library RequestsLibrary
  • Documentation คือ รายละเอียดของ test suite ไฟล์ ซึ่งในตัวอย่างนี้ใส่ข้อความว่า “API Testing in Robot Framework” จะทำงานหลังการใช้คำสั่งเพื่อรันไฟล์ robot นี้โดยจะ log ข้อความนี้ออกมาที่ console
  • Library คือ การ import library ที่จะใช้ในไฟล์เข้ามา ซึ่งในไฟล์นี้เลือกนำ “RequestLibrary” มาใช้เพราะต้องการใช้งานในส่วนของการยิง api testing ผ่าน request GET และ POST

ถัดไปคือการประกาศชื่อให้โปรแกรมรู้จัก: Variables
เป็นส่วนของการประกาศตัวแปรค่าต่างๆ ที่ใช้ในไฟล์ Robot เพื่อเรียกใช้ซ้ำ และแก้ไขได้ในที่เดียว ซึ่ง variables ที่เราสร้างขึ้นมาเพื่อจะเรียกใช้ในตัวอย่าง คือ

*** Variables ***
${Base_URL} https://jsonplaceholder.typicode.com/
  • ${Base_URL} คือ เราจะทำการประกาศตัวแปรชื่อ Base_URL โดย กำหนดค่า “https://jsonplaceholder.typicode.com/” เก็บไว้ในตัวแปรนี้
  • normal variable syntax ที่ใช้ในการประกาศตัวแปรของ Robot Framework จะประกาศชื่อตัวแปรไว้ระหว่างเครื่องหมาย “${“ และ “}”

พระเอกที่จะช่วยให้ code ของคุณอ่านง่ายขึ้น: Keywords
เป็นส่วนของการสร้าง Method หรือ Function ขึ้นมาใช้เองในกรณีที่ Library ที่เรานำมาไม่มี Keyword ที่เราต้องการ

ช่วยให้อ่านง่ายยังไง ? ลองนึกถึงการจัดกลุ่ม process การทำงานเข้าด้วยกันในแต่ละงานและมีการตั้งชื่อกลุ่มขึ้นมา เช่น “Create Order” และ “Delete Order” จะทำให้คุณเห็นภาพ flow การทำงานหลักได้ชัดมากขึ้นจากชื่อกลุ่มนั้นๆ โดยที่ข้างใน keyword อาจจะมีการทำงานอีกหลายบรรทัด แต่แค่อ่านชื่อเราก็เข้าใจแล้วว่า keyword นี้มี process การทำงานเกี่ยวกับอะไร

*** Test Cases ***Case 1 Test Get
${response} Call Method Get API ${Base_URL} /posts/1
Should Be Equal As Strings ${response.status_code} 200
${response_json} Set Variable ${response.json()}
log to console \n response json (Get) = \n${response_json}
log to console \n get title value = \n${response_json}[title]
Case 2 Test Post
${data} Create Dictionary userId=10 title=title description body=body description
${response} Call Method Post API ${data} ${Base_URL} /posts
Should Be Equal As Strings ${response.status_code} 201
Log to console \n response json (Post) = \n ${response.json()}
  • Call Method Post API คือ การประกาศ keyword ชื่อ “Call Method Post API” และชุดคำสั่งภายใต้ keyword จะต้อง tab เข้าไปใน level ถัดไปจาก keyword เสมอ เช่น การประกาศว่า keyword นี้รับตัวแปร parameter 3 ตัวคือ ${data}, ${base_url} และ ${path_url}

ส่วนของ keyword ที่สร้างขึ้นมาเพื่อทดสอบ API ในครั้งนี้ จะมีการ get api และ post api ซึ่งนำ keyword ต่างๆ ของ RequestsLibrary มาใช้ ดังต่อไปนี้

  • Create Session : เป็น keyword ที่ใช้การสร้าง HTTP session
  • GET On Session : เป็น keyword ที่ใช้ส่ง get request ไปยัง session ที่สร้างไว้
  • Post On Session : เป็น keyword ที่ใช้ส่ง post request ไปยัง session ที่สร้างไว้

ซึ่ง keyword นั้นจะมีการ return ค่ากลับไปหรือไม่มีก็ได้ โดยหากมีการ return ค่ากลับไป จะมี syntax คือ “RETURN” และตามด้วยค่าที่ต้องการ return

สามารถอ่านวิธีการใช้ keyword ต่างๆ ของ RequestsLibrary เพิ่มเติมได้ที่ https://marketsquare.github.io/robotframework-requests/doc/RequestsLibrary.html#Create%20Session

ออกแบบเคส สำหรับการทดสอบ: Test Cases
ในส่วนของ Test Cases จะประกอบด้วย Test Case และ Test Step ที่เตรียมไว้สำหรับทดสอบ โดยจะนำ standard keyword ของ Robot Framework หรือจะนำ keyword ที่เราเขียนมาปรับใช้เข้ากับแต่ละ Test Case ได้ ซึ่งใน 1 ไฟล์ (.robot) จะมีกี่ Test Case ก็ได้

*** Test Cases ***
Case 1 Test Get
${response} Call Method Get API ${Base_URL} /posts/1
Should Be Equal As Strings ${response.status_code} 200
log to console ${response.json()}
${response_json} Set Variable ${response.json()}
log to console -----------
log to console ${response_json}[title]

Case 2 Test Post
${data} Create Dictionary userId=10 title=title test description body=Hello Oh
${response} Call Method Post API ${data} ${Base_URL} /posts
Should Be Equal As Strings ${response.status_code} 201
Log to console ${response.json()}

ในส่วนของ Test Case จะขอยกตัวอย่างเป็น 2 เคส มีรายละเอียด ดังนี้

Case 1: ทดสอบการ Get API (ประกาศ test case ชื่อ “Case 1 Test Get”)
ในเคสแรก จะทำการประกาศตัวแปร ${response} เพื่อใช้สำหรับรับข้อมูล response ที่ได้จากการเรียกใช้ keyword: Call Method Get API ที่สร้างไว้
และจะใช้คำสั่ง Should Be Equal As Strings สำหรับตรวจสอบ status code ของ response อีกครั้งนึง เพื่อเช็คว่าสามารถ Get API ได้ ถูกต้อง เช่น ใน Case นี้ เป็นการบอกว่า ${response.status_code} ที่เราได้มาควรจะเท่ากับ 200

ซึ่งตัว response ของการ Get API จะสามารถนำไปใช้งานต่อได้ เช่น หากต้องการดึงข้อมูลของ title ไปใช้ โดยสามารถนำ response ไปแปลงเป็น json ด้วยคำสั่ง ${response.json()} และหลังจากนั้นนำค่า json ไปใส่ตัวแปรที่ต้องการเพื่อดึงข้อมูลของตัวแปรดังกล่าวไปใช้ต่อ ดังตัวอย่างนี้ซึ่งจะเก็บค่าใส่ตัวแปรชื่อ ${response_json} และนำตัวแปร ${response_json}[title] มา log ค่า title ออกมาที่ console

Case 2: ทดสอบการ Post API (ประกาศ test case ชื่อ “Case 2 Test Post”)
ในเคสที่สอง ประกาศตัวแปร ${data} แล้วใช้ keyword: Create Dictionary เพื่อเก็บ object ที่ต้องนำไปใช้งานต่อในการสร้างข้อมูลใหม่ของ method post หลังจากนั้นจะทำการประกาศตัวแปร ${response} เพื่อรับข้อมูล response จากการเรียกใช้ keyword: Call Method Post API ที่ได้สร้างไว้
และจะใช้คำสั่ง Should Be Equal As Strings สำหรับตรวจสอบ status code ของ response อีกครั้งนึง เพื่อเช็คว่าสามารถ Post API ได้ ถูกต้อง เช่น ใน Case นี้ เป็นการบอกว่า ${response.status_code} ที่เราได้มาควรจะเท่ากับ 201

แล้ว status code 200 กับ 201 ที่ว่า คืออะไรล่ะ ??
เล่าแบบคร่าวๆ (มากๆ) ก็คือ status code ที่ http ตอบกลับมาหาเรา (HTTP response status codes)

  • Status 200 OK หมายถึง คำขอ resource สำเร็จ เช่น ใน Case 1 จะหมายถึงสามารถ Get API ได้สำเร็จ
  • Status 201 Created หมายถึง สร้าง resource สำเร็จ (โดยทั่วไปจะเป็นการตอบกลับที่ส่งหลังจากคำขอ POST หรือ PUT) เช่น ใน Case 2 จะหมายถึงสามารถ Post API สร้าง resource ได้สำเร็จ

สามารถทำความรู้จักกับ Status Code อื่นๆ ได้ที่ https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#successful_responses

หมายเหตุ
“Log To Console”, “Should Be Equal As Strings” และ Create Dictionary เป็น keyword พื้นฐานที่เป็น standard library (Builtin) ของ Robot Framework ซึ่งสามารถเรียกใช้ keyword ได้โดยไม่ต้อง import library เข้ามาในส่วน “Settings”

  • Log To Console คือ keyword สำหรับ log ข้อความออกมาที่ console
  • Should Be Equal As Strings คือ keyword สำหรับเช็คค่าระหว่าง argument 2 ตัว โดยจะทำการ convert value เป็น string ก่อนแล้วจึงทำการเช็คค่า จะ fail เมื่อค่า argument 2 ตัวไม่เท่ากัน
  • Create Dictionary คือ keyword สำหรับสร้าง Dictionary ไว้เก็บตัวแปร และค่าต่างๆ ลงใน object

ถ้าเพื่อนๆคนไหนสนใจวิธีการใช้ keyword ต่างๆ ของ Library Builtin สามารถอ่านเพิ่มเติมได้ที่
https://robotframework.org/robotframework/latest/libraries/BuiltIn.html#Create%20Dictionary

*** Settings ***
Documentation API Testing in Robot Framework
Library RequestsLibrary
*** Variables ***
${Base_URL} https://jsonplaceholder.typicode.com/
*** Test Cases ***
Case 1 Test Get
${response} Call Method Get API ${Base_URL} /posts/1
Should Be Equal As Strings ${response.status_code} 200
${response_json} Set Variable ${response.json()}
log to console \n response json (Get) = \n${response_json}
log to console \n get title value = \n${response_json}[title]
Case 2 Test Post
${data} Create Dictionary userId=10 title=title description body=body description
${response} Call Method Post API ${data} ${Base_URL} /posts
Should Be Equal As Strings ${response.status_code} 201
Log to console \n response json (Post) = \n ${response.json()}
*** Keywords ***
Call Method Get API
[Arguments] ${base_url} ${path_url}
Create Session session_get ${base_url} verify=true
${response} GET On Session session_get ${path_url}
RETURN ${response}
Call Method Post API
[Arguments] ${data} ${base_url} ${path_url}
Create Session session_post ${base_url} verify=true
${response} POST On Session session_post ${path_url} data=${data}
RETURN ${response}

การ Run/Execute Test Cases
เมื่อเราเตรียม Test Cases สำหรับทดสอบเสร็จเรียบร้อยแล้ว ขั้นต่อไปจะเป็นการ execute test cases กันล่ะ โดยปกติแล้วจะพิมพ์คำสั่ง robot ตามด้วยชื่อไฟล์.robot เช่น robot example.robot ลงไปใน Terminal ซึ่งจะได้ผลลัพธ์ตามรูปข้างล่างนี้

สุดท้ายนี้ หวังว่าบทความนี้จะเป็นความรู้/ข้อแนะนำสำหรับคนที่สนใจหรืออยากเริ่มต้นการทำ Test API ด้วย Robot Framework ถ้าเพื่อนๆมีคำแนะนำเพิ่มเติม หรือติดปัญหา สามารถคอมเมนต์ไว้เพื่อมาพูดคุยแลกเปลี่ยนกันได้เลย ขอบคุณค่ะ

📢 มาร่วมเป็นส่วนหนึ่งในการทำให้วงการ E-Commerce ขับเคลื่อนไปข้างหน้า ส่งประวัติการทำงานพร้อมตำแหน่งงานที่คุณสนใจมาได้เลยที่อีเมล hr@sellsuki.com หรือเข้าชมเว็บไซต์ของเราที่ https://lnkd.in/gUqNHSEW 🐶

--

--