สร้างแอป Android พร้อม Automate Testing ด้วย Appium — ตอนที่ 1

ถ้าพูดถึงเรื่อง Automate Testing บน Mobile Application แล้วคนที่เขียนอาจจะยังมีน้อยถึงน้อยมาก ตัวผมเองก็พึ่งเริ่มหันมาเขียน Automate บ้างแล้วเหมือนกัน จากที่แต่ก่อนดำรงตำแหน่งนายกสมาคม Manual Testing มานานตอนสมัยเรียน(ตอนนี้ก็ยังเรียนอยู่) แต่ก็ไม่ได้บอกว่า Manual ไม่ดีนะ Manual ก็ยังมีอยู่ แต่ในเมื่อมัน Automate ได้ก็ทำซะรออะไร เขียนสคิปเสร็จ สั่งรัน เดินไปหากินข้าวกลับมาก็เสร็จพอดี(สมมุติว่าเสร็จ) ช่วงแรกๆอาจจะดูช้าและใช้เวลาหน่อย แต่ถ้าระยะยาว ผมคิดว่าคุ้มนะ ทั้งประหยัดงบ ประหยัดเวลาในการทดสอบ เพราะฉะนั้นมาเขียนเทสกัน

ตอนที่ 2 ออกแล้ว

ภาพจากเพจ Code Kong ขโมยรูปมา

ต้องบอกก่อนว่าผมเองยังก็ยังไม่แม่นเรื่องเทสเท่าไหร่ และต้องขอบคุณพี่แทนใจ Kaidee, พี่ยิ้ม, พี่รุ่ง, พี่ก้อง ที่ช่วยให้คำแนะนำจนทำให้ผมได้รู้จักกับ Appium ครับ

Appium เป็น framework open source สำหรับทำ Automate Testing บน Mobile Application

Appium Server ถูกเขียนด้วย NodeJS เป็น concept เดียวกับ Selenium Server *ไม่ใช่ Thaitanium นะ อันนั้น Hip hop

Appium นำความสามารถของ WebDriver client libraries และเพิ่มความสามารถให้ทำงานกับ Mobile ได้ดีขึ้น เช่น multitouch, gestures, screen orientation เป็นต้น

โดย platforms ที่รองรับ ได้แก่ iOS, Android และ FirefoxOS แน่นอนว่าเขียนครั้งเดียวสามารถเทสได้หลาย platforms โดยแต่ละ platforms อาจจะมีเขียนแตกต่างกันเล็กหน่อย

ส่วนภาษาที่ใช้เขียนสคิปก็มีให้เลือกด้วยกันหลายภาษาแล้วแต่จะเลือก เช่น Java, Objective-C, JavaScript, PHP, Python, Ruby, C#, Clojure, และ Perl

** สำหรับบทความนี้จะเทสบน Android และภาษาที่จะใช้ในการเขียนสคิปจะใช้ Java ครับ

ส่วนการติดตั้ง Appium สามารถอ่านได้จาก blog ของพี่แทนใจครับ มีทั้ง Mac และ Windows

1 เดือนผ่านไป config อะไรเสร็จเรียบร้อยจะได้หน้าตา ดังภาพ

ภาพ Appium บนเครื่อง Mac

สำหรับเครื่องใครที่เป็น Windows ผมเสียใจด้วยครับ คุณได้ไปต่อแค่ Android แต่คุณไม่ได้ไปต่อสำหรับบ้าน iOS นะจ๊ะ (พูดเหมือน blog นี้สอนเทสบน ​iOS)

ถ้า config อะไรเรียบร้อยแล้ว Appium จะใช้งานได้ก็ต่อเมื่อกดปุ่มดังภาพ

ภาพปุ่มสำหรับ check ว่าใช้งานได้หรือไม่? ไหนเป็นยังไงบอกหมอสิ

ถ้า config สำเร็จจะได้ดังภาพนี้ครับ

ภาพแสดงว่า config สำเร็จ

จากนี้ก็ใช้งานได้แล้วครับ ลุยต่อกันเลย

จากหน้าตาของ Appium เราจะสังเกตเห็นได้เลยว่ามีปุ่มให้เลือกของแต่ละ platforms

ภาพปุ่มสำหรับเลือก platforms

