feature-image-dynamic-install-application-appium
feature-image-dynamic-install-application-appium

เคยมั้ยที่เวลาเราทํา Automation scripts แล้วเจอ scenario ที่ต้องทดสอบ Behavior ของ Application โดยการ install และ uninstall application ออก เพื่อดูว่ามันสามารถทํางานได้ถูกต้องมั้ย เมื่อลูกค้ามาใช้งาน Application เช่น

“แอพ A จะต้องเปิด หน้าเว็ปของ facebook ถ้ามันไม่มี facebook application อยู่บนเครื่อง

แต่ถ้ามี facebook application มันจะต้องเปิด facebook application และไปหน้าที่กําหนดไว้”

ด้วย scenario แบบนี้ก็ชัดล่ะ ว่าเราต้องทําการ install และ uninstall application ระหว่าง automation script เราทํางานอยู่นั้นเอง …. แต่เราจะทํายังไงดีละ? เพราะใน Robot Framework Appium Library เองก็ไม่ได้รองรับไว้ สิ่งที่มันมีก็จะมีแค่ “Remove Application” เท่านั้น

remove-application-appium-library
remove-application-appium-library

เจ้า Keyword นี้จะลบ Application ออกโดยจะลบ App. ออกตาม package ขอ App.

แล้วทีนี้เราจะจัดการยังไงดีล่ะ?

ก็จากที่ลองคิดเล่นๆก็นึกออกอยู่วิธีนึงคือ ถ้าใน Android มันจะมี command line tool ตัวนึงชื่อว่า ADB (Android Device Bridge) ที่เป็นตัวกลางเพื่อพูดคุยกับ device  (emulator หรือ android device ที่เชื่อมกับ computer อยู่)

ที่นึกถึงตัวนี้ก็เพราะ มันจะมีคําสั่งที่ชื่อว่า “adb install path_to_apk” อยู่ ซึ่งเจ้าตัวนี้ทําหน้าที่ในการ install apk ให้เราผ่าน command line ได้น่าจะช่วยจัดการ install app. ให้เราได้ ถ้าเอาไปรวมกับ Robot Framework ตัวที่ควบคุม “Run Process

run-process-robot-framework-process
run-process-robot-framework-process

อารมณ์ประมาณนี้เลย

 

example-robotframework-run-process-adb
example-robotframework-run-process-adb

Remark: ADB References Command, Result Object เจ้าตัวนี้คือ result เมื่อเราใช้คําสั่ง Run Process

ทีนี้เรื่องก็ดูเหมือนจะจบด้วยดี แต่ทว่า การใช้ Run Process แบบนี้มันดันให้ผลลัพธ์ออกมาแบบนี้

result-run-process-robotframework
result-run-process-robotframework

มันโคตรรรรรรรรรรรช้าครับพี่น้อง จะเห็นว่าใน rbfw script ข้างบน set timeout ถึง 4 นาทีแล้วแท้ๆ (เยอะมากในการทํา automation) ยังจะไม่รอด พึ่งแค่ 10% เท่านั้นเอง

แปลว่ายังงี้ถ้าจะรอให้ 100% ก็ต้องคิดตรงๆเลยเช่น 10% = 4นาที ถ้า 100% ก็ต้อง 40 นาที !!! โอ้ว เทสเคสเดียว 40 นาที ตลกไปมั้ย? มาก…. 🙁

แล้วจะทําไงล่ะ? เราเป็น Software Engineer in Test ด้วย จะไปบอก Test Manual ได้ไหมครับ มันก็….น่ะ

Appium come to rescue 

รู้หรือไม่ว่า Appium เองก็สามารถที่จะ install application ได้ด้วยน่ะ อ่านจาก API Reference และใช้งานง่ายมากเลยละ

python-appium-binding-install-app
python-appium-binding-install-app

ถ้าเราไปเปิด source code ดูก็จะพบ code แบบนี้

python-appium-binding-install-app-source-code
python-appium-binding-install-app-source-code

สิ่งที่มันทําก็จะไม่มีไรมากนอกจากรวบรวมข้อมูล เพื่อยิง post ไปให้มันลง application นั้นเอง

command-executor-appium-python
command-executor-appium-python

เจ้าตัวนี้แหละ คือตัวเทพที่เข้ามาช่วยให้เราสามารถลง application ได้ง่ายขึ้นมากๆเลย

จบแล้ว?

