ุ6 Refectoring code

ที่ผ่านมา ทุกครั้งเวลาเขียนเทส เราจะสร้าง object ของคลาสที่ต้องการจะเทสขึ้นมา แล้วก็จะทดสอบการเท่ากัน. ในตัวอย่างนี้ เราจะมีโปรแกรมเปลี่ยน องศาฟาเรนไฮซ์ เป็น เซลเซียส และก็กลับกัน โดยที่เราจะมี  Interface ตัวหนึ่ง แล้วจะมีคลาส 2 คลาสคือ Celsius กับ Fahrenheit ดังรูป




Celsius ทำการ implement เรียบร้อยแล้ว แต่ Fahrenheit ยังไม่ได้ทำ คือเราจะทำการเขียนเทสก่อน แล้วค่อยเอาโค๊ดที่ได้ไปแปะไว้ที่ Fahrenheit ทีหลัง

ส่วนโค๊ดก็เป็นดังนี้
โค๊ดสำหรับ Calculator
โค๊ดสำหรับ Celsius
โค๊ดสำหรับ Fahrenheit
โค๊ดสำหรับ เทส

ณ จุดนี้ เวลารัน คุณก็จะได้ อันหนึ่งที่บอกว่าเทสไม่ผ่าน ที่ไม่ผ่านก็เพราะว่าทำการ throw new RuntimeException(); แต่เราต้องการเทส function  double toCelsius(); จาก interface ดังนั้นเราก็ต้องมีคลาส Fahrenheit เพื่อจะได้ทำการ implement ฟังก์ชั่น toCelsius ก่อนอื่น เราก็มาดีไซน์กันก่อนว่าจะให้ทำงานยังไง เราก็เริ่มเขียนเทสก่อนเลยครับ

throw new RuntimeException(); ในที่นี้จะเป็นตัวบอกเราว่าเราทำงานไปถึงไหน มีอะไรทียังรอ. คุณอาจเขียนแบบนี้ก็ได้คือ throw new RuntimeException("Waiting for implement");

ว่าแล้วก็เขียนเทสก่อนสำหรับ Fahrenheit  กันเลยครับ


แต่ว่าตอนนี้ก็ยังรันไม่ผ่าน เพราะคลาส Fahrenheit เราไม่ได้สร้างอะไรไว้เลย ไม่ได้ implements แม้กระทั้ง Calculator  ว่าแล้วก็เริ่มกันเลยครับ

พอรันเทสเสร็จ ก็จะผ่านหมด ถ้าไม่หมด ก็ลองดูที่คุณ implement ว่ามีอะไรผิดหรือไม่ จนกว่าเทสเคสจะผ่าน

กลับมาที่ CalculatorTest.java คุณจะเห็นว่า ทุกครั้งที่เราต้องเขียนเทส เราจะสร้าง object ของ Calculator ขึ้นมารัวๆ . Junit เข้าใจวัยรุ่นตรงจุดนี้ ก็เลยสร้าง annotation อีกอันหนึ่งชื่อ @Before ซึ่งตัวนี้หมายความว่า ทุกครั้งที่ Junit จะทำการทดสอบเทสที่เราเขียนไว้ใต้ @Test , Junit จะเรียก @Before ขึ้นมาก่อนทุกครั้งไป.

โอเคแล้วมันหมายความว่าหยั่งใด ก็จะหมายความว่า หากคุณเซตอัพ @Before ไว้แล้ว คราวนี้พอจะเขียนเทสอันต่อไปก็เริ่มเขียนโค๊ดต่อจาก @Before ในส่วนของ @Test ได้เลย ไม่งงนะคนดี ไปดูโค๊ดกันเถอะตัวเอง



เวลาเขียนเทส ควรจะเทสเป็นเรื่องๆ ไป ไม่ควรเทสหลายเรื่องในเคสเดียวกัน เพื่อเราจะหาบักได้ง่ายเวลาอะไรมีปัญหาขึ้นมา


พอถึงตรงนี้ คุณจะเริ่มคุ้นกับการเขียนเทสเคสขึ้นมาบ้างแล้ว อันที่จริง เราจะไม่เขียนโค๊ดแล้วมาเทสนะครับ แต่จะเขียนเทสก่อนแล้วค่อยโค๊ด !

แม่นแล้วครับ ศัพท์เทกนิคคือ Test-Driven Development  เอาสั้นๆง่ายๆก่อนนะ แล้วเราจะลงลึกหลังเมื่อถึงเวลา แต่ตอนนี้ก็จะประมาณว่า สมมุติคุณอยากใช้โค๊ดแบบไหน ก็เขียนโค๊ดแบบนั้นลงไปในเทสเคสก่อน แล้วจึ่งค่อยทำการ implement เพื่อให้ได้ในสิ่งที่ต้องการ เหมือนโค๊ดข้างบน

โพสต่อไปเราจะมาดูกันเรื่องการเทสเรื่อง exception  และ เทสว่าโปรแกรมทำงานภานในเวลาที่กำหนดหรือไม่ ! น่าสนใจใช่ไหม ไปชมโพสต่อไปกันเลย