ถ้าลองกดเล่นๆที่ไอคอน Android ก็จะเห็นเลยว่าแต่ละช่องก็คุ้นๆกันทั้งนั้น ถ้าเขียน Android มาก่อนนี่นอนมาเลยทีเดียว

ภาพ Android Settings

หลักๆสามารถอธิบายแต่ละตัว ได้ดังนี้

App Path คือ ที่อยู่ของไฟล์ apk ที่เราจะทำการทดสอบ

Package คือ ชื่อ package ของแอป

Launch Activity คือ ชื่อ Activity ที่จะสั่งให้ทำงานเป็น Activity แรก

Full Reset คือ การที่เทสในครั้งต่อไปจะต้องทำการ Reset ข้อมูลใหม่

No Reset คือ การที่เทสครั้งต่อไปก็ยังคงเป็นค่าเดิม

Launch AVD คือ ชื่อ AVD(Android Virtual Device) ที่เราจะเทส ถ้าไม่เลือกเดี๋ยว Appium มันจะหา AVD ที่เปิดอยู่แล้วทำงานกับ AVD นั้น

Platform Name คือ ชื่อของ Platform ที่จะเทส

Platform Version คือ เวอร์ชันของ platform ที่จะทำการเทส เช่นในกรณีนี้คือ 4.4

Device Name คือ ชื่ออุปกรณ์ ซึ่งเราสามารถตั้งเองนะครับส่วนนี้

สิ่งแรกที่เราต้องทำคือต้องมีแอปที่จะเทสก่อนครับ ตลกละถ้าไม่มีจะเอาอะไรเทส (จริงๆมีแค่ apk ก็ได้เทสได้แล้ว) ฉะนั้นผมจะเขียนแอปง่ายๆขึ้นมาสักแอป คือ แอปที่มีการ Log In เข้าใช้งาน

งั้นก็เริ่มเลยครับ ขั้นตอนการสร้างคงไม่ขอกล่าวแบบละเอียดมาก เพราะเดี๋ยว blog มันจะยาว (เปิด blog มายาวไป ปิดทิ้งซะเลย)

เปิด Android Studio แล้วสร้างโปรเจคแบบ Empty

Android Studio
Empty Activity

จากนั้นสร้าง Activity เพิ่มอีกหน้าครับ ชื่อว่า LogInActivity อย่าลืมเลือกที่ Launcher Activity เพื่อเปลี่ยนให้ LogInActivity รันขึ้นมาเป็น Activity แรกด้วยนะครับ เพื่อความแน่ใจอย่าลืมไป check ที่ AndroidManifest.xml ด้วยนะครับ

หน้า LogInActivity เราจะออกแบบให้ได้หน้าตาแบบนี้

ส่วนโค้ด xml ก็ได้ตามนี้

โค้ด Java ของ LogInActivity เขียนแบบรีบๆ ได้ตามนี้

เกณฑ์คือถ้า Log In ผ่านก็จะไปที่หน้า MainActivity ถ้าไม่ผ่านจะมี dialog เด้งมาบอกว่า “Invalid username or password” แค่นี้เป็นอันเสร็จขั้นตอนของการสร้างแอป นี่ขนาดบอกไม่ละเอียด

เมื่อสร้างแอปเสร็จแล้วขั้นตอนต่อมาคือการ Export แอปของเราให้ออกมาในรูปแบของไฟล์นามสกุล .apk

ขั้นตอนก็คือไปที่ Build > Generate Signed APK

จากนั้นจะมี dialog ให้เลือกว่าจะ Generate module ไหน ในที่นี้ผมจะ generate module ที่ชื่อว่า app แล้วกด Next

ขั้นตอนต่อมาคือการสร้าง key store

กรอกอะไรเสร็จเรียบร้อยขั้นต่อไปก็ Generate ให้เรียบร้อย ขั้นตอนไปไม่ขออธิบายต่อ

Generate เสร็จก็จะได้ไฟล์ APK สำหรับเทสแล้ว

จากนั้นเปิด Appium แล้วเลือก APK ที่เราจะเทส แล้วก็ settings อะไรให้เรียบร้อย ดังภาพ

ภาพ android settings

เมื่อ settings อะไรเสร็จ ให้กด Launch เพื่อสั่งให้ appium ทำงาน จะได้ดังภาพ