ยังงง ถึงแม้เรารู้ว่า Appium มี API ที่รองรับให้เราใช้ แต่ใช่ว่าเราจะเอาไปใช้ได้ตรงๆเลยน่ะ เพราะ

  1. ลองเข้าไปดูใน source code น่ะ มันจะเห็นว่ามันมีการเรียก driver หรือหมายถึงตัวที่ใช้ในการติดต่อกับ session ปัจจุบัน แล้วเราจะไปเอามายังไงล่ะ?
  2. จะเขียนเป็น Library แยกออกมาเลยแล้วให้ rbfw ไปเรียกใช้ดีมั้ย? แล้วพยายามไปดึง session ของ driver ปัจจุันมาแทน?

คําตอบคือเราไม่จําเป็นต้องคิดเยอะอย่างนั้น เพราะอย่าลืมสิว่าเราใช้ Robot Framework Appium Library ตัวนี้อยู่

และสิ่งที่เราต้องทําก็ไม่ยุ่งยากอะไร คือแค่ไปเพิ่ม Method นึงใน _android_utils.py (จะได้รวม function ที่เกี่ยวกับ android ไว้ที่เดียวกัน)

robotframework-appium-library-android-utils
robotframework-appium-library-android-utils

แล้วเขียนยังไงล่ะ?

python-appium-binding-install-app
python-appium-binding-install-app

เห็นแค่นี้ใครมันจะไปเขียนได้ (อาจจะมีเทพเขียนได้ แต่ไม่ใช่ผมม 🙂 ) ทีนี้สิ่งที่ Developer ที่นี้ยํ้ากันปากเปียกปากแฉะคือ เขียน unit test ให้เป็น document ครับ ซึ่งมันก็จริง!!!!! เรามาดู unit test ของ Appium กัน

appium-unit-test-install-app
appium-unit-test-install-app

กระจ่างเลยมั้ย? เราเขียน Unit test เพื่อให้คนอื่นมาอ่านโค้ดเราเข้าใจ โดยที่ไม่ต้องมาถามเราว่า function นี้ทําอะไรนั้นเอง

ที้นี้หลังจากเห็นวิธีการใช้งาน Method แล้ว เราก็ copy สิครับ รออะไรพี่น้อง 🙂

rbfw-appium-install-app
rbfw-appium-install-app

แค่นี้เลย มันก็จะสามารถลง application ที่เราระบุไว้ให้ โดยที่จะ return true หรือ false กลับไปเพื่อให้เรารู้ว่า ลงสําเร็จหรือไม่นั้นเอง

ใน robot framework ก็ import library เข้าไปเรียกสไตล์ “AppiumLibrary.Install App path_to_app app_package”

อย่าลืม

การที่เราเอา Robot Framework Appium Library มาเขียน function เพิ่มเข้าไปยังงี้ แปลว่าเราโม Library เค้าน่ะ เวลาที่เราทําก็อาจจะ folk มาจากตัวแม่ก่อนก็ได้ เพื่อที่เวลา Library เค้าอัพเดต เราจะได้อัพเดตได้ตาม

แต่จุดสําคัญที่สุดคือ เราจะลงผ่าน pip ไม่ได้แล้วน่ะ เราต้องทําการ

  1. pip uninstall robotframework-appiumlibrary
  2. แล้วไปที่ repository path แล้วก็ python setup.py install เพื่อลงจาก local แทน

หลังจากนั้นเราก็จะใช้เทสได้ตามปกติล่ะ แต่ที่เลือกวิธีนี้ทําให้เราไม่ต้องเสียเวลาไปเขียน Library ใหม่ทั้งหมดเพื่อจัดการกับ driver เองน่ะ

สรุป

การเขียน function ใหม่เพื่อให้ Robot Framework Automation Script ของเราทํางานได้ขีดสุดไม่ใช่เรื่องยาก เพียงแค่เราต้องเข้าใจในหลายๆอย่างนั้นเอง เช่น

  • เราใช้ เทส device โดย Appium เพราะฉะนั้นเราก็ไปแก้โค้ด Robot Framework Appium Library เป็น version ของเราเลย หรือจะ contribute เข้าไปก็ได้น่ะ
  • Appium มี Client ที่ไว้ให้เราใช้เพียบที่นี้ แต่เราควรจะใช้ python ถ้าเราใช้ robot frameworkเพราะมันจะได้ช่วยให้เราจัดการกับตัว Robot Framework ได้ง่ายๆ
  • อ่าน API Reference ของ Appium เสมอ เพราะมันมีอะไรให้ใช้อีกเยอะ
  • unit test ช่วยชีวิต และ จงเขียน unit test แทน doc.

Noted:

  • เราจะเห็นในหลายๆ Library จะมีไฟล์ __init__.py เยอะมาก มันมีไว้เพื่อให้ Python compiler treat directories เหมือน package

    python-module-meaning
    python-module-meaning

 

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.