Monday, May 12, 2014

Robotframework+AutoItLibrary: ขจัดความซ้ำซ้อน

สวัสดีครับ ต่อจากตอนที่แล้ว เรามี Test case สำหรับปุ่มเลข 1 กับ 2 ละ ก็เหลือ 3 - 9 เนอะ

ทีนี้เราจะเพิ่ม Test case สำหรับ ปุ่มที่ 3 เราจะทำยังไงดี Copy มาเลยเหมือนตอนที่แล้วดีมั้ย มันก็ง่ายดีนะ

แต่ช้าก่อนสหาย ลองหยุดแล้วคิดสักหน่อยนะ ถ้าเรา Copy ได้ แปลว่ามันเหมือนกันน่ะสิ เปลี่ยนแค่ Parameter นิดหน่อยเอง ลองสังเกตดูใน Test ของเราให้ดีๆเถิด

เราจะพบว่า มันเหมือนกันมากๆ (ก็แหงล่ะ Copy กันมา) ต่างกันตรงที่ขีดเส้นไว้เท่านั้นแหละ

นี่เรียกว่าความซ้ำซ้อน(Duplicate)ครับ ถ้าปล่อยเอาไว้อย่างนี้ ก็ไม่มีปัญหาอะไรหรอก เราก็ยัง Test ได้ตามปกติ แต่มันจะมีปัญหาเมื่อเวลาผ่านไปเรื่อยๆครับ อย่างเช่นเราจะเพิ่มหรือลด Keyword ก็ต้องไล่ทำทีละอันๆ (อย่างเช่นในตัวอย่างนี้ มีตั้งแต่ 1 - 9 ) คนเราทำอะไรที่มันซ้ำๆ ไม่เก่งหรอกครับ ให้มันช่วยเราดีกว่า

เริ่มจากทำให้ Keyword รับ arguments ครับ แล้วก็เปลี่ยนตรงที่เรียกใช้ Keyword ให้เป็น Argument แทน

ลองรันเทสดู ถ้ายังผ่านก็ไปต่อได้ ขอไม่อนุญาตไม่แปะรูปนะครับ ไม่มีอะไรใหม่

แก้ Keyword อันต่อไปให้รับ Argument เหมือนกัน

เสร็จแล้วรันเทส ต้องยังผ่านอยู่นะครับ

ทีนี้ไปเปลี่ยน Test case อันที่สองให้เป็นแบบ Test case อันแรกดู ต้องเทสผ่านเหมือนเดิมนะ

เราจะเห็นว่า Keyword 'Click Button 2' และ 'Answer Should Be 2' นั้นไม่จำเป็นแล้ว ลบทิ้งไปได้เลย

เป็นไงฮะ ดูสะอาดขึ้นเยอะเลยใช่มั้ยครับ เหลือแค่ 30 บรรทัดเท่านั้นเอง อย่าลืมรันเทสอีกครั้ง เพื่อความมั่นใจ

ทีนี้กลับมาดูที่ Test case เราจะพบว่ามันมีความซ้ำซ้อนอยู่เช่นกัน

ลองดูดีๆเราจะพบว่า สามารถเขียนออกมาเป็นตารางได้

ฺฺNumberButton id
1Button44
2Button49

ซึ่งเราสามารถเอาไปใช้ใน Robot framework ได้เช่นกัน แต่ต้องปรับเปลี่ยนอะไรสักหน่อย

ก็คือเพิ่ม Keyword ที่เป็น Test rule เข้าไป แล้วก็เพิ่ม Clear Answer เพราะว่า ข้อมูลในตารางทั้งหมดถือเป็น Test case อันเดียวครับ (โปรแกรมจะไม่ถูกปิดจนกว่าจะจบแต่ละ Test case)
จะเห็นว่า Test case อันที่ 2 ไม่จำเป็นอีกแล้ว ลบทิ้งไปครับ
แล้วลองทำการทดสอบดูอีกครั้ง ยังผ่านเหมือนเดิม แต่จะเหลือแค่ Case เดียว

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


อย่าลืมแก้กลับให้ถูกต้องด้วยนะครับ