เป็นอันว่า Appium เริ่มทำงานแล้ว Appium นั้นมีความพิเศษที่ผมรู้สึกว่าชอบมากคือการที่สามารถ Inspect ดูโครงสร้าง UI ของแอปนั้นๆได้ ถ้าใครเคยใช้ Selenium IDE นั่นแหละแบบนั้นเลย ด้วยการกดรูปแว่นขยาย

Inspector

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

ถ้าลองเล่นดูแล้ว สิ่งที่เราอยากได้คือ resource id ของช่อง username,password และปุ่ม LOG IN คำถามต่อมาก็คือเราจะได้จากไหน? คำตอบอยู่ใน Appium Inspector ครับ หรือ UI Automator View ก็ได้เพราะ Appium ก็ไปเรียก UI Automator ต่ออีกที ในลองนำเมาส์ไปกดที่ช่อง username ในหน้าต่าง Inspector ที่แสดง UI ดูครับ มันจะแสดง resource id มาให้ แต่ก็ไม่ตรงทุกครั้งนะครับ เราต้องกดหาเองบ้างบางกรณี ถ้าโครงสร้างแอปซับซ้อนมากๆ พอกดแล้วจะได้ดังภาพ แต่รู้สึกว่า Windows การ inpector จะไม่ work เอาซะเลย สรุปคืออาจจะต้องไล่หา resource id เอง วิธีแก้นั้นก็คือ “ใช้ Mac สิ” ใน Mac option จะเยอะว่า Windows

พอกดแล้วจะมีช่อง Details เพิ่มเข้ามา ลองไล่หาคำว่า resource id จะได้ resource id ดังนี้

resource id

ตัวอื่นๆก็ทำแบบเดียวกันครับ ทีนี้เราได้ resource id มาครบแล้ว ก็เริ่มเขียน java ได้เลยครับ ส่วน IDE ที่เขียน ผมใช้ intellij ครับ

Intellij

สร้างโปรเจค Java สำหรับเขียนสคิปขึ้นมาครับ ซึ่งผมขอตัดรายละเอียดของการสร้างโปรเจค ไม่กล่าวถึงนะครับ

เมื่อสร้างโปรเจคเสร็จเรียบร้อยไลบรารีที่จะใช้มี 2 ตัวกันครับ คือ java-client และ selenium-server-standalone

ให้ทำการเพิ่มเข้าไปในโปรเจคได้เลยครับ (นี่ยังเพิ่ม .jar อยู่อีกหรอ?)

<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>3.3.0</version>
</dependency>
ภาพการเพิ่มไลบรารี

เมื่อเพิ่มไลบรารีเรียบร้อยแล้วให้สร้าง java class ชื่อ LoginTest.java

สร้าง java class

สร้าง class เรียบแล้ว สิ่งที่จะทำต่อมาคือเขียนโค้ดให้มัน Automate ได้ เกณฑ์การทดสอบมี 2 ข้อคือ ในกรณีที่ username และ password ถูกต้อง และ กรณีที่ username หรือ password ไม่ถูกต้อง

สามารถเขียน method ได้ดังนี้ จุดสังเกตอยู่ที่ตัว annotation ได้แก่ @Before, @Test, @After

Before ความหมายตรงตัวคือก่อนที่จะเข้า Test จะให้มันทำอะไร

Test คือ method ที่ทดสอบแต่ละกรณี

After คือหลังจาก Test จะให้มันทำอะไร

อย่างที่บอกครับว่า Before คือก่อนที่จะเข้า Test เราจะให้มันทำอะไร เราก็จะทำการ setup ส่วนต่างๆที่เราจะทดสอบในเบื้องต้น

ก่อนจะเข้า Test ต้องทำการ setup driver ก่อน เพราะถ้าไม่มี driver ก็ติดต่อกับอุปกรณ์ไม่ได้นั่นเอง

ลองสังเกตดูว่าภายใน Before มีตัวแปรชื่อ capabilities ซึ่งถ้ายังจำได้ UI ของ Appium จะมีให้กำหนดด้วยเช่นกัน

DesiredCapability คือ JSON object (Key, Value) ที่จะส่งจาก client ไปยัง Server(Appium)

ถ้าจะกำหนดผ่านโค้ด รูปแบบจะเป็นดังนี้

โดยจะมี argument 2 ตัว คือ key ของ capability และ value ของ capability เช่น

แต่ในที่นี้ผมจะกำหนดไว้แค่ deviceName ครับ ส่วนค่าอื่นๆนั้นก็แล้วแต่จะกำหนด

