BDD (Behavior Driven Development) คืออะไร ? + ต่างจาก TDD อย่างไร

Suranart Niamcome
Dec 30, 2014 · 2 min read

หลายๆ คนคงจะเคยได้ยินคำว่า Behavior Driven Development (BDD) กันมาบ้างใช่มั้ยล่ะครับ แต่ก็อาจจะยังสงสัยอยู่ว่า แล้ว BDD มันแตกต่างกับ Test Driven Development (TDD) อย่างไร บทความนี้ผมจะมาเล่าให้ฟังกันครับ

สำหรับคนที่ยังไม่คุ้นเคยกับ TDD ผมแนะนำให้อ่านบทความนี้ดูครับ

BDD คืออะไร ?

BDD คือ รูปแบบการพัฒนาซอฟต์แวร์ที่มีการสร้าง test ขึ้นมาก่อนการ coding เหมือนกับ TDD ครับ เพียงแต่จะมีการบิดมุมมองเพื่อที่จะแก้ปัญหาของ TDD บางประการ ได้แก่

  • ไม่สามารถตอบคำถามได้ว่าควรเริ่ม test จาก case ไหนก่อน?
  • Tester สร้าง test case ไม่ถูก/ไม่ครอบคลุม/มากเกินความจำเป็น เนื่องจากไม่รู้ Behavior(พฤติกรรม) ของผู้ใช้
  • ในการ test ครั้งหนึ่ง จะต้อง test ละเอียดขนาดไหน?
  • ชื่อ test case และ test script ของ TDD ยากแก่การเข้าใจ หากไม่ใช่ Tester/Programmer (เช่น stakeholders, PM, BA, SME) เพราะภาษาที่ใช้มีความสอดคล้องกับ User story น้อย
  • และเมื่อเกิดความผิดพลาด จะเข้าใจยากว่าทำไมผลถึงออกมาผิดพลาด

Dan North ซึ่งเป็นคนมองเห็นปัญหาเหล่านี้ ได้พยายาม ปรับ TDD ให้ดีและเข้ากับ Agile มากยิ่งขึ้น (จนบางคนมองว่า BDD ก็คือ TDD done well หรือ TDD ที่ทำออกมาได้ดีนั่นเอง) เค้ามองว่าทำไมเราถึงไม่เอา Acceptance Testing ซึ่งเป็นสิ่งที่ลูกค้าเข้าใจง่ายๆ อยู่แล้ว มารวมกับ Unit Testing ซะหล่ะ!! เพราะ Acceptance Testing จะเป็นตัวบอกอยู่แล้วว่าควรจะ test แค่ไหนลูกค้าถึงจะพอใจ และยอมปล่อย release แรกออกไปได้

โดยการเขียน Acceptance Test ที่ Dan North เสนอ จะอยู่ในรูปของ User story แบบนี้ครับ

As a [role] I want [feature] so that [benefit]

ส่วน Acceptance Criteria ควรจะเขียนในรูปของ Scenario หรือตามสถานการณ์เพื่อที่จะนำไปเขียน Test Script ได้

Given [initial context], when [event occurs], then [ensure some outcomes]

ตัวอย่างการเขียน BDD

Story : MultiplyAs a user,
I want to multiply numbers,
So that I can get multiply result
Scenario: double resultGiven a variable x with value 2
When I multiply x by 2
Then x should equal 4
Scenario: triple resultGiven a variable x with value 3
When I multiply x by 3
Then x should equal 9
โดย User story ข้างต้น จะมีความหมายดังนี้
  • Storyเรื่องราวที่กำลังจะ test (อาจเขียนเป็น class)
  • Scenarioคำอธิบายรวมๆ ของ test (method ที่กำลังจะ test)
  • Givenค่าที่กำหนดให้ (ส่วนใหญ่เป็นการ mock data หรือการสร้างข้อมูลจำลอง)
  • Whenเหตุการณ์หลักของ Scenario นั้น เช่น การที่ user กดบันทึก เป็นต้น
  • Thenผลของ Scenario นั้น หรือ user ควรได้รับผลแบบไหน ซึ่งเราจะต้องทำการตรวจสอบ (Assert) ค่าว่าตรงตามที่ Scenario ได้กำหนดไว้หรือไม่
หากลองเอามาเขียนโค้ด ก็จะได้ประมาณนี้ (เขียนด้วย JBehave ซึ่งเป็น tool สำหรับทำ BDD ของ Java)public class ExampleSteps extends Steps {
int x;
@Given("a variable x with value $value")
public void givenXValue(@Named("value") int value) {
x = value;
}
@When("I multiply x by $value")
public void whenImultiplyXBy(@Named("value") int value) {
x = x * value;
}
@Then("x should equal $value")
public void thenXshouldBe(@Named("value") int value) {
if (value != x)
throw new RuntimeException("x is " + x + ", but should be " + value);
}
}
สำหรับสาย Front-end เราก็สามารถทำ BDD กับการเขียน JavaScript ได้เหมือนกันด้วย Jasmine รูปแบบของโค้ดจะมีหน้าตาประมาณนี้ครับ
describe("A suite", function() {
it("contains spec with an expectation", function() {
expect(true).toBe(true);
});
});

บทสรุป

จะเห็นได้ว่าโค้ดที่เขียนออกมาจาก BDD แทบจะเป็นภาษาพูดเลยทีเดียว ซึ่งไม่ใช่เรื่องบังเอิญแต่อย่างใด หากแต่เป็นความจงใจของ Dan North ที่ต้องการให้คนที่ไม่ได้อยู่ใน technical role สามารถทำความเข้าใจได้โดยง่าย และนอกจากการใช้ User story มาเขียนเป็น Behavior แล้ว ยังมีการใช้ Specification หรือการยกตัวอย่างมาใช้อธิบายพฤติกรรมของ user อีกด้วย (ซึ่งจะขอพูดถึงในบทความหน้าครับ)สำหรับ tool ที่ใช้ในการทำ BDD มีอยู่หลายตัวเหมือนกัน ไม่ว่าจะเป็น  JBehave (Java), Cucumber (Ruby), Jasmine (JS), SpecsFor.mvc (C#.NET) เป็นต้น ซึ่งเราสามารถดาวน์โหลดมาลองใช้ได้ตามอัธยาศัยเลยครับ สุดท้ายนี้ขอให้สนุกกับการทำ BDD นะครับ

SiamHTML

The collection of articles for front-end developers

SiamHTML

The collection of articles for front-end developers

Suranart Niamcome

Written by

Lead Engineer @Tencent (Thailand)

SiamHTML

The collection of articles for front-end developers