มาดูปุ่มที่เหลือกันต่อ สบายแล้วทีนี้ แค่เพิ่มข้อมูลเข้าไปเท่านั้นเอง ลองเอา Au3Info ไปจับกับปุ่มตัวเลขที่เหลือดูเลยครับ

ตอนหน้ามาลองเขียน Test ที่มันซับซ้อนมากขึ้นครับ อย่างเช่นการบวกเลข ลองไปนั่งนึกหรือลองเขียนดูเลยก็ได้ครับ

ก่อนไป ขอบอกไว้ก่อนว่า ทำไปก่อนจนมองเห็นความซ้ำซ้อน(หรือ Pattern)แล้วค่อยหาทางกำจัดนะครับ ถ้าพยายามป้องกันตั้งแต่แรก เราอาจจะเหนื่อยโดยไม่จำเป็น หรือหลงป่าเขารกเข้าพงไปเลยได้ นี่เตือนในฐานะเป็นผู้ประสบภัยมาก่อนนะครับ(ทุกวันนี้ก็ยังหลงเข้าไปอยู่เรื่อยๆ) อิอิ

Thursday, May 8, 2014

RobotFramework+AutoItLibrary: เปิดแล้วปิดด้วยสิ

สวัสดีครับ จากตอนที่แล้ว เราได้ Test case ง่ายๆมาแล้วหนึ่งอัน ตอนนี้เราจะมาทำปุ่มต่อไปกันครับ

ตอนนี้เราสนใจเฉพาะปุ่มตัวเลขไปก่อนแล้วกันเนอะ เพราะฉะนั้นเรายังเหลืออีก 8 ปุ่มที่จะเอามาทดสอบ ก็คือเลข 2 - 9

ลองไล่ไปตามลำดับก็แล้วกัน เริ่มจากเลข 2 ก็ทำเหมือนเดิมครับ เอา Finder ไปจับดูว่า Classname ของปุ่มเลข 2 คืออะไร แล้วก็ copy มาเลย

ถ้ารู้สึกตะหงิดๆก็เก็บไว้ในใจก่อนนะครับ ตอนนี้ save แล้วก็ run ดูก่อนครับ

จะเห็นว่าเทสมันก็ผ่านนะครับ แต่มีโปรแกรมมันเครื่องคิดเลขถูกเปิดขึ้นมาสองตัว ลองคิดดูถ้าเราเทสปุ่มตัวเลข 9 ปุ่ม ก็จะมีโปรแกรมเปิดขึ้นมา 9 ตัว แล้วถ้ามี Test case อื่นๆอีกนี่ ไม่ไหวแน่
เพราะงั้น เราควรจะให้มันปิดตัวเองหลังจากที่มันทำการทดสอบแต่ละ case เสร็จ ด้วย Keyword 'Win Close'

จะเห็น โปรแกรมเครื่องคิดเลข ถูกเปิดขึ้นมาเทสแล้วก็ปิดลงไป ซึ่งเทสของเรายังผ่านเหมือนเดิม
การเปิด และปิดโปรแกรม เราควรย้ายไปไว้ที่ Test setup (สิ่งที่ต้องทำก่อนเริ่มTest)และ Test teardown(สิ่งที่ต้องทำหลังTest) มากกว่า ถ้าเป็นงานจริงๆ คุณอาจจะต้อง Clean หรือ Backup Database นะครับ ก็เอาไว้ใน Setup นี่แหละ

ย้ายโลด

ลองรันดู ยังได้ผลเหมือนเดิม
อืมม แต่ตรง Teardown ยังไม่ค่อยสวยเนอะ เราสร้าง Stop Calculator มาไว้คู่กันดีกว่า

รันอีกทีต้องยังผ่านอยู่นะ ^^





Wednesday, May 7, 2014

Robotframework+AutoItLibrary:หัดใช้Controls

สวัสดีครับ จากตอนที่แล้ว เรายังเหลือ Keyword อีกสองอันที่ยังไม่ได้ทำอะไรกับมัน

