speed-slow-snails-ss-1920-800x450
จากงาน Android Dev Summit 2015 นั้น
นั่งดู VDO เรื่อง Android Testing
ซึ่งมีคำหนึ่งที่น่าสนใจมาก ๆ คือ Hermetic Testing ?
เนื่องจากไม่เคยได้ยิน และ งงกับคำนี้มาก
เลยทำการค้นหา และ นำมาสรุปหน่อย
พบว่า มันสำคัญมาก ๆ สำหรับการทดสอบระบบงาน

Hermetic Testing มันคืออะไร ?

จาก Blog ของ Google Testing อธิบายไว้ว่า
ระบบงานต่าง ๆ นั้นมันมีความซับซ้อนสูงมาก
ประกอบไปด้วยส่วนการทำงานต่าง ๆ มากมาย
ทั้งผ่านและไม่ผ่าน network
ทั้งระบบงานภายใน และ ภายนอก
ทำให้เกิดปัญหาในการทดสอบมากมาย

ดังนั้นเราทำการทดสอบระบบแบบ End-to-End testing กันอย่างไร ?

แสดงตัวอย่างระบบดังรูป

h01

คำอธิบาย
ระบบที่ต้องการทดสอบนั้น ผ่าน Frontend server
เมื่อผู้ใช้งานใช้งานแล้วจะต้องติดต่อไปยังระบบ backend 3 ระบบ

โดยที่ End-to-End test นั้นมีเป้าหมาย
เรื่องความเร็วและความน่าเชื่อถือในการทดสอบ
ดังนั้นสิ่งที่เราต้องหลีกเลี่ยงคือ

  • การติดต่อผ่านระบบ network ลองคิดดูสิว่า ถ้า network มันพัง การทดสอบจะเป็นอย่างไร ?
  • การเรียกใช้งานระบบจากภายนอก ลองคิดดูสิว่า ถ้าระบบภายนอกมันปิดไป การทดสอบจะเป็นอย่างไร ?

เราจำเป็นต้องเปลี่ยนจาก Global data มาเป็น Local data
จาก server จริง ๆ ก็ให้ทำการจำลอง หรือ สร้าง Fake server ขึ้นมา

ดังนั้นทีมทดสอบของ Google จึงได้คิดและออกแบบ End-to-End testing ใหม่
โดยเปลี่ยนมาใช้ Hermetic server แทน server จริง ๆ

มาดูกันหน่อยสิว่า Hermetic Server มันคืออะไรและเป็นอย่างไร ?

พูดง่าย ๆ คือ Server in the box
นั่นคือ ถ้าเราสามารถ start server ต่าง ๆ ที่เกี่ยวข้องขึ้นมาบนเครื่องเดียว
แน่นอนว่า ไม่จำเป็นต้องติดต่อผ่านระบบ network
รวมทั้งเป็น server ที่ทำงานตามที่เราคาดหวังไว้ด้วย
เช่น สร้างมาเพื่อให้ทำงานถูก หรือ สร้างมาเพื่อให้ทำงานผิด เป็นต้น
เพียงเท่านี้คุณก็มี Hermetic Server ไว้ใช้ทดสอบระบบแล้วนะ

ปล. ในบางกรณีอาจจะมีมากกว่า 1 เครื่องก็ได้นะ
Server ที่สร้างอาจจะเป็นเครื่องจริง ๆ หรือ Virtual machine ก็ได้

มาดูการออกแบบกันบ้าง
การสร้าง Hermetic server นั้นควรทำตั้งแต่ขั้นตอนการออกแบบระบบ
อย่ารอ อย่าช้า อย่าอ้างถึงข้อจำกัดต่าง ๆ
ลงมือทำ และ สร้างซะ !!
รวมไปถึงสิ่งต่าง ๆ เหล่านี้

  • ใช้ Dependency Injection สำหรับจัดการ connection ต่าง ๆ ไปยัง server
  • ข้อมูลที่จะต้องมีอยู่ในแต่ละ server
  • ถ้า server มีการใช้งานข้อมูลจาก database จะต้องทำการ fake หรือใช้ In-Memory database แทนเสมอ

เพื่อทำให้มั่นใจว่าเราสามารถจัดการ Hermetic server ได้ง่าย
แต่ว่ายังไม่จบนะ !!
สิ่งที่ยังต้องทำเพิ่ม เพื่อให้มีความมั่นใจมากขึ้นคือ

  • สิ่งที่เรา fake ขึ้นมานั้น ต้องทำการตรวจสอบด้วยว่า code ของเราเรียกใช้งานได้อย่างถูกต้องหรือไม่ เช่น การใช้ mock เป็นต้น
  • วิธีการเตรียมข้อมูล หรือ test data ให้มันง่าย และ สะดวก
  • เตรียม logging module เพื่อช่วยตรวจสอบการทำงานในการทดสอบ

แสดงการใช้งาน Hermetic server สำรับการทดสอบดังรูป

h02

ซึ่งมันตอบโจทย์เรื่องความเร็ว และ ความน่าเชื่อถือในการทดสอบ End-to-End test
โดยมีขั้นตอนการทดสอบคร่าว ๆ ดังต่อไปนี้

  • ทำการ start test server ขึ้นมา
  • ทำการทดสอบส่วน API ซึ่งเป็น backend ของระบบ
  • ทำการทดสอบ performance test แบบเล็ก ๆ
  • ทำการทดสอบ UI จากส่วนของ Frontend

ลองกลับมาที่การทดสอบ Android app หน่อยสิ

แน่นอนว่ามีปัญหาหลัก ๆ ดังนี้

  • การทดสอบช้ามาก ๆ
  • บ่อยครั้งการทดสอบจะ fail รวมถึงปัญหาเรื่อง memory และ CPU
  • ยากต่อการ debug หรือหาข้อผิดพลาด
  • ปัญหาในการเรียกใช้ระบบภายนอก เช่น Autentication server และ Backed server เป็นต้น

แสดงการทำงานดังรูป

h03

ดังนั้นจึงทำการเปลี่ยนมาใช้ Hermetic UI Testing
นั่นคือการสร้าง Fake server ต่าง ๆ ขึ้นมา
แสดงการทำงานดังรูป

h04

แต่ปัญหาจากวิธีการนี้ คือ การจัดการ Fake server ต่าง ๆ นั่นเอง
ลองคิดดูสิว่า ถ้ามี server จำนวนมาก ๆ มันจะเป็นอย่างไร !!
เราจำเป็นต้องจัดการให้ดีกว่านี้
เพื่อให้เราแยกส่วนของ Fake server ออกจากการทดสอบได้
รวมทั้งสามารถเปลี่ยนแปลงได้ในขณะ Runtime
นั่นก็คือ การใช้ Dependency Injection
ประกอบกับใน Android มี Build Variant ให้ใช้งาน
ดังนั้น การทดสอบ และ จัดการจึงง่ายขึ้นอย่างมาก ๆ

แสดงการทำงานดังรูป

h06

มาถึงตรงนี้ น่าจะทำให้เราเข้าใจเกี่ยวกับ Hermetic Testing มากขึ้นแล้วนะ
ดังนั้น กลับไปดู VDO กันต่อสิ !!

คำถาม
แล้วคุณทำการทดสอบแบบ End-to-End testing กันอย่างไร ?

Reference Websites
http://googletesting.blogspot.com/2012/10/hermetic-servers.html
http://googletesting.blogspot.com/2015/03/android-ui-automated-testing.html