แบบฝึกหัด: Control Flow ใน Robot Framework¶
วิธีใช้¶
- Recall — อธิบายด้วยคำตัวเอง ไม่ต้องเขียนโค้ด
- Application — เขียนโค้ดที่ run ได้จริง (test กับ
robotcommand) - Synthesis — วิเคราะห์ / หา bug / ออกแบบ
ส่วนที่ 1: IF / ELSE¶
[Recall] ข้อ 1¶
ถ้าเขียน IF/ELSE IF/ELSE โดยเรียง condition จากน้อยไปมาก เช่น:
ถ้า ${temp} = 35 จะ log อะไร? มีปัญหาอะไรกับโค้ดนี้ไหม? อธิบายด้วยคำตัวเอง
[Application] ข้อ 2¶
เขียน keyword ชื่อ Classify File Size ที่รับ argument ${size_mb} แล้ว log ว่า:
- น้อยกว่า 1 MB → "Small"
- 1–100 MB → "Medium"
- มากกว่า 100 MB → "Large"
พร้อมเขียน test case ที่ call keyword นี้ด้วย 3 ค่าที่ครอบคลุมทุก branch (ห้ามใช้ค่า 90, 85, 75 จากตัวอย่างในบทที่ 1)
[Synthesis] ข้อ 3¶
ดูโค้ดต่อไปนี้แล้วหา bug:
Check Login Status
[Arguments] ${username} ${role}
IF ${role} == admin
Log Welcome Admin
ELSE IF ${role} == user
Log Welcome User
ELSE
Log Unknown role
END
มีปัญหากี่จุด? แต่ละจุดเกิดอะไรขึ้น? เขียนโค้ดที่แก้แล้วด้วย
ส่วนที่ 2: FOR Loop¶
[Recall] ข้อ 4¶
อธิบายให้เพื่อนที่ไม่รู้จัก RF ฟังว่า FOR IN ENUMERATE ต่างจาก FOR IN อย่างไร และควรใช้เมื่อไหร่ (ใช้ภาษาไทยธรรมดา ไม่ต้องมีโค้ด)
[Application] ข้อ 5¶
มี @{cities} = ["Bangkok", "Chiang Mai", "Phuket", "Khon Kaen"]
เขียน FOR loop ที่ log ออกมาแบบนี้:
(index เริ่มที่ 1 ไม่ใช่ 0)[Synthesis] ข้อ 6¶
ออกแบบ keyword ชื่อ Validate Users ที่รับ 2 list: ${usernames} และ ${expected_roles} แล้ว log ว่า username แต่ละคนมี role ถูกต้องหรือไม่ เปรียบเทียบ list คู่ขนาน
ข้อ challenge: ถ้า list ทั้ง 2 มีความยาวต่างกัน ควรจัดการอย่างไร? (อย่าให้ test ผ่านโดยไม่รู้ตัว)
ส่วนที่ 3: WHILE + BREAK + CONTINUE¶
[Recall] ข้อ 7¶
อธิบายว่า limit parameter ของ WHILE มีไว้ทำอะไร ถ้าไม่ใส่จะเกิดอะไรขึ้นเมื่อ condition ไม่เคยเป็น False?
[Application] ข้อ 8¶
เขียน keyword ชื่อ Find First Even ที่รับ @{numbers} แล้ว:
- วน loop ผ่านทุกตัวเลข
- ถ้าเจอเลขคู่ → log ว่า "Found even: [number]" แล้วหยุด
- ถ้าไม่มีเลขคู่เลย → log ว่า "No even number found"
ทดสอบกับ ${1} ${3} ${7} ${4} ${9} (expect: หยุดที่ 4)
[Synthesis] ข้อ 9¶
ดูโค้ดต่อไปนี้แล้วตอบ:
Retry Until Success
[Arguments] ${max_attempts}
${attempt}= Set Variable 1
WHILE ${attempt} <= ${max_attempts}
${result}= Run Keyword And Return Status Flaky Keyword
IF ${result} BREAK
${attempt}= Evaluate ${attempt} + 1
END
Should Be True ${result} Keyword failed after ${max_attempts} attempts
- ถ้า
Flaky Keywordสำเร็จในรอบที่ 2 จาก 5 —${attempt}จะเป็นค่าอะไรหลัง BREAK? - ถ้า
Flaky Keywordล้มเหลวทุกรอบ —Should Be Trueจะได้รับค่าอะไร? test จะ pass หรือ fail? - มีจุดไหนที่อาจเป็น bug ไหม? (hint: ลองคิดถึงกรณีที่
max_attempts = 0)
เฉลย¶
เฉลยข้อ 1
log "อุ่น" — เพราะ `35 > 10` เป็น True ตั้งแต่ condition แรก RF จะข้าม ELSE IF ไป ปัญหา: ไม่มีทางได้ "ร้อน" เลย เพราะ condition ที่กว้างกว่า (`> 10`) อยู่ก่อน ควรเรียงจาก "เข้มงวดที่สุด" ก่อน:เฉลยข้อ 2
เฉลยข้อ 3
**Bug 2 จุด:** 1. `${role} == admin` → ควรเป็น `'${role}' == 'admin'` — ขาด quote รอบ string ทั้งสองฝั่ง 2. `${role} == user` → เช่นเดียวกัน โค้ดที่แก้แล้ว:เฉลยข้อ 4
FOR IN วนผ่าน list ปกติ เราได้แค่ตัว item เอง — ไม่รู้ว่า item อยู่ตำแหน่งที่เท่าไหร่ FOR IN ENUMERATE เพิ่มตัวแปร index มาให้ด้วย เหมือนมีป้ายเลขกำกับทุก item ใช้ ENUMERATE เมื่อต้องการรู้ว่า item อยู่แถวที่เท่าไหร่ — เช่น print "ข้อที่ 1/2/3" หรือ check ข้อมูลตามลำดับแถวในตารางเฉลยข้อ 5
เฉลยข้อ 6
*** Keywords ***
Validate Users
[Arguments] ${usernames} ${expected_roles}
${len_users}= Get Length ${usernames}
${len_roles}= Get Length ${expected_roles}
Should Be Equal As Integers ${len_users} ${len_roles}
... List length mismatch: ${len_users} users vs ${len_roles} roles
FOR ${username} ${expected} IN ZIP ${usernames} ${expected_roles}
Log ${username}: expected=${expected}
END
เฉลยข้อ 7
`limit` กำหนดจำนวนรอบสูงสุดที่ WHILE จะวน ถ้าไม่ใส่ default คือ 10,000 รอบ ถ้า condition ไม่เคยเป็น False และไม่มี BREAK → loop จะวนจนครบ limit แล้ว **FAIL** ทันที (ไม่ใช่ค้างตลอดไป)เฉลยข้อ 8
*** Keywords ***
Find First Even
[Arguments] @{numbers}
${found}= Set Variable False
FOR ${num} IN @{numbers}
${is_even}= Evaluate ${num} % 2 == 0
IF ${is_even}
Log Found even: ${num}
${found}= Set Variable True
BREAK
END
END
IF '${found}' == 'False'
Log No even number found
END
*** Test Cases ***
Test Find First Even
Find First Even ${1} ${3} ${7} ${4} ${9}