android-testing-espresso
android-testing-espresso

จากบทความที่แล้วที่คุยกันว่า ไม่ว่าจะเป็น robot framework หรือ cucumber มันก็ยิ่งวิ่งเล่นด้วย จานเดียวกันอยู่ หรือก็คือ ใช้ appium อยู่ดี เพราะฉะนั้นบทความนี้เลยมาอธิบายถึงเรื่องการใช้ Espresso ซึ่งเป็นของตัว Android เองเลย ในการทดสอบ application 🙂

Espresso คืออะไร?

espresso-android-testing
espresso-android-testing

ที่แน่ๆมันไม่ใช่กาแฟ ……

แต่มันคือ Android UI testing (White box testing) ของ Google เอง โดยกลุ่มลูกค้าหลักของ Espresso ก็คือ Developer ที่เชื่อว่า Automate testing เป็น part นึงของ Development Cycle !

โดยเจ้า Espresso ของ Android นี้จะมี 5 packages หลักๆให้เราเลือกใช้

  1. espresso-core ไว้สําหรับ View แบบต่างๆเลย (Native)
  2. espresso-web ไว้สําหรับ support Webview
  3. espresso-idling-resource ไว้เล่นกับ background job
  4. espresso-contrib ไว้เล่นกับพวก external เช่น DatePicker, RecyclerView and Drawer เป็นต้น
  5. espresso-intents เอาไว้ stub พวก intents ต่างๆ

แต่บทความนี้สนใจแต่ espresso core ก่อนเนอะ 🙂

ทําไมถึงพูดยังงั้น?? ทําไมต้อง Developer

espresso-target-audience
espresso-target-audience

จากที่เราเคยอ่านกันมาในบทความหลายๆอย่าง จะเห็นว่าเราจะพูดกันถึง ATDD, BDD ซะเป็นส่วนใหญ่ โดยเจ้าพวกนี้ค่อนข้างจะ High level มาก เมื่อเทียบกับ TDD ซึ่งนั้นก็เพราะว่า QA บางกลุ่มไม่สามารถที่จะลงไปเล่นกับ raw code จริงๆได้ เนื่องจากมันซับซ้อนเกินไปที่จะเข้าใจง่ายๆ ขอยกตัวอย่างเช่น เจ้า Espresso นี้เลยล่ะกัน

การจะเข้าไปเขียน Espresso ได้ ต้อเข้าใจเรื่อง Android Life Cycle, Android Resources Variable หรือ แม้แต่ Android View ก่อนเริ่ม นั้นเพราะว่า Espresso จะใช้วิธีการเข้าไป interact กับ view นั้นเลยๆ แปลบ้านๆก็คือ ต้องอ่าน code android ออกไงล่ะ!!!! 🙁

เริ่มเข้าใจแล้วใช่มั้ยว่าทําไม Target audience คือ Developer แต่ไม่ต้องเป็นห่วงไปเพราะ

ผมเชื่อว่า Software engineer in Test จริงๆแล้วเป็นอาชีพที่ต้องเขียนโค้ดเป็นและเข้าใจ architecture ด้วย

อาจจะไม่ต้องเขียนโค้ดเทพ หรือ logic เทพแบบ Developer หลายๆท่าน (เช่น optimize Big O, logic recursive ซึ่งผมทําไม่ได้) แต่ถ้าเราทํา programming ไม่ได้ ไม่เข้าใจ Architecture เลยเราจะเข้าใจระบบและทดสอบได้อย่างไร?​เนื่องจากการทดสอบมันไม่ได้มีแค่ Functional test เพียงอย่างเดียว โลกปัจจุบันมันต้องยาวถึง Non-functional test ด้วยนั้นเอง นอกเรื่องล่ะกลับมาที่บทความ 🙂

ความแตกต่างระหว่าง Appium และ Espresso

เรียนรู้ Appium with Cucumber มาก็ตั้งเยอะ อยู่ดีๆจะให้เปลี่ยนหัวจาก Appium มาเป็น Espresso ก็คงต้องมีคําถามแหละ ว่ามันแตกต่างกันยังไง? ซึ่งหลักๆก็คือ

Espresso เป็น White Box Testing ซึ่งมันผูกมากับ Android เองเลย เวลาเขียนมันสามารถ access ได้ทุกจุดเลย ไม่ว่าจะ Mock Layer ไหนๆ หรือทําอะไรก็ตามที