เริ่มจาก Click Button 1 ก่อนนะครับ อันนี้คือเราต้องการให้มันคลิกที่ปุ่มเลข 1 ในโปรแกรมเครื่องคิดเลข เราก็ไปดูที่ Document ของ AutoItLibrary เหมือนตอนที่แล้วนะครับ แต่คราวนี้มาดูจะกดปุ่มเนี่ย ต้องใช้คำสั่งอะไร
หาๆไปก็เจอ Control Click ที่มากับ Parameter อีกนิดหน่อย

ก็ดูไม่มีอะไรซับซ้อนนะ แต่ไอ้ Parameter พวกนี้จะเอามาจากไหนล่ะ

AutoItLibrary มีเครื่องมือมาให้แล้วครับ มีชื่อว่า Au3Info.exe มันนอนรอเราอยู่ที่
>C:\RobotFramework\Extensions\AutoItLibrary

เปิดขึ้นมาก็จะเจอหน้าตาแบบนี้

วิธีใช้งานนะครับ ก็ต้องเปิดโปรแกรมที่เราจะทำการทดสอบขึ้นมาก่อน แล้วก็ลากสัญลักษณ์กลมๆในช่อง Finder tool ไปที่ที่เราต้องการจะทราบข้อมูลของมัน ในตัวอย่างนี้ก็คือ ปุ่ม 1 ในโปรแกรมเครื่องคิดเลข ลองดูครับ

พอลากไปแล้ว สังเกตว่าจะมีข้อมูลปรากฏขึ้น ตรงที่ผมตีกรอบไว้นั่นคือ Parameter ตัวแรกของเราครับ ซึ่งมันก็คือข้อความใน Title bar ของโปรแกรมนั่นแหละ
Parameter ตัวที่2(strText)นั้นไม่จำเป็น เราสามารถข้ามไปตัวที่3(strControl)ได้เลย
โดยการคลิกที่แท็บ Control

ตัวที่ตีกรอบไว้นั่นแหละครับ คือข้อมูลที่เราจะเอามาใส่เป็น parameter ตัวที่สาม

เอามาใส่ใน Test ของเราครับ

${EMPTY} หมายถึงค่าว่างครับ เหมือนกับ Null หรือ None ใน Python คือถ้าเราไม่ต้องการใส่ Parameter ตัวไหน หรือต้องการปล่อยให้มันว่างๆไว้ ก็ใช้ตัวนี้ครับ 

อย่าลืมเคาะ Space bar 2ทีระหว่าง parameter นะครับ เสร็จแล้วลองรันดู

ก็ดูเหมือนจะโอเคแล้วนะ แต่ไม่เห็นมันจะกดปุ่มเลยอ่ะ

จริงๆแล้วไม่ใช่มันไม่กดครับ แต่มันกดไม่ทัน เพราะตัว Script มันจะทำงานเร็วมาก เราต้องบอกให้มันรอให้ Window ของโปรแกรมที่เราจะทดสอบเปิดขึ้นมาก่อนครับ
ผมจะเติมเข้าไปที่ Start Calculator นะครับ

แล้วลองรันดูอีกที เลข 1 ถูกกดแล้ว

เหลือ Keyword อันสุดท้าย ก็ทำเหมือนเดิมครับ ไปหาดูว่าจะเอาข้อมูลจาก Control เค้าทำยังไง

Control Get Text นี่น่าจะใช่แฮะ ลองเอามาใช้ดู

ซึ่งใน Keyword อันนี้เราจะนำค่าที่ได้มาทำการเปรียบเทียบ ก็ต้องมีตัวแปรมาเก็บไว้ ทำแบบนี้ครับ

เสร็จแล้วเอามาเทียบกันโดยการใช้ Keyword 'Should Be Equal' (เป็น Built in keyword ของ Robotframework)
เอาไว้เปรียบเทียบค่าต่างๆสองตัว ถ้าไม่เท่ากันก็ Fail รับ Parameter 4 ตัว แต่เราสนใจแค่ 2 ตัวแรกก็พอ 
ตัวแรกคือข้อความจากในช่อง Answer ของโปรแกรม
ส่วนตัวที่สองก็คือ ${ANSWER_TEXT} ที่เราเก็บไว้นั่นเอง

