Wednesday, April 11, 2018

Knowledge : "TDD" or Test Driven Development

      จากบทความที่แล้วที่ผมพูดถึงเรื่อง Test ไปวันนี้ผมจะมาพูดถึงเรื่อง TDD หรือ Test Driven Development ว่าคืออะไรนะ

credit pic : https://www.testingexcellence.com/pros-cons-test-driven-development/


TDD หรือ Test Driven Development
   
      กล่าวคือ (ถ้าพูดภาษาชาวบ้าน) ก็คือการ กระบวนการพัฒนาซอฟต์แวร์ หรือ การทดลองเขียน Code ขึ้นมาโดยใช้ เคสตัวอย่างและจงใจให้มันผิดแต่แรก เพื่อที่จะหาช่องโหว่ในตัวโปรแกรมและมาทำการแก้ไขให้ดูกระซับมากที่สุด ในการทำ TDD เรามักจะแยกการ test ออกเป็นกลุ่มย่อยๆ หรือจะแยกตาม feature เล็กๆ ก็ได้ เวลาอยู่ดีๆ test ไม่ผ่านขึ้นมา เราก็จะหาสาเหตุได้ง่าย พอเราแยกการ test ออกเป็นส่วนๆ ได้แล้ว ก็ให้เราทำตามขั้นตอนดังต่อไปนี้เลยครับ

Howto TDD 

1. สร้าง Test ขึ้นมาก่อน
ก่อนอื่นให้เราดูว่า requirement ของเรานั้นจะต้องทำอะไรได้บ้าง แล้วจึงเขียนโค้ดสำหรับ test สิ่งเหล่านั้นขึ้นมาเพื่อตรวจสอบว่ามันทำงานได้ผลลัพธ์ที่ถูกต้องแล้วหรือยัง โดยขั้นตอนการเขียนโค้ดสำหรับ test นี้ เราอาจจะใช้ framework สำหรับ test โดยเฉพาะเข้ามาช่วยก็ได้

2. ลองรัน Test => ไม่ผ่าน
จากนั้นให้เราลองรัน test เหล่านั้นเลย ซึ่งแน่นอนว่าผลที่ได้นั้นควรจะไม่ผ่านทั้งหมด เพราะเรายังไม่ได้เริ่มเขียนโค้ดจริงๆ เลย จะว่าไปแล้ว ขั้นตอนนี้ก็เหมือนกับการ test การเขียน test ของเราอีกทีนั่นเองครับ เราจะได้มั่นใจว่ามันไม่ได้ test ผ่านเลยตั้งแต่แรกนะ

3. เริ่มเขียนโค้ดจริงๆ
ทีนี้ก็มาถึงขั้นตอนการเขียนโค้ดจริงๆ ซะทีครับ ในขั้นตอนนี้เราจะไม่ซีเรียสว่าโค้ดที่เขียนนั้นจะต้องสวยหรูอะไร ตรงกันข้าม เราจะเขียนแบบเอาแค่ test ให้ผ่านก่อนเท่านั้นครับ

4. รัน Test อีกที => ผ่าน
เมื่อคิดว่าน่าจะผ่านแล้วก็ให้ลองรัน test ดูอีกทีครับ ถ้าผ่านได้หมดก็แปลว่าเรามาถูกทางแล้ว แต่ถ้ายังมี test case ไหนไม่ผ่านอยู่ ก็ให้ย้อนกลับไปขั้นตอนที่ 3 ครับ

5. ปรับโค้ดที่รันผ่านแล้วให้ดีขึ้น
แม้จะรัน test ผ่านแล้วก็ไม่ได้แปลว่าจะเอาโค้ดนั้นไปใช้ได้เลย เพราะก่อนหน้านี้เราแค่เขียนแบบลวกๆ ในขั้นตอนนี้เราจะมาปรับโค้ดเดิมของเราใหม่ โดยจะเน้นไปที่การลบโค้ดที่ซ้ำซ้อนออก ปรับการเขียนโค้ดให้อ่านง่าย จะได้สะดวกหากมีการแก้ไขในภายหลัง รวมไปถึงการปรับในเรื่องของประสิทธิภาพให้ดีขึ้นด้วยครับ เมื่อเสร็จเรียบร้อยแล้ว เราก็จะเริ่มขั้นตอนที่ 1 ใหม่สำหรับส่วนต่อๆ ไป ให้เราทำวนไปแบบนี้จนครบทุกๆ ส่วนตามที่ได้แยกเอาไว้ครับ