ในทางกลับกัน Appium เป็น Black Box Testing ซึ่งออกแบบมาให้ cross platform ได้ เพราะฉะนั้นแปลว่า Appium จะรู้จักแค่ UI layer ในการทํา test

ซึ่งจริงๆ มันก็มีดีแตกต่างกันไปในแต่ล่ะจุดแหละ ต้องเลือกใช้ แต่สิ่งๆแน่ที่ต้อง trade-off คือเรื่องของ cross platform ถ้าเราเลือกที่จะใช้ Espresso เราต้องยอมรับในเรื่องของการเขียน Automation test ให้ Ios application ต่างหากน่ะ เพราะว่ามันคนละเรื่องกันเลยยยยย แต่ถ้าเป็น Appium มันสามารถ cross platform ได้เลย อันนี้คงเป็นจุดดีข้อนึงของ Appium

แต่จุดเด่นของ Espresso ก็คงเป็นเรื่องของการลงไปได้ทุก layer ของ android application นั้นมากกว่าด้วยความเป็น White box testing นั้นเอง

เลือกเอาว่าเราจะวางกลยุทธ์แบบไหนสอดคล้องกับธุรกิจเรา 🙂

Prerequsite ต่างๆ

  1. Android Example Project
  2. Android Studio

First time with Espresso

ถ้าไม่อยากเสียเวลาอ่านบทความยาวๆ ให้ git clone มาจาก repository ได้เลย เพื่อเอามาลองรันและแก้ไข น่าจะเข้าใจได้เร็วกว่า แต่ถ้าอยากได้คําอธิบายว่าใช้ยังไงบ้าง อ่านจากด้านล่างได้เลยครับ 🙂

Dependencies

เริ่มแรกเลยก็เหมือน Appium with cucumber นั้นแหละ เราต้องเพิ่ม dependencies เข้าไปใน build.gradle ให้มันก่อน เพื่อที่จะได้เอา dependencies นั้นมาใช้นั้นเอง


androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.1'
androidTestCompile 'com.android.support.test:runner:1.0.1'

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

example-espresso-android-test
example-espresso-android-test

เพิ่ม Test code ให้กับ Espresso

อย่างที่บอกเลยถ้าเราใช้ Espresso การเทสที่เราทําจะเป็น White box testing โดยอ้างอิงจาก View ที่เราต้องการจะเทสเป็นหลัก โดยจากตัวอย่างล่างนี้ Test scenario ที่เราทําการทดสอบก็เหมือนกับตัวของ Appium คือ บน View นั้นๆจะต้องมีคําว่า “Howtoatuomate.in.th” อยู่

first-test-case-with-espresso
first-test-case-with-espresso

จะเห็นได้ว่าเรา expect view ของ MainActivity.class ไว้เป็น rules เพื่อให้เราสามารถเช็ค Text ที่จะขึ้นมาบนหน้านี้ได้ว่ามีคําที่เราต้องการอยู่ แค่นี้เองจบล่ะเทสก็จะออกมาสีเขียวสวยสดงดงาม

espresso-test-android-green-passed
espresso-test-android-green-passed

นี้คือการเขียนเทส Android ด้วย Espresso แล้ว แต่คําถามคือ เราเข้าใจมันรึเปล่า?

มาดูการทํางานของ Espresso กัน 

ทุกอย่างใน Espresso คือเรื่องของ View ทั้งสิ้น 🙂

โดยเราต้องรู้จัก 4 Component หลักนั้นก็คือ

  1. Espresso
    • การทํางานของ Espresso จะ provide entry point เข้าไปเทสให้เราสองทางนั้นก็คือ onView() และ onData() โดยเจ้า view ก็คือ layout view แบบที่เราเห็นไปข้างบนเมื่อกี้ ส่วนเจ้า onData() ก็คือเรื่องของ entry point ไปหา data ที่มันอยู่ใน AdapterView (อีกความหมายนึงคือ ListView, GridView, or Spinner) เพราะถ้าใช้กับพวกนั้น onView() มันจะทํางานไม่ได้
  2. ViewMatchers
    • ส่วนเจ้า ViewMatcher ก็คือ View หรือ Layout อะไรก็ตามที่อยู่ภายใต้ View Interface เราก็สามารถส่งค่าเข้าไปให้มันได้
  3. ViewActions
    • Collection object ที่รวบรวม interaction ไว้ข้างใน เช่น เราจะสั่ง click(), longClick() เราก็สั่งผ่านเจ้า object ตัวนี้แหละ เพื่อ simulate action แบบ test scenario ที่เราต้องการ
  4. ViewAssertions
    • ตัวสุดท้ายก็คือ Assertion เหมือนเราสั่ง action ไปกับ view แล้วเราก็ต้องการที่จะรู้ผลลัพธ์ของ action นั้นๆใช่มั้ย มันเลยออกมาเป็นเจ้าตัวนี้นั้นเอง

