เพราะเราอยู่ในยุคที่ไม่ถามกันแล้วว่าเขียนโค้ดแล้วต้องเขียนเทสมั้ย แต่เปลี่ยนมาถามกันว่าจะเขียนเทสต้องทำอะไรบ้าง ซึ่งแน่นอนว่าการเขียนโค้ดบนแอนดรอยด์ในยุคนี้ก็ควรเขียนเทสให้เป็นด้วยเช่นกัน
ดังนั้นในบทความนี้เจ้าของบล็อกจะมาเล่าถึงวิธีการเขียน Unit Test บน Android Studio กัน
บทความที่เกี่ยวข้อง
- เรื่องที่ควรรู้เกี่ยวกับการเขียนเทสบนแอนดรอยด์
- Unit Test กับ Instrumented Test บน Android Studio ต่างกันอย่างไร
- มาเขียน Unit Test บน Android Studio กัน [Now Reading]
- มาเขียน Instrumented Test บน Android Studio กัน
- Context กับ Target Context ใน Instrumented Test ไม่เหมือนกันนะ
- UI Test บน Android ของทุกคนอาจจะไม่เหมือนกันเสมอไป
- การส่ง Test Double ด้วย Koin ในคลาส Application เพื่อทำ UI Test
Unit Test บน Android Studio
การเขียน Unit Test ให้กับโปรเจคบนแอนดรอยด์นั้นจะต้องทำผ่าน Flavor ที่ชื่อว่า test
โดยจะอยู่ใน <module>/src/test
(ส่วนโค้ดทั่วไปจะอยู่ใน <module>/src/main
)

ถ้าในหน้าต่าง Project เลือกแสดงผลแบบ Android ก็จะเห็นว่า Directory ของ test
ถูก Highlight ด้วยสีเขียว เพื่อบอกให้รู้ว่าเป็น Flavor สำหรับการเขียนเทสนั่นเอง

และบน Android Studio จะสร้างไฟล์ตัวอย่างสำหรับการเขียน Unit Test เมื่อสร้างโปรเจคขึ้นมาใหม่ให้ทุกครั้ง โดยจะตั้งไฟล์ที่ชื่อว่า ExampleUnitTest
JUnit กับการเขียน Unit Test
การเขียนเทสในโปรเจคแอนดรอยด์จะใช้ JUnit เหมือนกับโปรเจค Java/Kotlin ทั่วไป และในตอนแรกเริ่มที่สร้างโปรเจคขึ้นมาใหม่ Android Studio เลือกใช้เป็น JUnit 4 ให้ ซึ่งนักพัฒนาก็สามารถเลือกเองได้ว่าจะเปลี่ยนไปใช้เป็น JUnit 5 แทน หรือว่าใช้ JUnit 4 ต่อไปก็ได้เช่นกัน
รูปแบบในการทำงานของ Unit Test บน Android Studio
เวลานักพัฒนากดสั่งให้โค้ดสำหรับ Unit Test เริ่มทำงานหรือที่เรียกกันว่ารันเทส บน Android Studio จะมีให้เลือกทั้งหมด 3 แบบด้วยกัน

Run '<test_name>'
เป็นการรันเทสแบบปกติ เพื่อดูว่าทำงานถูกต้องหรือไม่ และแสดงผลลัพธ์ในตอนท้ายDebug '<test_name>'
เป็นการรันเทสแบบเปิด Debugger ด้วย เพื่อช่วยให้นักพัฒนาสามารถวิเคราะห์ปัญหาได้ง่ายในเวลาที่โค้ดสำหรับ Unit Test เกิดข้อผิดพลาดRun '<test_name>' with Coverage
เป็นการรันเทสเหมือนกับแบบปกติ แต่ว่ามีการเก็บข้อมูลของโค้ดที่รันเทสเพื่อนำมาแสดงผลเป็น Test Coverage ให้ดูด้วย
และนอกจากนี้ยังกำหนดรูปแบบในการรันเทสด้วยตัวเองผ่านเมนู Modify Run Configuration...
ได้อีกด้วยนะ
การสั่งให้โค้ดทำการรันเทสบน Android Studio
บน Android Studio จะมีหลายวิธีเพื่อสั่งให้เทสเริ่มทำงาน โดยขึ้นอยู่กับว่านักพัฒนาต้องการสั่งให้โค้ดส่วนไหนบ้างที่จะรันเทส
รันเทสเพียงแค่ตัวเดียว
กรณีที่ต้องการรันเทสแค่เพียง Test Case เดียว สามารถกดที่เครื่องหมายที่อยู่ข้างหน้า Test Function นั้น ๆ ได้เลย

รันเทสทั้งหมดที่อยู่ในคลาส
ถ้ากดเครื่องหมายที่อยู่ข้างหน้า Test Class แทน Test Function จะเป็นการรันเทสทั้งหมดที่อยู่ในคลาสนั้น ๆ แทน

สำหรับการเขียน Unit Test จะนิยมเขียนแค่ 1 คลาสต่อ 1 ไฟล์เท่านั้น
รันเทสทั้งหมดที่อยู่ในไฟล์
ถ้าคลิกขวาที่ไฟล์ในหน้าต่าง Project จะสามารถสั่งให้รันเทสทั้งหมดที่อยู่ในไฟล์นั้น ๆ ได้ทันที

และถ้าเปิดไฟล์อยู่ก็สามารถคลิกขวาที่แถบข้างบนของไฟล์นั้น ๆ เพื่อสั่งรันเทสได้เช่นกัน

รันเทสที่เคยรันไปแล้วก่อนหน้านี้
ทุกครั้งที่นักพัฒนากดรันเทสใด ๆ ก็ตาม Android Studio จะสร้างเป็น Run Configuration ไว้ให้เสมอ ดังนั้นนักพัฒนาจึงสามารถกดเลือกจากหน้าต่าง Run Configuration ข้างบนแล้วกดปุ่ม Run เหมือนกับการรันแอปตามปกติได้เลย (สามารถเลือกเป็น Debug หรือ Run with Coverage จากปุ่มที่อยู่ข้าง ๆ ได้เหมือนกัน)

หลังจากรันเทสใด ๆ แล้ว ถ้าต้องการรันแอปเพื่อทดสอบตามปกติ ก็อย่าลืมเลือกใน Run Configuration เพื่อให้รันแอปแทนด้วยนะ
Library สำหรับการเขียน Unit Test
Test Framework
Mocking Library
Assertion Library
สรุป
ในปัจจุบันการเขียน Unit Test ถือว่าเป็นส่วนสำคัญอย่างหนึ่งสำหรับการพัฒนาโปรแกรมใด ๆ ก็ตาม รวมไปถึงการพัฒนาแอปบนแอนดรอยด์ด้วยเช่นกัน โดยเฉพาะแอปที่มีขนาดใหญ่และการทำงานที่ซับซ้อน เพื่อให้นักพัฒนาสามารถเขียนโค้ดเพิ่มหรือแก้ไขโค้ดเดิมที่มีอยู่ได้อย่างมั่นใจ สุดท้ายแล้วก็ต้องเขียนเทสนั่นเอง
ดังนั้น มาเขียนเทสให้กับโค้ดของเรากันเถอะ 😉