หลังจากที่คราวที่แล้วเรารู้จักการทำเทสแบบ BDD ไปแล้ววันนี้เราจะมาลองทดสอบกันนะครับ แต่ว่าก่อนอื่นเลยเราต้องมาดู framework ที่ใช้ทำ BDD บน ruby กันซะก่อนนะครับ

What is RSpec?

– RSpec is a Behaviour Driven Development framework for Ruby.

มันก็คือ BDD Framework บน Ruby นั้นเองครับ ลองไปอ่านเพิ่มเติมกันได้ที่ RSpec นะครับ

*มีอีกเหตุผลนึงเหมือนกานว่าทำไมเราจึงควรใช้ RSpec ในการทำเทส ทำไมมันถึงดีกว่าการทำเทสแบบปรกติ ก็เพราะว่ามันทำให้เราสามารถทำเทสแบบแยกส่วนได้ (Keep the test isolated) เราสามารถแยกเทส Controller ออกจาก Model และ View ได้

วันนี้ผมจะลองสาธิตการทำ BDD ด้วย RSpec และเพื่อให้การทำเทสสนุกขึ้นเราจะมารู้จักกับ autotest และ growl กันด้วยนะครับ

– ทำการลง gem ที่เราต้องการ
gem install rspec-rails
gem install ZenTest
gem install redgreen
– ขั้นตอนต่อไปเราจะทำการ สร้างไฟล์ .autotest เก็บไว้ใน root directory
mate ~/.autotest
ใช้ textmate สร้าง file autotest ขึ้นมาแล้ว copy code ข้างล่างนี้ใส่ลงไป

require 'autotest/redgreen'

  module Autotest::Growl

  def self.growl title, msg, img, pri=0, stick=""

    system "growlnotify -n autotest --image #{img} -p #{pri} -m #{ msg.inspect} #{title} #{stick}"

  end

  Autotest.add_hook :ran_command do |autotest|

  filtered = autotest.results.grep(/\d+\s.*examples?/)

  output = filtered.empty? ? '' : filtered.last.slice(/(\d+)\s.*examples?,\s(\d+)\s.*failures?(?:,\s(\d+)\s.*pending)?/)

  if output =~ /[1-9]\sfailures?/

    growl "Test Results", "#{output}", "~/.autotest_images/fail.png"

  elsif output =~ /pending/

    growl "Test Results", "#{output}", "~/.autotest_images/pending.png"

  else

    growl "Test Results", "#{output}", "~/.autotest_images/pass.png"

  end

  end

end

Autotest.add_hook :initialize do |at|

%w{.svn .hg .git vendor}.each {|exception| at.add_exception(exception)}

end

– หลังจากนั้นทำการสร้าง folder “.autotest_images” ใน directory root แล้ว copy รูปข้างล้างเข้าไปนะครับ

pass.pngpending.png fail.png

– ขั้นตอนต่อไปให้ไป download growl มาจาก Growl
หลังจากที่เราเตรียม environment ที่จะใช้ในการทำเทสครบแล้ว ทีนี้เราก็จะมาลองทำกันจริงแล้วละผมทำการสร้างโปรเจคใหม่ขึ้นมาชื่อว่า test-rspec โดยใช้คำสั่ง

 rails test-rspce 

1. ทำการ generate rspec ลงไปในโปรเจค

 ruby script/generate rspec 

2. ทดลองให้ RSpec generate scaffold ขึ้นมาเพื่อ test

 ruby script/generate rspec_scaffold user 

3. รัน autotest

 autotest 

หลังจากที่เรารันแล้วหน้าตาก็จะออกมาเป็นแบบนี้นะครับ

Picture 2.png

แล้วทุกครั้งที่เราทำการแก้ไข file ในโปรแจค autotest มันก็จะฉลาดพอที่จะทำการเทสให้เราโดยอัตโนมัตโดยที่เราไม่ต้องค่อยไปนั้ง run test ทุกครั้งที่เราทำการแก้ใข

แถมท้าย เพิ่มสีสั้นให้กับ TextMate ด้วยการลง Bundle ของ RSpec

1. ไปยัง directory bundle ของ TextMate

 $ cd ~/Library/Application\ Support/TextMate/Bundles/ 

2. Install RSpec Bundle

 $ svn co svn://rubyforge.org/var/svn/rspec/trunk/RSpec.tmbundle 

3. Reload your bundle

Bundles => Bundles Editor => Reload Bundles