แต่กระนั้นการที่เราจะทำ TDD นั้นหลายคนมองว่าเสียเวลา แต่จริงๆแล้ว TDD นั้นมีข้อดีที่แจ่มมากๆ แต่ก็ใช่ว่าจะไม่มีข้อเสียเลย โดยเราจะพูดถึงข้อดีก่อนนะ

ข้อดีของ TDD

1. เขียนโค้ดได้อย่างมั่นใจ
เมื่อเรามี test แล้ว เราก็จะเกิดความมั่นใจในการเขียนโค้ดมากขึ้น เวลาเพิ่ม feature ใหม่ๆ เข้าไป เราก็ไม่ต้องมากังวลว่าไอ้ที่ได้ทำไปแล้วมันยังทำงานได้ปกติดีอยู่หรือเปล่า เพราะเราสามารถรัน test ซ้ำได้เรื่อยๆ ครับ

2. Debug ง่ายขึ้นมาก
เนื่องจากเราแบ่งการ test ออกเป็นส่วนย่อยๆ เวลารัน test ไม่ผ่าน เราก็จะรู้ได้ทันทีเลยว่าส่วนไหนที่ทำให้มัน test ไม่ผ่าน ทำให้ไม่ต้องมาเสียเวลาไล่โค้ดทั้งหมด

3. Requirement ไม่ตกหล่น
เนื่องจากการทำ TDD นั้น เราจะต้องให้ความสำคัญกับ requirement เป็นพิเศษ การเขียนโค้ดจึงมีจุดมุ่งหมายที่ชัดเจนมากขึ้น การเขียนโค้ดไม่ตรงตาม spec จึงเกิดขึ้นได้น้อยกว่า

4. TDD กับ Front-end Development
สำหรับ front-end engineer อย่างพวกเราก็สามารถนำ TDD มาใช้ได้เหมือนกันครับ โดยหลักๆ แล้วเราจะเอาไว้ test การเขียนโค้ด JavaScript นั่นเอง และหากใครยังมองภาพไม่ออกว่าหน้าตาของโค้ดสำหรับ test จะเป็นยังไง ก็ไม่ต้องกังวลไปครับ เพราะทุกวันนี้มี framework สำหรับ test ออกมาให้ใช้มากมาย โดยตัวที่น่าสนใจก็จะเป็น QUnit และ Jasmine ที่ออกแบบมาให้เราสามารถเขียน test ขึ้นมาได้ง่ายมากๆ เลย ลองไปเล่นกันดูนะครับ รับรอง TDD ไม่ยากอย่างที่คิด

ข้อเสียของ TDD

1. ใช้เวลานานในการพัฒนา เพราะต้องใช้ในการพัฒนาโปรแกรมมาก
2. ต้องทำความเข้าใจ Code ที่มากขึ้นเพราะมีการทดสอบที่แตกต่างกันไป
3. บางครั้งเสียเวลาไปกับการทดสอบกรณีที่ไม่สำคัญ
4. ประสิทธิภาพขึ้นอยู่กับประสบการณ์และวินัยของทีมพัฒนา
5.ยากที่จะนำเอา TDD ส่วนเดิมไปใช้ในการสร้างบนตัว Project ใหม่
6. ลดควาามสามารถในการเขียน Code อย่างรวดเร็วและเกิดข้อมูลที่ไม่จำเป็น
7. ความยากที่จะประเมินว่าเสียเวลาให้กับ TDD เท่าไหร่ หรือว่าช่วยประหยัดเวลาในกาารทำ TDD
8. ยากที่จะประเมินว่าเสียเวลาให้กับ TDD เท่าไหร่ หรือว่าช่วยประหยัดเวลาในการทำTDD
9. มีผลการทดสอบที่ลดลง หากมีโปรแกรมทำงานช้า

ในตอนนี้ทุกคนคงเห็นประประโยชน์ของ TDD กันแล้ว ดังนั้นในบทความต่อๆไปเราจะมาสอนทำ TDD ใน Python นะครับโดยเรจะใช้หนังสือ "Test-Driven Web Development with Python" นะครับ เดี๋ยวผมจะทิ้ง link pdf ไว้ให้นะครับ

Test-Driven Web Development with Pythonhttps://www.obeythetestinggoat.com/pages/book.html#toc

ขอบคุณข้อมูลจาก

  1. http://www.glurgeek.com/education/test-driven-development-tdd-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-%E0%B8%97%E0%B8%B3%E0%B9%84%E0%B8%A1%E0%B8%84%E0%B8%99%E0%B8%96%E0%B8%B6%E0%B8%87%E0%B9%84%E0%B8%94/
  2. http://www.siamhtml.com/test-driven-development-introduction/

No comments:

Post a Comment