จากการแบ่งปันเรื่อง TDD with Java and Spring Boot ของสถาบัน IMC
มีคำถามจากผู้เข้าร่วมฟังที่ผมยังไม่ได้ตอบ
จึงทำการตอบในแต่ละคำถามย้อนหลังให้
ตามนี้เลยครับ

1. X-functinal ทีมนี่เหมือน Scrum team ตามแนวคิด ของ Agile methodology ไหมครับ?

ต้องถามก่อนว่า ใน Scrum team
มีคนที่มี skill สำหรับการส่งมอบระบบงานหรือไม่
ถ้า Cross-functional team ในฝันคือ
เป็นทีมที่สามารถคุยและเลือก requirement มาทำได้
ทำการออกแบบ พัฒนา ทดสอบ และ deploy ได้เองเลย
มันคือแนวคิดของ Product team นะครับ
เพื่อลดเวลาการรอในเรื่องต่าง ๆ

https://amplitude.com/blog/journey-to-product-teams-infographic

2. การทำ automation test แบบต้องใช้ข้อมูลจาก System อื่นการใช้ Mockup จะถือว่าเพียงพอไหมครับ

ไม่เพียงพอ
เพราะว่าเรากำลังโกหกตัวเอง
เน้นว่าต้องทำ integration test ด้วยเสมอ
เช่นต้องทำทุก ๆ วัน ทุก ๆ 3 วัน หรือนานสุดทุก ๆ สัปดาห์เป็นต้น
รวมทั้งเรื่องของข้อมูลด้วย ควรมีรูปแบบเหมือนจริง 
แต่ไม่ได้ใช้ของจริง
เพราะว่าอาจจะมีปัญหาเรื่อง sensitive data หรือ policy ของการใช้ข้อมูล
ก็ต้องทำการ masking data ก่อนเสมอ

3. Tool ในการทำ REST API test โดยทั่วไปแล้วใช้อะไรครับ

มีการทดสอบแบบภายในและภายนอก
ถ้าจากภายนอกผมจะใช้พวก
Postman หรือพวก Robot Framework + HTTP client library

ถ้าจากภายในคือการเขียน code แล้ว
จะใช้ตาม framework หรือภาษาโปรแกรมที่ใช้เลยครับ
มีให้ใช้งานครบทุกภาษาสมัยใหม่

4. เราควรต้องทำเขียน unit test สำหรับทุก class ทุก method และ ทุก path ของ code รึเปล่าครับ

ไม่จำเป็นครับ

5. มีวิธีการเขียน file test ที่เป็น  best practice ไหมครับ แล้วถ้าอยาก refactor เราควรต้อง refactor อันไหนก่อนดีครับ

ยกตัวอย่างการเขียน unit test ในแต่ละ test case ควรมีแนวทางตามนี้

  • ชื่อ test case ต้องสื่สารชัดเจนว่า ต้องการทดสอบอะไร มี input อะไร ได้ expected result อะไร
  • ในแต่ละ test case ควรมีโครงสร้างที่ชัดเจน ยกตัวอย่างเช่น AAA (Arrange Act Assert) และ Given-When-Then เป็นต้น

ถ้าจะ refactor ต้องทำสิ่งที่กำลังทำก่อน ค่อย ๆ แก้ไขปรับปรุง
จากนั้นทดสอบว่า ยังทำงานได้เหมือนเดิม
แล้วจึงไปแก้ไขและปรับปรุงตัวเก่า ทีละตัว
แนะนำว่าอย่างแก้ไขทั้งหมดพร้อม ๆ กัน
เพราะว่า เดี๋ยวงานจะเข้านะครับ

ถามว่าควร refactor อันไหนก่อนดี
แนะนำให้ดูว่า test case ไหนที่สำคัญในเชิง business ครับ

6. สำหรับ mobile app นี่จะมีเครื่องมือในการ test  automation อย่างไรครับ

เครื่องมือการทดสอบ mobile app มีเยอะเลย
ทั้งการทดสอบในมุมมองคนภายนอก
นั่นคือได้  input เป็น app มาเลย เช่นได้ไฟล์ APK และ IPA มา เพื่อทดสอบ
ถ้าเป็นแบบนี้มักจะใช้งาน Appium หรือไปใช้ Katalon ซึ่งก็เป็น Appium เช่นกัน

แต่แนะนำให้ไปลองใช้งานการเขียน test เหมือนกับ developer เลย เช่น

  • Android app ไปเขียน test ด้วย Android Studio ใช้งานพวก JUnit, Instrumentation test และ Espresso ได้เลย
  • iOS app ไปเขียน test ด้วยภาษา Swift ใน Xcode เลย ใช้พวก XCTest และ UI Test ไปเลย

7. Test พวก การ generate file เช่น excel เราต้อง test ยังไงครับ

สนใจที่ input data และ output
จากนั้นต้องเขียน code สำหรับการตรวจสอบข้อมูลในไฟล์ Excel
แต่ละภาษาจะมี Library การจัดการข้อมูลในไฟล์ Excel