แล้วลองรันดู ยังไม่ผ่านแฮะ

ตรงนี้ต้องใช้เวลากับความพยายามสักหน่อยนะครับ ในการหาสาเหตุและแก้ปัญหาของมัน
ผมบอกเลยละกันครับ มันเป็นเพราะว่า ใน ${ANSWER_TEXT} ที่ได้มา มันมี space ต่อท้ายมาด้วยครับ ซึ่งเราแก้ปัญหาได้หลายแบบ วันนี้ขอแนะนำแบบง่ายๆ ก็คือใช้ฟังก์ชั่น strip() เพื่อกำจัด space ออกไปครับ

ลองดูอีกที ผ่านแล้ว!


ไม่นึกว่าเขียนไปเขียนมามันจะยาวขนาดนี้นะเนี่ย ตอนนี้ไปฉลองความสำเร็จให้กับ Test case เล็กๆกันก่อนครับ ตอนหน้ามาลองทดสอบปุ่มอื่นๆกัน

แถม Link ไปดูว่ามี Builtin keyword อะไรบ้าง
http://robotframework.googlecode.com/hg/doc/libraries/BuiltIn.html?r=2.8.4

Tuesday, May 6, 2014

ลองเขียน Robot framework + AutoItLibrary เปิดโปรแกรม

สวัสดีครับ ต่อจากตอนที่แล้ว ตอนนี้เรามีเครื่องมือพร้อมแล้ว ก็มาหัดเขียนกัน

ลองเปิดเข้าไปดูไฟล์ตัวอย่างนะครับที่
C:\RobotFramework\Extensions\AutoItLibrary\tests\Calculator_Test_Cases.html
จะพบว่า อะไรวะเนี่ย ยาวพรืดไปหมด ไม่รู้เรื่องเลยเฟร้ย!! เหมือนผมที่เริ่มหัดเขียนครั้งแรกนั่นแหละ ไม่เป็นไรครับ ค่อยๆทำไปด้วยกัน

Robot framework เขียนได้หลายแบบ ในตัวอย่างเป็นแบบ HTML เพื่อให้สามารถอ่านได้ง่าย ดูเป็นระเบียบมากยิ่งขึ้น แต่ในบทความนี้ผมจะเขียนเป็น Text file ธรรมดาๆครับ สำหรับการเริ่มต้น (HTML ผมเองก็ยังไม่เคยเขียนเหมือนกัน บอกเลย 555)

เราจะลองเขียนโดยอ้างอิงจากตัวอย่างนะครับ เป็นการเขียน Test script สำหรับโปรแกรมเครื่องคิดเลข ที่ติดมากับเครื่องของเรา ลองคิดดูเล่นๆครับว่า ถ้าเราจะทดสอบเจ้าโปรแกรมเครื่องคิดเลขนี่ จะต้องทดสอบอะไรมันบ้าง ให้เวลาสามวินาที

หมดเวลาครับ ผมจะเริ่มที่เคสพื้นๆก่อน อย่างเช่น กดปุ่ม 1 ต้องเห็นเลข 1 ในช่องคำตอบนะครับ
เอาไปเขียนเป็น Robot framework test case จะได้หน้าตาประมาณนี้

เสร็จแล้ว save (ผมตั้งชื่อไฟล์ว่า testcase.txt) แล้วลองรันดูเลยครับ เปิด command prompt แล้วไปยังที่ๆทำการ save เอาไว้ แล้วรันด้วยคำสั่ง
>pybot testcase.txt

จะพบกับ Error อีกแล้ว อย่าไปกลัวมันครับ เค้าก็แค่อยากจะบอกว่า มันยังทำงานไม่ได้นะ ดูสิว่าเราทำอะไรพลาดไป

มันบอกว่า ไม่รู้จัก Keyword ที่ชื่อ  Start Calculator ครับ เราก็ไปสร้าง Keyword นี้ขึ้นมา

