
Table of contents

Nonthawit
CEO | Engineer | Designer
VIEW
7,622
CATEGORY
LAST UPDATED
February 19, 2017
หลังจากเราได้เขียน test มาได้ซักพัก เจอ pain อยู่อย่างหนึ่งคือเวลาเขียนๆไป เราจะเกิดคำถามตลอดว่า code ในส่วนนี้เราควรเขียน test ด้วยไหมน้าาา? ทำให้คิด test case อะไรออกก็ยัดมันลงไปหมด ทำให้เขียน test ออกมาค่อนข้างเละและไม่เป็นระเบียบเอาซะเลย เราจึงค่อยๆหาศึกษาเพิ่มเติมและพบว่าจริงๆแล้ว test มันก็มี layer นะ วันนี้เราจึงจะมาแชร์การมอง test ให้เป็น layer ช่วยให้ชีวิตการเขียน test เรา สนุกขึ้น 😎
แต่ก่อนอื่นต้องเข้าใจภาพรวม Test proccess ที่เรานิยมใช้กันตอนนี้ก่อน
process ที่เราจะหยิบมาพูดเป็นส่วนหนึ่งของ agile อยู่ละ มันคือ V-Model นั่นเอง

layer ของการ test จึงมีอยู่ 4 ระดับ

ในโลกของ test หน่วย หรือ unit ที่เล็กที่สุดคือ “method” ใน layer นี้หน้าที่ของเราคือ test แค่ระดับ method อย่างเดียวไม่ต้องไปสนใจอย่างอื่น สนแค่ logic ข้างใน method นั้นว่าทำงานได้ตามที่เราต้องการไหม

ชื่อก็บอกไว้ตรงตัว Integration = การรวมเข้าด้วยกัน คือการ test ระหว่าง class-to-class ว่าเรียก method ระหว่าง class ถูกต้องตามที่เราวางไว้หรือไม่ ใน layer นี้เราสนใจแค่นี้ จะเห็นว่าเราไม่ยุ่งใน method เหมือน unit test เลย
note: ถ้าศัพท์ทางการหน่อยเราเรียกกันว่า test behavior ระหว่าง class

คล้ายๆ กับ integration testing แต่มองขึ้นมาอีกระดับ มันคือการ test ทั้งระบบ นั่นเอง พูดในอีกแง่คือการยก real-life scenario เข้ามา test มากกว่า จึงทำให้รายละเอียด process ด้านในของ layer นี้ก็ต่างจาก integration testing นะ เป็นการมองภาพรวมทั้งระบบ
BONUS: what difference between integration and system testing

คือ layer บนสุดของ v-model เป็นระดับที่เอา user จริงๆเข้ามานั่ง test product ของเรา เพื่อดูพฤติกรรมของ user ที่มีต่อ product เราว่าเป็นตามที่เราได้คาดการไว้หรือไม่
note: จะเห็นว่าแต่ละ layer มีวัตถุประสงค์ในการ test คนละแบบ เรากำลังอยู่ layer ไหนให้สนแค่ใน layer นั้นอย่าเอามาปนกันดีที่สุด
เมื่อเข้าใจ process ทั้ง 4 ระดับแล้วเรามาต่อกันที่

SA + Tester ส่วนใหญ่แล้วจะยุ่งกับ layer 3 และ 4 เป็นส่วนใหญ่
Developer แน่นอนว่าต้อง ยุ่งกับ layer ระดับล่าง คือ layer 1, 2 และ 3
แต่มีอยู่ 1 layer ที่ intercept กันคือ System testing อันนี้แล้วแต่บริษัทว่าจะให้ใครเป็นคนดูแล หรือรวมๆกัน
ถ้าเป็น SA + Tester ก็ทำ test case ต่างๆ และเพิ่มเติมจะใช้ พวก Automate test เพื่อ test ทั้งระบบ เช่น Robot framework, Cucumber เป็นต้น เพราะเป็นภาษาที่ค่อนข้าง high level ใกล้กับภาษามนุษย์มาก
ถ้าเป็น Developer อาจแยกเป็น platform ให้หัวหน้าทีมแต่ละทีมเป็นคนดู เช่น mobile, web เพื่อ test ทั้งระบบของ platform นั้นก็ได้

เนื่องจากเจ้าของบล็อกเป็น Android Developer วันนี้เราจะมาแชร์ใน มุมของ develop เนาะ 😎
อย่างที่เราบอกไว้ตอนแรก ตอนที่เราไม่ได้มอง test เป็น layer ทำให้เวลาเขียน test มันปนกันมั่วไปหมด ไม่เป็นระบบเอาซะเลยถึงเวลา พอ requirment บางอย่างเปลี่ยน กลับมาแก้ก็ไล่ยากซะเหลือเกิน 😭
เรามาลองดู code ตัวอย่างง่ายๆกัน (สมมุตว่าเราใช้ PowerMockito ในการ mock object ต่างๆนะ)
สมมุติเราใช้ MVP เป็นโครงในโปรเจค class มีดังนี้


