Robot framework เรียนให้รู้ ตอน 1
ทำไมต้องเขียน Automated Test เขียนแค่ Unit Test ได้ไหม แล้วมันเป็นงานของใคร โปรแกรมเมอร์หรือว่าเทสเตอร์? เพลงมา! ฉันท้อแท้สักกี่ทียังมีหวัง แม้พลาดพลั้งสักกี่ครั้งยังฝันไกล แม้ฉันล้มฉันก็คงไม่ตาย ฉันยังไม่ตายฉันยังคงหายใจ
ขอตรงประเด็น น้ำน้อย เส้นใหญ่ เนื้อเยอะๆ
- เราจะมาเขียน Robot framework ตั้งแต่พื้นฐานกัน
- โปรเจกต์ใช้ Angular 8 กับ Angular material (theme) และ Bootstrap (CSS)
- ทำอะไรดี? ร้านขายก๋วยเตี๋ยว แล้วกัน
Intro มา!
Robot เป็นใคร ทำไมต้อง framework?
Robot framework คือ framework ชื่อ Robot คำว่า framework หมายถึงความคิด รูปแบบ วิธีการ กรอบความคิด เหมือนกฏในโรงเรียนที่นักเรียนชายและหญิงต้องปฏิบัติ เช่น นักเรียนชายต้องสวมกางเกง สีนั้นสีนี้ นักเรียนหญิงต้องสวมกระโปรง สีนั้นสีนี้ กระโปรงต้องยาวคลุมเข่า ชายต้องตัดผมสั้น หญิงอย่าได้ไว้ผมยาวเกินกว่าติ่งหู ห้ามติดกิ๊บ แต่งหน้าทาปาก ถุงเท้าต้องครึ่งน่อง บลาๆๆๆ
framework ที่ชื่อ Robot นี่ก็ไม่ต่างกัน ใครเอามันมาใช้ก็ต้องคิดถึงกฏกติกา รูปแบบ วิธีการ กรอบความคิดของคุณ Robot มาก่อนเป็นสำคัญ
แล้วทำไมต้อง Automated Test?
นั่นสิ ผมเองก็เป็นโปรแกรมเมอร์ อย่าว่าแต่ Automated Test เลย Unit Test น้อยครั้งจะได้จับ สายจาวางานเผาจะชอบคำสั่งนี้มาก
@Ignore
@Test
แต่เพื่อนผมนางเป็นเทสเตอร์ (Tester) อย่าว่าแต่ @Ignore @Test นางไม่รู้จักหรอก นางต้องการรู้และนำ Automated Test มาใช้ เนื่องจากเครื่องมือนี้สามารถทุ่นแรง Test cases จำนวนมหาศาลที่นางต้องทดสอบแบบ manual ในแทบทุกวันหลังจากเราสวัสดีกันตอนเช้า
เกริ่นนำไปแบบนี้ผู้ที่หลงเข้ามาหรือมือใหม่อาจยังสงสัยว่าผมพูดเรื่องอะไร ผมกำลังเล่าว่าแต่ละวันที่ผมเขียนโปรแกรม ผมในฐานะโปรแกรมเมอร์ก็จะ focus ไปที่โปรแกรมทำงานได้เป็นอันดับหนึ่ง จากนั้นก็จะเริ่มเขียน Unit Test หรือว่าโค้ดอีกส่วนหนึ่งสำหรับทดสอบโปรแกรมที่เพิ่งทำงานได้นั่น กล่าวคือให้ Unit Test กำกับผลลัพธ์ที่คาดหวังในแต่ละกรณีที่โปรแกรมสามารถดำเนินไป เรียกว่า Test cases ครับ ตัวอย่าง
Test case 1: ค่าของ 1 บวก 2 ต้องเท่ากับ 3 หากว่า Unit Test ให้ผลต่างจาก 3 ถือว่าโปรแกรมไม่ผ่านการทดสอบ
Test case 2: ค่าสมาชิกของ list แต่แรกเท่ากับ 0 เมื่อดำเนินอัลกอริทึม A แล้วเสร็จต้องได้ค่าของสมาชิกมากกว่า 0 หากว่า Unit Test ให้ผลต่างจากนี้ถือว่าโปรแกรมไม่ผ่านการทดสอบ
Test case 3: ช่องกรอกรหัสไปรษณีย์ กรอกน้อยกว่า 5 ต้องแจ้งให้ทราบว่า “น้อยกว่าห้าไม่ได้” หรือกรอกมากกว่า 5 ต้องแจ้งให้ทราบว่า “มากกว่าห้าไม่ได้” หากว่า Unit Test ไม่สามารถจับข้อความข้างต้นนี้ได้ไม่ว่าจะกรอกรหัสไปรษณีย์น้อยกว่าหรือมากกว่า 5 ถือว่าโปรแกรมไม่ผ่านการทดสอบ
หรือใครที่ใช้หลัก Test Driven Development (TDD) จะเขียน Test case ทั้งหมดก่อนแล้วทำให้มันไม่ผ่านการทดสอบตั้งแต่แรก จากนั้นจึงเติมโปรแกรมลงไปทำให้ Test case ผ่านการทดสอบไปทีละน้อย กระทั่งครบหมดทุก Test cases ก็ย่อมได้
ไม่ว่าอย่างไรก็ดูเหมือนว่างานของ Test cases ด้วย Unit Test คงจบเท่านี้ โปรแกรมเมอร์เอาอยู่
แต่เมื่อลองคิดถึงพฤติกรรม users ที่มาใช้งาน สมมติเป็นเว็บซื้อของออนไลน์ดูสิครับ user แต่ละคนก็มีพฤติกรรมต่างกัน จะดีกว่านี้ไหมหากเราสามารถใช้งาน หุ่นยนต์ ซึ่งในที่นี้ก็คือโปรแกรมประยุกต์ประเภทหนึ่งที่จะทำหน้าที่เสมือนเป็น user เหล่านั้นมาใช้งานเว็บซื้อของออนไลน์นี้ คงดีหากเราสามารถจำลองสิ่งนี้ได้ และมันทำเองได้อัตโนมัติทุกครั้งที่เราเขียนโปรแกรมเพิ่มเข้าไป จะได้การันตีผลการทดสอบ นี่ยังไม่นับว่าหุ่นยนต์ลักษณะดังกล่าวสามารถ record การกระทำของมันเอง (ตามโปรแกรมสั่ง) ทั้งรายงานความผิดพลาด ชี้จุดเกิดเหตุ ให้สามารถเข้าจับกุมคนร้าย fix bug แก้ไขได้ทันท่วงที
ฮัดช่า! หุ่นยนต์ตัวนี้ที่เราเลือกมาคุยในบทความก็คือ Robot framework ครับ
Automated Test แปลว่า ทดสอบอัตโนมัติ ถ้าพูดว่า Automate Testing แปลแบบโปรแกรมเมอร์คือ เขียนโปรแกรมเพื่อทดสอบโปรแกรม (ตัวหลัก) อีกที
Software Automated Test มีหลายจ้าว ที่โปรแกรมเมอร์อย่างผมชอบก็คือ Robot framework ครับ
แล้วเทสเตอร์จะเขียนโปรแกรมได้ไหม?
ตอบเลยแบบไม่เหลียวหลังคือ ได้!
แต่หนูเขียนโค้ดไม่เป็นน่ะ ไม่ยาก ฝึกฝนสิ
Automated Test ไม่ใช่งานที่เอ๊ะอะก็ว่ารักเอะอะก็คิดถึงเทสเตอร์ แต่เป็นงานของทีม ทั้งโปรแกรมเมอร์และเทสเตอร์ต้องสามารถเข้าใจและเขียนได้ครับ คือต้องเพลิดเพลินร่วมกัน
มาเขียน Robot framework กันเถอะ
เนื่องจากบทความนี้ผมจะสร้างโปรเจกต์ตั้งแต่นับ 1 วิธีที่ผมนำมานำเสนออาจไม่ใช่สิ่งที่ถูกต้องที่ต้องเอาเป็นแบบอย่าง ขอให้ focus ไปที่ความคิดของ framework เป็นสำคัญนะครับ
เครื่องมือและพื้นฐาน
- ผมใช้ MacOS
- พอมีความรู้ Angular มาบ้างนิดหน่อย
- เคยใช้ VS Code มาบ้าง
สร้างโปรเจกต์
ติดตั้ง Angular CLI ครับ
ผมสร้างโปรเจกต์ชื่อว่า angular-robot เอาไว้ที่
/Users/<ชื่อเครื่อง>/works/robot
พิมพ์คำสั่ง
ng new angular-robot
เสร็จแล้วเปิดไฟล์ package.json ยืนยันโปรเจกต์นี้ Angular 8
“@angular/core”: “~8.0.0”,
เข้าไปในโปรเจกต์
cd angular-robot
จากรันโปรเจกต์ขึ้นมา
ng s
เปิด Browser
localhost:4200
มือใหม่มักลืม save ดังนั้นให้ปรับเป็น auto save
แยกแยะนิดหนึ่งครับ
- Robot framework เป็น test tool หรือเครื่องมือสำหรับทำ automated test พัฒนาด้วยภาษา Python
- ถ้าจะให้ Robot ทำงานกับเว็บ เราเลือกใช้ไลบรารีที่ชื่อ Selenium2Library
- pip เป็น Python package installer จัดการติดตั้ง package หรือไลบรารีที่เขียนด้วยภาษา Python
ในเครื่องของเราจึงควรติดตั้ง Python และ pip ไว้ก่อนแล้ว
ติดตั้ง Python
เครื่องยังไม่มี Python ให้ดาวน์โหลดและติดตั้งตามนี้
ตรวจสอบเวอร์ชัน
python --version
Python 2.7.16
ติดตั้ง pip
เครื่องยังไม่มี pip ให้ดาวน์โหลดและติดตั้งตามนี้
ดาวน์โหลดไฟล์ที่ชื่อ get-pip.py ทำได้สองวิธี
- ใช้โปรแกรม curl (เครื่องที่ลง Windows เวอร์ชัน 10 จะมี curl ติดตั้งไว้ให้แล้ว)
- คลิกที่ลิงก์ https://bootstrap.pypa.io/get-pip.py แล้วบันทึกไฟล์นี้ไว้
อื่ม…ขอเลือก curl แล้วกัน ผมใช้ MacOS ผมตรงไปที่ Home
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
จากนั้นใช้ Python มาอ่าน
python get-pip.py
มันแจ้งว่า script ชื่อ pip, pip2 และ pip2.7 ทั้งหมดอยู่ในพื้นที่เดียวกันคือ Python/2.7/bin และยังไม่ได้กำหนดว่าจะใช้ script ไหนเป็นตัวหลัก
เพื่อแก้ไขปัญหานี้ เราสามารถเลือก script ตามเวออร์ชันของ Python ที่ได้ติดตั้งแล้วในเครื่อง ดังนี้
python -m pip <คำสั่งที่ต้องการ>
ตัวอย่างเช่น ถามหาเวอร์ชัน
python -m pip --version
ผล
pip 20.0.2 from /Users/pros/Library/Python/2.7/lib/python/site-packages/pip (python 2.7)
ติดตั้ง Robot framework
เมื่อมี pip แล้วเรามาติดตั้ง Robot กัน ตรงไปที่
คำสั่ง
pip install robotframework
ตรวจสอบเวอร์ชัน
robot --version
Robot Framework 3.1.1 (Python 2.7.16 on darwin)
ติดตั้ง Selenium2Library
ควรทราบว่า Robot framework สามารถทำ automated test ได้กับหลากหลายเทคโนโลยี ตอนนี้เราจะเขียนเว็บ Robot จึงต้องเข้าใจเว็บด้วย ซึ่งไลบรารีที่เราเลือกใช้คือ Selenium2Library
คำสั่งติดตั้ง
pip install --upgrade robotframework-selenium2library
เรื่องเวอร์ชันต่างๆหากมีผลหรือแสดงแจ้งเตือนอย่างไรออกมา เพื่อนๆสามารถตัดสินใจได้เองว่าจะยังคงใช้งานเวอร์ชันเก่า (Python เวอร์ชัน 2.7) หรือจะใช้งานเวอร์ชันใหม่
ตารางต่อไปนี้สรุปเวอร์ชันที่เข้ากันได้ระหว่าง Python กับ Selenium2Library
ติดตั้ง Browser Drivers
หลังจากติดตั้งไลบรารีเรายังจำเป็นต้องติดตั้ง browser drivers ที่ต้องการด้วย เช่น chrome
และ firefox
เพื่อที่ Selenium2Library จะมาเรียกใช้ในภายหลัง
ติดตั้ง Web driver manager ก่อน
pip install webdrivermanager
เจ้า webdrivermanager นี้จะเข้าไปอยู่ที่
/Users/<ชื่อเครื่อง>/Library/Python/2.7/bin
ดังนั้นเข้าไป
cd /Users/pros/Library/Python/2.7/bin
หลังจากนั้นใช้ Web driver manager ติดตั้ง browser drivers ที่ต้องการ เช่น firefox หรือ chrome หรือทั้งคู่ก็ได้
python webdrivermanager firefox chrome --linkpath /usr/local/bin
ผล
Downloading WebDriver for browser: "firefox"
1960kb [00:45, 43.24kb/s]
Driver binary downloaded to: "/Users/pros/Library/Application Support/WebDriverManager/gecko/v0.26.0/geckodriver-v0.26.0-macos/geckodriver"
Symlink created: /usr/local/bin/geckodriverDownloading WebDriver for browser: "chrome"
6839kb [00:02, 3362.85kb/s]
No handlers could be found for logger "webdrivermanager.webdrivermanager"
Driver binary downloaded to: "/Users/pros/Library/Application Support/WebDriverManager/chrome/80.0.3987.16/chromedriver_mac64/chromedriver"
Symlink created: /usr/local/bin/chromedriver
มาเขียน Selenium2Library แรกกัน Open Browser
สร้าง foder ชื่อ robot ไว้ในโปรเจกต์
จากนั้นสร้างไฟล์ชื่อ hello.robot ไว้ใน folder ดังกล่าวนี้
หมายเหตุ สำคัญมาก
เนื่องจาก key word ต่างๆของ Selenium2Library ตั้งใจออกแบบให้เป็นภาษาอังกฤษที่อ่านเข้าใจได้เป็นประโยค มันจึงใช้ช่องว่าง (1 spacebar keyboard) คั่นแต่ละคำไว้ เช่น Open Browser เป็นผลให้เวลาเราเขียนคำสั่งถัดไปจำต้องเว้นช่องว่างให้ห่างจาก key word เจ้ากรรมอย่างน้อย 2 ช่องว่าง (2 spacebar keyboard) หรือใช้ปุ่ม tab เว้นให้ห่างอย่างเห็นได้ชัดไปเลย มิเช่นนั้นอาจรันแล้วเกิด error
มารันไฟล์นี้กันครับ จากโปรเจกต์เข้าไปใน folder ชื่อ robot
cd robotpwd
ผล
/Users/<ชื่อเครื่อง>/works/robot/angular-robot/robot
รันด้วยคำสั่ง robot
robot hello.robot
ดูผลลัพธ์ที่ Terminal ด้วย
เพิ่มเติม Chrome driver
เชื่อว่าเพื่อนๆหลายคนอาจใช้ Chrome driver แทน Firefox driver ตามที่ผมทำให้ดู หากพบ error ลักษณะนี้ คือมันแจ้งว่าต้องการ Chrome driver เวอร์ชัน 80
Open Chrome Browser | FAIL |
SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 80
ให้ลองสืบค้นที่นี่ครับ
ทางแก้ ผมได้ update Google Chrome
เมนู > Chrome > About Google Chrome
อ้างอิงคำสั่ง Selenium2Library
Automated Test มันเริ่มขึ้น (ตั้งนาน) แล้ว!