จริงๆ เรื่องการ test บน Rails เนี่ย ผมกะว่าจะเขียนมานานละ
ช่วงนั้นมี Test Driven Development(TDD) กำลังแรงจาก Extreme programming ไอ้ผมก็เขียน test case บน Rails ก็ปกติดี แต่บังเอิญว่า Behavior Driven Development(BDD) เพิ่งเกิดพอดี เลยยังลังเลว่าจะเขียนเรื่องนี้เลยดีไหม
พอดีเจ้านายผมอยากให้เขียน test ในลักษณะที่รวมสิ่งแวดล้อมรอบด้านด้วย ใน 1 test case ของผมเลยค่อนข้างจะรุงรัง เช่น การ login ก็ตรวจมันตั้งแต่การ validate, login ผ่านหรือเปล่า สมมติว่าผ่าน ต้องจำค่า user เอาไว้แล้ว redirect ไปไหน?? หรืออีก test case นึง กรณีที่ไม่ผ่าน จะ redirect ไปไหน มันก็เลยดูเกินความหมายของคำว่า unit test ไปหน่อย
แล้วก็บังเอิญไปเจอ BDD พอดี ไปเจอ Rspec เข้าให้ ผมกับเจ้านายเลยคิดว่า ไอ้ตัวนี้แหละ ที่เราต้องการ !!! ผมก็เลยเอาไว้ก่อน ให้มันโตมากกว่านี้หน่อย ค่อยเขียน แล้วมันก็สุกงอมพอดี ตอนนี้กระแสที่รุนแรงที่สุดของ Rails คือการทำ BDD ด้วย Rspec นี่แหละ
ทำไมถึงต้องการ ??
BDD มันเกิดมาจากการเรียนรู้จาก TDD
โปรแกรมเมอร์ที่ใช้ TDD เริ่มจะมองเห็นมากกว่าการเป็น unit test คือ เห็นว่าการเขียน test ก่อนเขียน code จะทำให้เรารู้ว่า code ที่จำเป็นมันน่าจะเป็นยังไง หรือเห็น process ของงาน จากนั้นก็เริ่มเห็นความเป็นพฤติกรรม ซึ่งพวกเขาก็เชื่อว่าพฤติกรรมนี่แหละ เป็นหัวใจของ process
ทางทีมที่คิด BDD ขึ้นมา เลยเริ่มผลักดันให้มันเกิดขึ้นมา เพราะเห็นว่าโปรแกรมเมอร์ที่เขียน test คงจะมองเห็นถึงจุดการเป็นพฤติกรรมเนี่ย ไม่เยอะเท่าไหร่ อยากจะให้คนกลุ่มนี้ เข้าถึงแนวความคิดอันนี้
BDD จึงมีจุดประสงค์ให้โปรแกรมเมอร์หรือนักพัฒนา เน้นไปที่การมองว่ามันจะมีพฤติกรรมยังไงมากกว่าการ test ซึ่งจะช่วยให้เข้าถึงตัวงานจริงๆ ได้ตรงและเร็วที่สุด
ซึ่งแบบที่เจ้านายผมให้ผมเขียน test ใน test case นั่นแหละ มันดูเป็นพฤติกรรมตามแนวความคิดของ BDD เลย มันเลยโป๊ะเช้ะ
BDD มันมีพื้นฐานมาจากการดูที่พฤติกรรมเป็นหลัก ถ้าเราตั้งคำถามว่า
Login controller ควรจะทำอะไรได้บ้าง ?
ผมก็จะตอบว่า
มันควรจะ login ได้ปกติ
มันควรจะ login ได้ปกติ และจำไว้(remember me) ด้วย
มันควรจะ login ไม่ได้ เพราะ password ผิดหรือไม่มี username นั้นๆ
มันควรจะ logout ได้
เราจะมามองกันที่พฤติกรรมเป็นหลัก
ถ้าเราตอบได้หมดว่า Login controller ควรจะมีพฤติกรรมอะไรบ้าง นั่นก็น่าจะเป็นสิ่งที่เราต้องการและต้องพัฒนาทั้งหมดแล้ว เห็นภาพรวมหมดทั้งกระบวณการ
ถ้าจะให้กระบวณการ(พฤติกรรม)มันมีความถูกต้อง ก็คงต้อง test มัน(ก่อน)ละครับ สำหรับ Ruby/Rails คงต้อ Rspec นี่แหละครับ ที่ช่วยได้
แล้วยังไงจะมาลอง implement ให้ดูครับ :)
ข้อมูลจาก
Test-driven development - Wikipedia, the free encyclopedia
Introduction - Behaviour-Driven Development