จากงาน Android Dev Summit 2015 นั้น
นั่งดู VDO เรื่อง Android Testing
ซึ่งมีคำหนึ่งที่น่าสนใจมาก ๆ คือ Hermetic Testing ?
เนื่องจากไม่เคยได้ยิน และ งงกับคำนี้มาก
เลยทำการค้นหา และ นำมาสรุปหน่อย
พบว่า มันสำคัญมาก ๆ สำหรับการทดสอบระบบงาน
Hermetic Testing มันคืออะไร ?
จาก Blog ของ Google Testing อธิบายไว้ว่า
ระบบงานต่าง ๆ นั้นมันมีความซับซ้อนสูงมาก
ประกอบไปด้วยส่วนการทำงานต่าง ๆ มากมาย
ทั้งผ่านและไม่ผ่าน network
ทั้งระบบงานภายใน และ ภายนอก
ทำให้เกิดปัญหาในการทดสอบมากมาย
ดังนั้นเราทำการทดสอบระบบแบบ End-to-End testing กันอย่างไร ?
แสดงตัวอย่างระบบดังรูป
คำอธิบาย
ระบบที่ต้องการทดสอบนั้น ผ่าน 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 สำรับการทดสอบดังรูป
ซึ่งมันตอบโจทย์เรื่องความเร็ว และ ความน่าเชื่อถือในการทดสอบ End-to-End test
โดยมีขั้นตอนการทดสอบคร่าว ๆ ดังต่อไปนี้
- ทำการ start test server ขึ้นมา
- ทำการทดสอบส่วน API ซึ่งเป็น backend ของระบบ
- ทำการทดสอบ performance test แบบเล็ก ๆ
- ทำการทดสอบ UI จากส่วนของ Frontend
ลองกลับมาที่การทดสอบ Android app หน่อยสิ
แน่นอนว่ามีปัญหาหลัก ๆ ดังนี้
- การทดสอบช้ามาก ๆ
- บ่อยครั้งการทดสอบจะ fail รวมถึงปัญหาเรื่อง memory และ CPU
- ยากต่อการ debug หรือหาข้อผิดพลาด
- ปัญหาในการเรียกใช้ระบบภายนอก เช่น Autentication server และ Backed server เป็นต้น
แสดงการทำงานดังรูป
ดังนั้นจึงทำการเปลี่ยนมาใช้ Hermetic UI Testing
นั่นคือการสร้าง Fake server ต่าง ๆ ขึ้นมา
แสดงการทำงานดังรูป
แต่ปัญหาจากวิธีการนี้ คือ การจัดการ Fake server ต่าง ๆ นั่นเอง
ลองคิดดูสิว่า ถ้ามี server จำนวนมาก ๆ มันจะเป็นอย่างไร !!
เราจำเป็นต้องจัดการให้ดีกว่านี้
เพื่อให้เราแยกส่วนของ Fake server ออกจากการทดสอบได้
รวมทั้งสามารถเปลี่ยนแปลงได้ในขณะ Runtime
นั่นก็คือ การใช้ Dependency Injection
ประกอบกับใน Android มี Build Variant ให้ใช้งาน
ดังนั้น การทดสอบ และ จัดการจึงง่ายขึ้นอย่างมาก ๆ
แสดงการทำงานดังรูป
มาถึงตรงนี้ น่าจะทำให้เราเข้าใจเกี่ยวกับ 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