8. ทำอย่างไรให้ test repeate ได้บ่อยๆ

เริ่มจากการวางแผนก่อน
เพราะว่า การจะให้ทดสอบซ้ำ ๆ ได้นั้น
ระดับการทดสอบต่าง ๆ ก็ต่างกันไป

ยกตัวอย่างเช่น
Unit test อาจจะต้องเรียนรู้เรื่อง Test double เพื่อจัดการกับ dependency ต่าง ๆ

Integration test อาจจะต้องจัดการกับระบบรอบข้างที่ใช้งาน
ทั้ง External service และ Database ต่าง ๆ
ทำอย่างไรที่จะควบคุมสิ่งต่าง ๆ เหล่านี้
ให้มี state หรือข้อมูลเหมือนเดิมทุกครั้งที่ทดสอบ
ระบบ network ที่เสถียร

การทดสอบแต่ละตัวควรต้องเป็นอิสระ
ไม่ผูกมัดกับการทดสอบอื่น ๆ

ปล. ควร repeat ได้เสมอครับ เพราะว่าเป็นคุณสมบัติของ test ที่ดี

9. เมื่อ refactor code เสร็จ ต้อง test ซ้ำไหมครับ ?

ต้องทดสอบซ้ำครับ
แต่มีกรณีที่การ refactor ไม่ต้องทดสอบซ้ำด้วย
นั่นก็คือ ใช้เครื่องมือในการ refactor เช่นใน IDE ต่าง ๆ 
โดยที่เราไม่ได้ทำอะไร ให้เครื่องมือทำงานเอง

10. สมมุติว่าเรากำลังจะ Introduce agile process เข้าไปในทีม ระหว่างพยายามทำให้ทีมสามารถทำงานแบบ agile ได้คล่องก่อน กับพยายามทำให้ทีมเข้าใจเรื่องการทำ TDD ก่อน ในความคิดของพี่ปุ๋ยคือทำอะไรก่อน เพราะอะไรคับ

ต้องเริ่มที่เป้าหมายก่อนครับ ว่าต้องการอะไร
ยกตัวอย่างเช่น ถ้าเราเริ่มด้วยการแก้ไขปัญหา
ดังนั้นต้องเริ่มจากการสรุปปัญหาต่าง ๆ ออกมาก่อน
จากนั้นเรียงลำดับความสำคัญของปัญหา
เลือกปัญหาที่สำคัญหรือต้องการแก้ไขก่อน
เมื่อเข้าใจปัญหา และรู้ว่าจะต้องแก้ไขอะไร
จากนั้นลงมือทำในกรอบเวลา และทำการวัดผลเพื่อปรับปรุงอย่างต่อเนื่อง

11. เทสกับ Database เรียกว่า unit test ไหมครับ

เป็น integration test ครับ

12. ช่วงนี้ซ้อมวิ่งยังไงครับ 555

มีช่วงนึงวิ่งอยู่ในห้อง กับออกกำลังกายพวก core body ในห้อง
ช่วงนี้ก็วิ่งรอบ ๆ ที่พักครับ พยายามออกกำลังกายทุกวัน

13. Spring Boot ใช้กับ S/W Project ที่เป็น monolithic ได้ไหมครับ?

ได้ครับ แต่อาจจะไม่เหมาะสมกับเป้าหมายของ Spring Boot

14. Consumer Driven Contract Testing จำเป็นไหม

ในมุมมองของผม จำเป็นนะครับ
แต่อาจจะไม่ต้องใช้เครื่องมือหรือ framework ใด ๆ ก็ได้
เริ่มจากการพูดคุยและตกลงรูปแบบการทำงาน
ยกตัวอย่างเช่น ถ้ามีการเปลี่ยนแปลงสิ่งที่เคยตกลงกันไว้แล้ว
ต้องมีการพูดคุยก่อนแก้ไขเสมอ

15. เราต้องทำ unit test ให้ coverage เท่าไหร่ถึงจะพอดี

ค่า coverage ไม่สำคัญเท่ากับระดับความเชื่อมั่นในสิ่งที่พัฒนาขึ้นมา
เพราะว่า coverage สูง ๆ ไม่ได้บอกว่า bug จะน้อยหรือไม่มี

ถ้าเขียน unit test และ coverage สูง แล้ว แต่ bug ยังเยอะ แบบนี้ต้องกลับมาดูว่าทำไม

ถ้าเขียน unit test และ coverage ต่ำ แล้ว แต่ bug น้อยมาก ๆ แบบนี้ก็ต้องมาดูว่าทำไม

ถ้าไม่เขียน unit test แล้ว bug น้อย แบบนี้ก็ต้องมาดูว่าทำไม

ผมว่าเรามองที่ระดับความเชื่อมั่นมากกว่า
ว่าทุกครั้งที่แก้ไขหรือเพิ่ม code เรามีความมั่นใจมากน้อยเพียงใด
และได้รับ feedback จากการเปลี่ยนแปลงเร็วหรือไม่

สวัสดีครับ