*automationName เป็นการกำหนด automation engine ซึ่งถ้าต้องการทดสอบที่ API เวอร์ชัน >= 17 ให้ใช้ appium แต่ถ้าต่ำกว่านั้นต้องใช้ seledroid ครับ

ต่อมา ก็เริ่มเขียนเทสกันเลย โดยกรณีแรกคือ กรณีที่กรอก username หรือ password ผิด จะสามารถเขียนได้ดังนี้

findElement(By.id(“resource id”)) คือเราจะติดต่อผ่าน resource id ของ view นั้นๆภายในแอป ตัวแรกคือ edit text ที่รับค่า username

sendKeys(“input text”) คือค่าที่เราจะกรอกลงไปใน edit text

click คือสั่งให้มันกดปุ่ม ในกรณีนี้คือ กดที่ปุ่ม LogIn

รหัสผ่านที่ถูกต้องคือ username: root และ password: root แต่โค้ดด้านบนคือการทดสอบกรณีที่กรอกผิด ถ้ายังจำโค้ด android ได้ จะมี dialog แสดงขึ้นมาว่า Invalid username or password ดังนั้นเราจะตรวจสอบว่า message ที่แสดงขึ้นมานั้นตรงตามที่เรากำหนดไว้หรือไม่? ด้วยคำสั่ง assertEquals

argument ตัวแรกคือ expected result สิ่งที่เราคาดหวังว่าระบบจะให้ผลลัพท์อะไร

argument ตัวที่สองคือ atual result ผลลัพท์จริงที่แสดงจากระบบ

ถ้าผลลัพท์ที่คาดหวังกับผลลัพท์จริงตรงกันแสดว่าการทดสอบกรณีนี้ผ่าน ถ้าโค้ดทั้งหมดได้ดังภาพแล้วให้ลองรันทดสอบได้เลยครับ แต่อย่าลืมว่าต้อง start appium ก่อนเสมอนะครับ

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

กรณีที่กรอกผิดผ่านไป ต่อมาคือเขียนสคิปในกรณีที่กรอกถูกบ้าง แน่นอนว่าวิธีการเขียนก็ไม่ต่างจากเดิมมาก แค่ถ้ากรอก username และ password ถูกต้องแอปจะเด้งไปหน้าอื่น ตามโค้ด android ที่เขียนไว้คือไปที่หน้า MainActivity เขียนได้ดังนี้ครับ

กรณีนี้เราจะตรวจสอบการกรอก username, password ที่ถูกต้องและเด้งไปหน้า MainActivity โค้ดแตกต่างจากกรณีที่แล้วคือ driver.currentActivity() คำสั้งนี้จะแสดงชื่อของ activity ปัจจุบันที่แสดงออกมา ซึ่ง expected result ที่เราหวังไว้คือชื่อของ activity ว่าจะต้องไปที่ .MainActivity ส่วน actual result ผลลัพท์ที่เกิดขึ้นจริงจากคำสั่ง driver.currentActivity() ถ้าผลออกมาตรงกันแสดงว่ากรณีนี้เป็นไปตามที่เราคาดหวังผลลัพท์ไว้ ลองกดรันทดสอบพร้อมกันทั้ง 2 กรณี

ผลที่ได้คือ เทสเขียวทั้ง 2 กรณี แสดงประสบความสำเร็จแล้วครับ

บทความนี้อาจจะไม่ได้ละเอียดเท่าไหร่ เพราะเนื้อหามันค่อนข้างเยอะ แต่ก็ถือว่าเป็นแนวทางในการเริ่มเขียน Automate Testing บน Mobile Application แหละเนอะๆ ที่สำคัญอย่าลืม update test บ่อยๆนะครับ เพราะ software มีการเปลี่ยนแปลงอยู่ตลอด ถ้าเปลี่ยนไม่ได้ก็คงไม่ใช่ software สิจริงปะ? ตัวผมเองก็พึ่งเริ่มเขียนได้ไม่นาน ถ้าผิดพลาดประการใดสามารถแนะนำหรือชี้แนะได้ครับ ขอบคุณครับ ^^

*รออ่านตอนต่อไปได้ครับ กำลังเขียนให้อ่าน

เพิ่มเติม

http://appium.io/slate/en/master/?java#parameter-guide