แล้วลองรันดู ก็ยัง Error เหมือนเดิม แต่เปลี่ยนเป็นเพราะข้างใน Start Calculator มันยังไม่มีอะไรเลยน่ะสิ

โอเค มาทำให้มันผ่านกัน ตอนนี้เราต้องการให้มันเปิดโปรแกรมเครื่องคิดเลขขึ้นมาก่อน ก็ไปดูใน document ของ AutoItLibrary กันครับ ที่นี่ http://robotframework-autoitlibrary.googlecode.com/svn/tags/robotframework-AutoItLibrary-1.1/doc/AutoItLibrary.html มองหาคำสั่งที่เอาไว้เปิดโปรแกรม ก็คือคำสั่ง Run ตามด้วยชื่อไฟล์

อธิบายเล็กน้อย คำสั่ง Run นั้น ต้องการ arguments ก็คือชื่อไฟล์ calculator.exe ซึ่งวิธีการใส่ Arguments ใน Robotframework นั้นต้องเคาะ spacebar 2ครั้ง ระหว่างชื่อ keyword กับ arguments เคาะ sapcebar เท่านั้นนะครับ ห้ามใช้ tab เด็ดขาด!
เสร็จแล้วลองรันดูก็ยังไม่ผ่านอีก Keyword 'Run' คือไร ไม่รู้จัก

นั่นเพราะว่าเรายังไม่ได้บอกให้มันรับรู้ว่า เราต้องการใช้ Keyword จาก Auto Library นะ เราก็ต้องไปเพิ่ม settings ของ test เราครับ
อ้อ แก้ชื่อไฟล์ตรงบรรทัดสุดท้ายจาก calculator.exe เป็น calc.exe ด้วยครับ ผมจำผิด แหะๆ

เสร็จแล้วลองรันดูครับ โปรแกรมเครื่องคิดเลขจะเปิดขึ้นมาเองเลย

แต่ก็ยังไม่ผ่านนะครับ เพราะเรายังทำไม่ครบเลยนี่ แค่เปิดโปรแกรมก้ใช้พลังงานไปมหาศาลแล้วใช่มั้ยล่ะ ไว้ตอนหน้ามาต่อกัน กับการใช้งาน control ต่างๆ

ขออธิบายเพิ่มเติมหน่อย ที่มาของ calc.exe ก็คือมันเป็นโปรแกรมที่อยู่ใน path ของ windows อยู่แล้วนะครับ เลยใช้ได้เลย ถ้าเป็นโปรแกรมของเราเองหรือโปรแกรมอื่นๆที่ไม่ได้อยู่ใน System path ต้องระบุให้ถูกต้องนะครับ

Monday, May 5, 2014

ติดตั้ง Robot Framework + AutoItLibrary สำหรับ Automated testing กับ Windows application


ภาพจาก http://www.odedgov.com/index.php?/projectsbezalel/automata/


ไม่รู้จะเริ่มยังไง เอาเป็นว่า บทความนี้เป็นการแนะนำการติดตั้งเครื่องมือสำหรับการทำ Automated test ที่มีชื่อว่า Robot framework นะครับ ส่วนใหญ่เขาทำกับ Web application คราวนี้มาลอง Windows application กันดูบ้าง โดยผ่าน library ที่มีชื่อว่า AutoItLibrary ครับ เป็น library ที่เขียนครอบ AutoIt อีกที ซึ่งเจ้า AutoIt มันก็คือเครื่องมือที่เอาไว้รัน Automate script บน Windows อยู่แล้ว อยากรู้มากกว่านี้ลองเข้าไปอ่านที่ http://www.autoitscript.com/site/autoit/
อ้อ ก่อนอื่นผมแนะนำให้ไป download Virtualbox มาแล้วทำการติดตั้ง Windows แล้วลองติดตั้งเล่นใน virtual machine ดูก่อนนะครับ เผื่อว่าทำอะไรผิดพลาดไปจะได้ลบทิ้งแล้วเริ่มใหม่ได้ง่ายๆ Windows รุ่นที่แนะนำคือ XP ครับ ISO ก็คงหากันเองได้ไม่ยากหรอก(มั้ง)  ใหม่กว่านี้จะติดพวก UAC ต้องไปหาทาง disable เอา ไหนจะเรื่อง 32/64 bit อีก วุ่นวายตามประสา Windows

