Saturday, November 12, 2005

Behaviour Driven Development

ช่วงนี้เริ่มได้ยินศัพท์ BDD มากขึ้น
BDD ย่อจาก Behavior Driven Development
เป็น concept ที่ evolve มาจาก TDD
หรืือ Test Driven Development

ที่เกิด concept ใหม่นี้ขึ้นมาก็เพราะ
เขามองกันว่า TDD มันใช้ wording ที่มีแต่คำว่า "test"
เช่น เราเขียน TestCase ซึ่งภายในมี method testXXX
และ run TestCase ด้วย TestRunner
ไอ้คำว่า "Test" ทั้งหลายนี่มัน block
mental ของเราให้เห็นแต่เรื่อง test
(บางคนก็มี mental block ที่ว่า ยังไม่ทันเขียน program เลย
จะให้เขียน test ได้อย่างไร)


Sapir-Whorf hypothesis (SWH)
there is a systematic relationship between the
grammatical categories of the language a person
speaks and how that person both understands the
world and behaves in it


BDD ก็เลยเกิดขึ้นมา
โดยพยายามเปลี่ยน wording เพื่อให้
หลีกเลี่ยง mental block
โดยพยายาม shift ไปสู่ Specification หรือ Behavior แทน

BDD focus บน

Bob Martin’s "Specification, not Verification"
  • you’re not verifying that the code works correctly
  • you’re specifying what it means for it to work correctly



ตอนนี้เท่าที่เห็น opensource project ที่เริ่มทำกันก็มี


ซึ่งถ้าตามไปดูเอกสารของทั้ง 2
ก็ดูเหมือนว่า มันเป็นแค่การเปลี่ยนแค่คำศัพท์ที่ใช้เท่านั้น
เช่นจาก assert -> should
ก็ต้องตามดูกันต่อไปว่า
แค่การเปลี่ยนศัพท์เฉยๆ จะทำให้เกิด effect อย่างที่เขาว่าจริงหรือไม่

แต่มี Idea ที่น่าสนใจอยู่อัน
อันนี้เจอที่ obie, has it been 9 years already?
เขาลองร่าง DSL (Domain Specific Language) ที่ implment ด้วย ruby ขึ้นมา
หน้าตาแบบนี้ (จริงๆไม่อยาก copy มาเท่าไรเลย แต่อยากให้เห็นภาพกัน)

actors :audits => Audit::Logger,
:db => PayrollDatabase,
:employee => Employee,
:transaction => Transaction

story "A new employee is added by the receipt of an AddEmployee message." do

Name = "William Jones"
AnnualSalary = 60000
MonthlySalary = 5000
MonthlyType = Employee::Monthly

scenario "add a salaried employee earning 60k per year" do

db.pretend! do
on_create :with => (:name => Name, :salary => AnnualSalary),
:return => Employee.new(Name, MonthlyType, AnnualSalary)
end

transaction = AddSalariedEmployeeMsg.new(Name, AnnualSalary)
transaction.execute()

to_verify do
employee = db.find_by_name(Name)
employee_classification == MonthlyType
employee_salary == MonthlySalary

audits_received :log, NEW_EMPLOYEE
end

end

end

เห็นแล้วรู้สึกน่าสนใจทีเดียว
และก็ชอบตรงที่ Obie เขียนว่า

I started figuring out that there are significantly better ways to achieve the goals of RSpec in Ruby, as long as we remember that Ruby is not Java.


Note:
blockquote ตัดมาจาก presentation ของ Dave Astels

Related link from Roti

No comments: