How to เลือกใช้ Sleep กับ Wait เลือกอย่างไรไม่ให้เสียเวลา ฉบับ tester ต๊อกต๋อย

Manassawee Jareansub
THE EXISTING COMPANY
2 min readJan 28, 2020

ก่อนเข้าเนื้อหาของ blog ขอเกริ่นก่อนนะคะ เจ้าของบล็อกมีปัญหากับเวลาในการ loading element ของเว็บ ทำให้บางเคส ที่ควรจะ run ผ่าน กลับไม่ผ่าน เพราะว่า Selenium ไวกว่า loading ของเว็บ ทำให้เสียเวลาในการกลับไปแก้ไขอยู่บ่อย ๆ ทำให้ช้าบ้าง งานค้างบ้าง ส่งต่อไม่สำเร็จสักที จะมีวิธีไหนบ้างนะที่ช่วยให้เจ้า Selenium รอจนกว่าเว็บจะ loading element เสร็จ

ขอแทนไก่เหลืองเป็น web element loading แล้วคุมะมงเป็น selenium ที่กำลังหา element

คำตอบคือ การใช้ Sleep กับ Wait นั่นเอง

วันนี้จะมาแนะนำการใช้เจ้า sleep กับ wait จากประสบการณ์ของเจ้าของบล็อก ก่อนอื่นเลย อยากให้เข้าใจการทำงานของทั้งสองตัวก่อน จะอธิบายแบบย่อ ๆ สำหรับคนที่ขก.อ่าน

  • Sleep จะเป็นเหมือนตัวจับเวลาถอยหลัง โดยจะหยุดการทำงานของ selenium จนครบเวลาที่ตั้งไว้ถึงค่อยทำคำสั่งถัดไป
  • Wait จะเป็นคำสั่งที่ใช้ในการรอ text หรือ web element โดยเจ้า keyword ตัวนี้จะทำการรอจนกว่าจะเจอ web element หรือ text ที่ต้องการแล้วถึงจะทำคำสั่งถัดไป โดย keyword wait นั้นมีหลายอย่างให้เลือกใช้ สามารถเข้าไปดูได้ใน — https://robotframework.org/SeleniumLibrary/SeleniumLibrary.html#Wait%20For%20Condition

เพื่อไม่ให้เสียเวลาในการอ่านเจ้าของบล็อกขอยกตัวอย่างแล้วแสดงให้เห็นผลลัพธ์ของการใช้ Sleep กับ Wait โดยจะกำหนดระยะเวลาในการทำงานของ keyword เท่ากัน

ตัวอย่าง Script ที่ใช้เปรียบเทียบการใช้งาน Sleep กับ Wait
ผลลัพธ์จาก script ด้านบน

จากผลลัพธ์จะเห็นได้ว่าเคสที่มี keyword sleep ใช้เวลาไปถึง 19.218 วินาที เพราะว่าต้องรอจนกว่าเจ้า sleep จะทำงานได้ครบเวลาที่กำหนด ส่วนเคสที่มี keyword wait ใช้เวลาในการ run เพียงแค่ 12.447 วินาที เพราะว่า wait จะสามารถทำขั้นตอนถัดไปได้ถ้ามันเจอ element ที่ต้องการ โดยไม่ต้องรอจนกว่าจะครบเวลาที่กำหนดในตัว keyword แค่การทดสอบสั้น ๆ เราสามารถประหยัดเวลาในการ run ไปได้ประมาณ 7 วินาที เพียงแค่ใช้ wait แทน sleep

แล้วเราจะเลือกใช้ sleep หรือ wait ?

จากประสบการณ์ของเจ้าของบล็อกส่วนใหญ่จะเอา wait มาใช้กับเว็บที่มีการ load ช้าๆหรือต้องใช้เวลาในการรอ element เพื่อจะใช้ในขั้นตอนถัดไป โดยที่เราไม่จำเป็นต้องใช้ sleep เพราะการใช้ sleep โดยไม่จำเป็น จะทำให้ประสิทธิภาพในการ run test script ของเราลดลง และใช้เวลาในการ run ทั้งหมดนานขึ้น (ถ้ามีเคสที่ต้อง Regression Test เยอะ ๆ คงจะหลับก่อนที่จะได้ deploy)

Regression Test คืออะไร?

อธิบายแบบสั้น ๆ Regression Test คือการ test อีกครั้งหลังจากที่มีการเพิ่มหรือแก้ไข code ของ developer เพื่อยืนยันว่าการแก้ไขครั้งนั้นไม่ได้สร้าง bug เพิ่มให้ระบบของเรา

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

เคสที่เจ้าของบล็อคเคยมีโอกาสได้ทำบ่อย ๆ คือเคสของการเทสเวลาหมดอายุของ Token JWT เจ้า Token ที่ว่าเนี่ยจะมีระยะเวลาการใช้งานของมันอยู่ ซึ่งเราก็จำเป็นที่จะต้องเทสว่าหลังจากที่อายุของ Token หมดไป เว็บของเราจะต้องทำการ log out ออกเพื่อให้ผู้ใช้นั้น log in ใหม่ เพื่อป้องกันการเข้าใช้จากผู้ไม่หวังดี ซึ่งในการเทสเคสนี้เราจะใช้ sleep ในการตั้งเวลาเพื่อรอให้ Token นั้นหมดอายุ แล้วทำการรีเฟรชหน้าเว็บเพื่อตรวจสอบผลลัทธ์ที่ได้ แต่เราไม่สามารถนำ wait เข้ามาใช้ได้ในเคสแบบนี้ ถึงทำได้ก็อาจจะซับซ้อนมาก เพราะว่าไม่มี keyword wait อันไหนที่จะรอและสามารถเช็คเวลาหมดอายุของ Token ได้ตรง ๆ

JWT เป็นรูปแบบหนึ่งที่ใช้ในการสร้างรหัส token จากข้อมูล JSON Data แล้วทำการเข้ารหัสด้วย Base64Url Encoded

เราจะเห็นว่าข้อดีของ sleep กับ wait นั้นต่างกัน wait จะนำมาใช้กับเคสที่มีระยะเวลาไม่แน่นอน sleep จะนำมาใช้กับเคสที่มีเวลากำหนดที่แน่นอน

สรุป

เราสามารถเลือกใช้ได้ทั้ง sleep และ wait เพียงแค่เราต้องเลือกใช้ให้ถูกกับงาน เหมือนกับการ

Put the right man on the right job…

เราก็ควร

Put the right keyword on the right case…

เหมือนกันค่ะ

blog แรกในชีวิตของ tester ต๊อกต๋อย แล้วจะมาแบ่งปันเคล็ดลับในการเขียน robotframework อีกนะคะ

--

--