นี้คือทฤษฎีการทํางานของ Espresso ไม่ว่าเราจะเขียน test scenario ออกมาแบบไหน มันก็จะออกมาในรูปแบบนี้เสมอคือ หา view – ทํา action และ จบด้วย assertion ซึ่งจริงๆมันก็เหมือน Given – When – Then ใน Cucumber นั้นแหละ เลยอยากให้คิดว่าทุกอย่างบนโลกนี้มันก็เหมือนกันหมด แต่แค่แตกต่างกันตรง Layer ที่เราจะเข้าไปเล่นด้วย

ทีนี้ลองกลับมาดู test code เมื่อกี้ใหม่กันน่ะ ว่าจะอ่านเข้าใจขึ้นมั้ย?

first-test-case-with-espresso
first-test-case-with-espresso

ลองสังเกตุตรงที่เรา import เข้ามากันจะมี Espresso, ViewMatcher และ ViewAction ที่เราพึ่งคุยกันมาเมื่อกี้นั้นเอง เพราะฉะนั้นหลักๆของการทํา Test จริงๆมีแค่นี้เลยล่ะ เมื่อเราใช้ Espresso

ส่วนถ้าใครตาดีสั่งเกตุเห็นเจ้า annotation แบบต่างๆ อย่าง @LargeTest มันอิงไปถึง Test Praymid ที่บอกว่า เราควรมีพวก UI หรือ Integration test น้อยๆ แล้วไปเน้น Unit Test นั้นเอง 🙂 ซึ่งที่เราทําอยู่มันเป็น UI เราเลยติด Tag ว่า Large Test นั้นเอง

test-pyramid
test-pyramid (https://developer.android.com/training/testing/fundamentals.html)

แต่ถ้าเป็น Tag @Test มันจะเป็นของ Junit เพื่อสั่งให้ junit รู้ว่าตัวไหนเป็น Test case ของเรา ส่วนเจ้า @Rule จะเป็นการ AOP (aspect oriented programming) ทําการ intercept ก่อน หรือ หลัง execution code เพื่อสั่งให้มันทํางานตามที่เราต้องการ อย่างในตัวอย่างของเราจะหมายถึง Activity ที่จะ เทสต้องเป็น MainActivity นั้นเอง

สรุปแล้วการเล่นกับ Espresso  

Appium เป็น Black box testing ได้ประโยชน์เรื่อง cross platform แต่เจ้า Espresso เป็น White box testing ได้ประโยชน์เรื่องการลงแบบ Low Level เลย Mock อะไรก็สะดวก

4 อย่างหลักๆ ที่เหมือน Given – When – Then ก็คือ

  1. Espresso (onView(), onData())
  2. ViewMatcher
  3. ViewAction
  4. ViewAssertion

เจ้าพวกนี้จะใช้ interact ทุก view ที่ต้องการจะ test และเก็บผลออกมา สามารถโหลดลองกดรันเล่นๆได้ที่ Github

สุดท้ายนี้ก็เลือกให้ดีล่ะกันว่าจะใช้อุปกรณ์อะไรให้เหมาะกับอะไร ให้นึกถึงช้อนกับซ้อมเสมอ มันเกิดมาเพื่องานของมัน ไม่มีอันไหนดีกว่ากัน ขึ้นอยู่กับว่าเราจะทําอะไรแค่นั้นเอง

3
Leave a Reply

avatar
1 Comment threads
2 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
Martaui Recent comment authors

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

newest oldest most voted
aui
aui

appium มี espresso driver ละนะ แต่เป็น beta อยู่

aui
aui

appium with espresso driver

https://appiumpro.com/editions/18