Screen Shot 2558-06-23 at 12.33.54 AM
หลังจากที่ได้แบ่งปันเรื่อง Testing สำหรับ Android application
ในงาน I/O Rewind 2015 นั้น
สิ่งที่ยังขาดหายไป 2 เรื่องใหญ่ๆ ที่สำคัญคือ

  1. Local unit test
  2. Instrumented unit test

ซึ่งทั้งสองเรื่องนี้จะช่วยทำให้การเขียน unit test สนุกขึ้นมาก
ดังนั้น เรามาทำความรู้จักกันนิดหน่อย

1. Local Unit Test

มันคือการทดสอบด้วย jUnit ซึ่งทำงานอยู่บน JVM (Java Virtual Machine)
ทำให้เราสามารถทดสอบบนเครื่องของนักพัฒนาเองได้
โดยไม่ต้องมี emulator หรือ device ใดๆ ทั้งสิ้น
มีเป้าหมายหลัก เพื่อลดเวลาในการทดสอบระบบงานนั่นเอง

ซึ่งวิธีการทดสอบแบบนี้ ผมทำการอธิบายไว้ในการแบ่งปันที่ I/O Rewind 2015 ไปแล้ว
แต่สิ่งที่ยังไม่แนะนำต่อคือ
เมื่อส่วนที่เราต้องการทดสอบนั้น
ต้องทำงานร่วมกันส่วนอื่นๆ เราจะต้องทำการตัด dependency เหล่านั้นออกไป
ด้วยเทคนิคที่เรียกว่า Test Double
มี library ที่แนะนำคือ Mockito และ Hamcrest

สาเหตุหลักที่ต้องใช้เทคนิค Test Double เพราะว่า
Unit testing นั้นจะไม่สามารถเรียกใช้ library จาก android.jar ได้เลย
ซึ่งจะโยน exception ออกมา ดังนี้

ดังนั้นมาลองใช้งาน Mockito กันหน่อย
เริ่มต้นให้เพิ่ม library ต่างๆ ในไฟล์ build.gradle ดังนี้

ตัวอย่างการใช้งาน Mockito
สำหรับดึงข้อมูล String จาก Context ของ Android application ดังนี้

แต่ปัญหาของการใช้งาน Test Double หรือทำการ Mock เยอะๆ
แล้วมันจะทำให้เกิดปัญหา Mock Bubble หรือ mock เยอะจนเกินไป
บ่อยครั้งเรา mock มากๆ จนลืมไปว่า
เราควรทดสอบบน emulator จริงๆ ด้วยนะ
มันน่าจะมีคุณค่า และ ประโยชน์มากกว่า
และอย่าลืมว่า พฤติกรรมการทำงานจริงๆ มันต่างจากการ mock มากนะ

ดังนั้น เรามาทำความรู้จักกับ Instrumented Unit Test กันดีกว่า
เพื่อลดปัญหาเหล่านี้ลงไป

2. Instrumented Unit Test

ถ้าสังเกตุดีๆ ใน Build Variants บน Android Studio นั้นจะมี Test Artifact 2 ตัวดังรูป

Screen Shot 2558-06-22 at 11.11.58 PM

โดยการทดสอบแบบนี้ นั้นจำเป็นต้องมี emulator หรือ device ในการทดสอบด้วยเสมอ
แต่มันจะไม่เปิด application ที่ emulator หรือ device นะครับ
ทำให้เราสามารถทดสอบการทำงานต่างๆ ของ Android จริงๆ
ดังนั้น วิธีการนี้จึงช่วยลด Mock Bubble ให้หมดไป
และเวลาในการทดสอบยังเร็วอยู่นะ …

การใช้งานก็ไม่ยากอะไร มีขั้นตอนดังนี้

ทำการเพิ่ม library ต่างๆ ในไฟล์ build.gradle ดังนี้

เพิ่ม testInstrumentationRunner ในไฟล์ build.gradle ให้ใช้งาน AndroidJUnitRunner ดังนี้

จากนั้นมาสร้าง test กันดีกว่า
ทำการดึงข้อมูลจาก Context นั่นแหละ
สามารถเขียนได้ดังนี้

ส่วนพวก Parcelable, SharedPreferences และ Service ก็สามารถทดสอบได้หมดนะ
เห็นไหมล่ะ มันง่ายมากๆ !!
และมันทำให้คุณสามารถทดสอบได้ทุกๆ ส่วนอีกด้วยนะ

ขอต้อนรับเข้าสู่โลกคุณภาพของการพัฒนา Android application ครับ

Source code ตัวอย่างที่สร้างขึ้นมา อยู่ใน Github.com/up1

Reference Websites
http://developer.android.com/training/testing/unit-testing/index.html