กว่าจะเขียน unit test เป็น

ที่มาและความสำคัญ

Travis P
Black Lens
1 min readOct 8, 2016

--

เค้าว่ากันว่า unit test นั้นเป็นสิ่งจำเป็นมากสำหรับโปรแกรมทุกโปแกรม เพื่อความถูกต้องและคุณภาพของโปรแกรม นับถึงวันนี้ผมก็เขียน Android app มาร่วมสามปีแล้ว ยอมรับเลยว่าช่วงสองปีแรกไม่ได้เขียน unit test เลย อาจจะเป็นเพราะช่วงปีแรกยังใหม่กับวงการ ก็มักศึกษาเรื่องแอนดรอยซะเป็นส่วนใหญ่ แล้ว tutorial ทั่วๆไปสมัยนั้นก็ไม่มีการพูดถึงเรื่อง unit test กันเลย

ช่วงเข้าปีที่สองของการเขียน Android app เริ่มมีได้ยินเรื่อง unit test บ้าง แต่ก็ยังหยิ่งยโสโอหัง เชื่อว่า code เราเขียนถูกไม่เห็นจะต้องเทสเลย เขียนแอพเสร็จมากดๆดูก็ทำงานได้ถูกต้องนี่หว่า จนกระทั่งวันหนึ่ง มีโอกาสได้ทำโปรเจคที่ requirement complex มาก ไม่รู้จะซับซ้อนไปไหน คือเป็นแอพเกี่ยวกับ e-commerce แต่มีนู่นนิดนี่หน่อยเพิ่มตรงนั้นเพิ่มตรงนี้ แล้ว requirement เปลี่ยนทุก 2 สัปดาห์ ผมก็ยังมั่นใจในฝีมือตัวเอง ทำเล้ย ไม่มี unit test จนกระทั่งโปรเจคใกล้จะเสร็จ สิ่งที่ทำให้ผมรู้สึกว่า unit test สำคัญคือ

ผมสัมผัสได้ถึงความเปราะบางของ code ตัวเอง ไม่รู้เลยว่ามันจะพังตอนไหน

อุปสรรคและปัญหา

tutorial เรื่อง unit test มีมากมาย สอนใช้ JUnit หรือ Instrumented unit test บน Android ซึ่งก็สามารถทำตามได้ setup เป็น run ได้ตามตัวอย่าง เช่น

assertThat(calculator.sum(1,2)), is(3));
เอ้าเสร็จแล้ว เห็นไหมครับ unit test ง่ายนิดเดียว

แต่ปัญหาของผมคือ ไม่รู้ว่าจะมาเขียน unit test ในโปรเจคของตัวเองยังไง class เราไม่ได้ง่ายอย่างนั้นนี่หว่า จึงแสวงหาหนทางเพิ่มเติมจนไปเจอ TDD — Test Driven Development ซึ่งส่วนมากมักมาพร้อมตัวอย่าง Ruby on Rails หรือ node.js อะไรพวกนั้น เป็นฝั่ง web development ซะเป็นส่วนใหญ่ แล้วคอนเซปคือเขียน test ก่อน เขียน code ให้มัน fail ก่อน จากนั้นค่อยแก้ให้ test ผ่าน ซึ่ง scripting languages นี้ก็ทำได้ พอมันรันหา method ไม่เจอแล้วพัง แต่ java นี่สิ “ให้กุเขียน test ก่อนเขียน class/method งี้มันจะ compile ผ่านได้ไง” ผมก็เลยไม่รู้จะไปทำตามได้ไง แต่ก็ไม่ได้เสียเวลาอ่านซะทีเดียวเพราะทำให้ผมเข้าใจเรื่องความสำคัญของ test ยิ่งขึ้นไปอีก เช่น

ในกรณีที่เรา refactor code แล้ว test ผ่าน มั่นใจได้เลยว่าทำถูก

วิธีการแก้ปัญหา

อยู่มาวันนึงผมก็ไปเจออันนี้เข้า Android Testing Codelab ซึ่งเป็นแอพจดโน้ตง่ายๆ อ่านแล้วได้ความรู้เรื่อง MVP, unit testing, Mockito, Espresso อธิบายดีมาก เป็นขั้นตอนชัดเจน ที่สำคัญคือสอน test ในสถานการณ์คล้ายจริง ไม่ใช่เขียนคลาสเครื่องคิดเลขมาแล้วบอกว่าเทสง่ายจัง แต่ถ้าใครเข้าไปอ่านแล้วไม่คุ้นกับคอนเซป MVP ก็อาจจะอ่านลำบากหน่อย ถ้าผมเจออันอื่นที่ง่ายกว่านี้ก็จะเอาใส่ไว้

สรุป

Codelab อันนั้นทำให้ผมเขียน test เป็น เดี๋ยวนี้พอเขียน code ก็พยายามทำ unit test ไว้ด้วยเสมอ แต่ก็ทำให้ผมพบอีกหนึ่งปัญหาคือ ไม่ใช่ code ใดๆจะเขียนเทสได้ง่ายๆ เราต้องเขียน code ให้ง่ายต่อการเขียน test ด้วย

--

--

Travis P
Black Lens

Android Developer, Kotlin & Flutter Enthusiast and Gamer