จากรูปตัวอย่างด้านบนเราเขียน Unit test สำหรับ Activity ทำการ mock presenter ให้เรียบร้อย
หน้าที่ใน layer นี้เรา test แค่ logic ที่อยู่ใน method แค่นั้นว่าให้ผลลัพธ์ที่เราต้องการหรือไม่ และจะสังเกตเห็นว่ามีบาง method เรียก method ใน presenter แต่เราไม่ได้เขียนใน layer นี้(ถ้าเป็นเมื่อก่อนเราคงยัดไว้หมดละ) เพราะมันเป็นส่วนของ integration testing นั่นเอง(อย่าลืมว่าตอนนี้เราอยู่ใน layer อะไร)

Unit test ใน presenter ก็เช่นกันเรา test แค่ logic ใน method นั้นๆพอถ้ามีการเรียกใช้ method ใน class อื่นเอาไว้ test ใน integration testing แทน
ส่วนใน Manager ก็ทำลักษณะเดียวกันขอข้ามเนาะ
ขอยกตัวอย่างแค่ case เดียวก็น่าจะพอเห็นภาพ

Integration testing ระหว่าง Presenter กับ Manager
จะเห็นว่าเราทำการ Test แค่ method เดียวคือ requestService( ) เพราะ เป็น method เดียวที่ไปเรียก manager นั่นเอง
note: ในตัวอย่างเราใช้ spy ไปเลย มันคือการใช้ object จริงๆ ที่สามารถ verify(…) ได้นั่นเอง PowerMock จงเจริญ…
ซึ่งใน layer นี้เราสนแค่การ test ระหว่าง class-to-class แค่นั้น เพราะในแต่ละ method เราทำ Unit test ไปแล้วเรียบร้อย
เสร็จแล้วจะไปเขียน Integration test ระหว่าง Activity กับ Presenter หรือ ระหว่าง 3 class ต่ออันนี้ต้องคุยกับทีมครับว่าจำเป็นมากแค่ไหน เพราะใช้แรงพอสมควรเลย แต่ที่แน่ๆ Unit test ใส่ให้ครบทุก class เป็นดีที่สุดครับ 😇
layer 1 : Unit testing → สนแค่ในระดับ method
layer 2 : Integration testing → สนแค่ในระดับ class-to-class
layer 3 : System testing
layer 4 : UAT
การมอง test เป็น layer มันทำให้เราเขียน test เป็นระบบมากขึ้น เพราะทำให้เราตระหนักว่าตอนนี้เราอยู่ใน layer อะไร หน้าที่ที่เราต้องเขียนในแต่ละ layer นั้นเป็นอย่างไร รวมไปถึงทำให้ test เราครอบคลุมมากขึ้นด้วย
มันจึงตามมาด้วย bug ที่น้อยลงแน่นอนครับ
วันนี้ไว้แค่นี้ก่อนครับเจอกัน blog หน้าาา

อย่าลืม share ให้มนุษย์ Developerคนอื่นด้วยหละ 😎
KNOWLEDGE


Nonthawit
CEO | Engineer | Designer
เข้าใจการทำ Selector แบบ Ripple effect


Nonthawit
CEO | Engineer | Designer
20 สิ่ง ที่ได้หลังจากเป็น Android developer ที่ Nextzy 3 เดือน
บทความนี้แชร์ประสบการณ์ 3 เดือนแรกของการทำงานเป็น Android Developer ที่ Nextzy ครอบคลุมทั้งด้าน technical เช่น MVP architecture, Android Lifecycle, ProGuard, Git workflow และการเขียน Unit Test รวมถึงด้าน soft skill อย่างการสื่อสารกับทีม, การแชร์ความรู้, และการเขียนโค้ดให้ readable และยืดหยุ่น นอกจากนี้ยังสะท้อนวัฒนธรรมองค์กรที่เน้นทีมเวิร์ค การ review โค้ด และบรรยากาศการทำงานที่สนุกสนาน ซึ่งล้วนช่วยลด learning curve และพัฒนาทักษะได้เร็วกว่าการเรียนรู้คนเดียว
![[Tip/Trick] วิธีติดต่อกับ WebView ผ่าน JavascriptInterface มันเท่มาก](https://image.nextzy.tech/1_Aleix_TFC_7yz_Qh_Q_Sx_GV_Rqxw_a29e28219a.png)

Nonthawit
CEO | Engineer | Designer
[Tip/Trick] วิธีติดต่อกับ WebView ผ่าน JavascriptInterface มันเท่มาก