เริ่มกันเลย 
1.ติดตั้ง Python โดยไป Download ได้จาก https://www.python.org/download/ โดย version ที่แนะนำให้ใช้คือ 2.7 ขึ้นไป (3 ยังไม่เคยลองครับ) และควรใช้แค่ 32 บิต ก็พอ
2.ไปเพิ่ม path
C:\Python27;C:\Python27\Lib\site-packages\;C:\Python27\Scripts\;
ที่ environment settings ของ Windows ตามนี้

ลองเปิด command prompt แล้วพิมพ์คำสั่ง python ดูครับ ควรจะได้หน้าตาประมาณนี้

3.ติดตั้ง pip โดยไปที่เพจนี้ https://pip.pypa.io/en/latest/installing.html ที่หัวข้อ Install pip จะเจอลิงค์ get-pip.py นะครับ คลิกขวาแล้ว save as มาไว้ในเครื่อง

เสร็จแล้วไปยังตำแหน่งที่เราเก็บไฟล์ get-pip.py เอาไว้(ผมเอาไว้ใน My documents\downloads) แล้วพิมพ์คำสั่ง
>python get-pip.py
รอสักพักจนมันติดตั้งเสร็จเรียบร้อย

แล้วลองพิมพ์คำสั่ง
>pip install
จะเจอ Error ประมาณนี้ แปลว่าคำสั่ง pip ใช้งานได้ครับ

4.ติดตั้ง Robot framework โดยพิมพ์
>pip install robotframework
เสร็จแล้วลองพิมพ์คำสั่ง
>pybot
จะเห็น Error อีกเช่นกัน แต่เป็นเพราะว่าเรายังไม่มีไฟล์ script ที่ใช้ในการเทส ไม่เป็นไร เดี๋ยวมีแน่

5.เสร็จแล้วไป Download AutoItLibrary มาครับ
แตก zip แล้วติดตั้งด้วย คำสั่ง
>python setup.py install
เราจะพบว่า ยังติดตั้งไม่ได้ ต้องลง pywin32 ก่อน

ก็ไปโหลดมาครับ ที่นี่ http://sourceforge.net/projects/pywin32/files/pywin32/ เลือกเอา build ล่าสุดสำหรับ Python 2.7 และ win32 นะครับ ดูดีๆ โหลดมา เป็นไฟล์ exe อยู่แล้วทำการติดตั้งได้เลยครับ

กลับไป install AutoItLibrary อีกที ผ่านแล้ว

6.ลองทดสอบดู โดยไปที่ C:\RobotFramework\Extensions\AutoItLibrary\tests เขาจะมีตัวอย่างไว้ให้แล้ว ลองทดสอบดูโดยการ run ไฟล์ที่ชื่อ Runtests.bat

โปรแกรม Calculator จะถูกเปิดขึ้นมา แล้วก็กดปุ่มต่างๆเองตาม script ในตัวอย่าง พร้อมแสดงผลของ Test case แต่ละอัน


รันจบแล้ว แต่มันยังไม่จบครับ จะโดนเตือนอีกว่า ยังไม่ได้ลง PIL(Python image library)  นะ ถ้าอยากจะให้ capture ภาพเอาไว้ช่วยลงให้ด้วย

โอเค เราก็ไปโหลดมา http://www.pythonware.com/products/pil/ (ไปโหลดมาเลยครับ อย่าไปหวังพึ่งพาอะไรกับ pip ใน Windows อิอิ) ติดตั้งเสร็จแล้วก็ ลองรัน test ดูใหม่ มันจะไม่เตือนเราแล้ว ทีนี้เข้าไปดูในโฟลเดอร์ results นะครับ เราจะเห็นภาพที่มัน capture เอาไว้ให้เรา


ตอนหน้ามาลองเขียน Test ง่ายๆเพื่อทำความรู้จักกับเจ้า AutoItLibrary กันครับ