Behaviour-Driven Development(BDD) ด้วย StoryQ… Actions!

Behaviour-Driven Development(BDD) คืออะไร

Behaviour-Driven Development(BDD) เกิดจากการออกแบบและวิเคราะห์ด้วยวิถี Domain-Driven Design(DDD) บวกกับการลงมือปฏิบัติให้เกิดผล(implements)ด้วยวิธี Test-Driven Development(TDD) ผมจึงขอแยกอธิบายเป็นสองส่วน อันได้แก่

Domain-Driven Design เป็นแนววิธีคิดวิเคราะห์เพื่อออกแบบซอฟต์แวร์ที่เน้นหนักๆไปที่จุดแข็งของเทคนิคการพัฒนาซอฟต์แวร์โดยใช้แนวคิดของ Ojected-Oriented และหลักการที่ดีเยี่ยมแล้วเกี่ยวกับการออกแบบซอฟต์แวร์ เพื่อจำลอง(simulation หรือ mockup) Objects ของปัญหาหลักๆด้วยมือเปล่าก่อนที่จะนำไปประยุกต์ใช้จริง สำหรับรายละเอียดของแนวคิดที่ดีเยี่ยมทั้งหมดของ DDD ให้คุณอ่านจากหนังสือ Domain-Driven Design: Tackling Complexity in the Heart of Software โดย Eric Evans เพิ่มเติม

Test-Driven Development เป็นกระบวนการพัฒนาซอฟแวร์ที่ใช้วิธีการทำซ้ำ(iterative)ที่มีวงจรการพัฒนาซอฟแวร์แต่ละรอบแบบสั้นๆ(slim fit หรือแบบพอดีคำ)ชนิดหนึ่ง โดยเริ่มจาก programmer จะเขียน test case เพื่อทดสอบ code ของ function ใดๆของตัวเองก่อนเพื่อพยายามให้เกิดข้อผิดพลาดขึ้น แล้วก็จะกลับไปปลับปลุง code ใหม่(refactors code) ของ function นั้นจนกระทั้งมันสามารถผ่าน test case นี้ไปได้ วิถี TDD นี้ผู้คิดค้นก็คือ Kent Beck เมื่อหลายปีก่อนและก็ถูกประยุกต์ใช้กันอย่างแพร่หลายจนกระทั้งปัจจุบัน เพราะมันช่วยเพิ่มความเร็ว และคุณภาพของ code ในการพัฒนา software ได้อย่างยอดเยี่ยมกันเลยทิเดียว อ่าน Test Driven Development: By Example โดย  Kent Beck เพิ่มเติม

ดังนั้น BDD ก็คือ วิธีการพัฒนา(Develoment)ซอฟแวร์ ด้วยการเขียน test case หรือ unit test ก่อนโดยอยู่บน code ที่มีการวิเคราะห์ และออกแบบ(Design) แล้วด้วยวิถีแห่ง DDD นั่นเอง

BDD ถูกเรียกครั้งแรกโดย Dan North อ่านรายละเอียดเพิ่มเติมได้ที่ http://behaviour-driven.org/ และหนังสือ The RSpec Book: Behaviour Driven Development with Rspec, Cucumber, and Friends โดยใครอีกเยอะแยะแต่มี Dan North ร่วมแต่งด้วย

เอาละไม่ต้องเว้ากันมากมาย เรามาเริ่มพัฒนา BDD ด้วย StoryQ กันเลยดีกว่า StoryQ(เหมือนกับ RSpec ของภาษา Ruby) ก็คือ BDD ในภาคที่นำมาปฏิบัติให้เป็นจริงได้แล้วนั่นเอง

StoryQ… Actions!

1. ไป load StoryQ จาก http://storyq.codeplex.com/ แตก zip ออกมาเตรียมไว้ก่อนเลย

2. สร้าง Visual Studio Projects(ปัจุบันผมใช้ 2010 คุณก็ควรจะติดตั้งมันซะก่อน) ใหม่แบบ Test Project ตั้งชื่อว่า HelloStoryQ

3. add references library StoryQ.dll จาก folder ที่เราแตก zip แล้วเข้ามาใน projects HelloStoryQ

4. เขียน Story เพื่อทดสอบไว้ที่ TestMethod1

using StoryQ;

namespace HelloStoryQ
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            new Story(“ทดสอบ BDD ด้วย StoryQ”);
        }
    }
}

5. เติมเรื่องราวเข้าไปใน Story(“ทดสอบ BDD ด้วย StoryQ”) โดยใช้ข้อความอธิบายแบบปกติธรรมดาๆ ที่เข้าใจได้ ด้วยวิธีการแบบ fluent interface แบบนี้

new Story(“ทดสอบ BDD ด้วย StoryQ”)
                .InOrderTo(“ดูว่า StoryQ มันใช้งานยังไง”) //เพื่อที่จะ(ดูว่า StoryQ มันใช้งานยังไง)
                .AsA(“นักพัฒนาเว้ยเฮ้ย”) //โดยเป็น(นักพัฒนา)
                .IWant(“ทดสอบกับ method ง่ายๆนะ”)//ฉันต้องการ(ทดสอบกับ method ง่ายๆนะ)
                .WithScenario(“ต่อข้อความสองตัว ก็คือ Chav กับ P”)//กับสถานการณ์(ต่อข้อความสองตัว ก็คือ Chav กับ P)
                ;

6. กับสถานการณ์ ต่อข้อความสองตัว ก็คือ Chav กับ P ผมก็จะ code เพื่อที่จะแสดง สถานการณ์นี้ จะประกอบไปด้วย  fluent interface แค่ Given/When/Then ดังนี้

new Story(“ทดสอบ BDD ด้วย StoryQ”)
                .InOrderTo(“ดูว่า StoryQ มันใช้งานยังไง”) //เพื่อที่จะ(ดูว่า StoryQ มันใช้งานยังไง)
                .AsA(“นักพัฒนา”) //โดยเป็น(นักพัฒนา)
                .IWant(“ทดสอบกับ method ง่ายๆนะ”)//ฉันต้องการ(ทดสอบกับ method ง่ายๆนะ)
                .WithScenario(“ต่อข้อความสองตัว ก็คือ Chav กับ P”)//กับสถานการณ์(ต่อข้อความสองตัว ก็คือ Chav กับ P)
                .Given(IHaveTwoString, “Chav”, “P”) //กำหนดให้(มี string สองตัวคือ Chav และ P)
                .When(JointTwoString) //เมื่อ(ต่อ 2 string)
                .Then(IWillSee, “Chav:P”)//แล้ว(ฉันจะเห็น string เป็น Chav:P)
                .Execute()
                ;

7. เขียน method IHaveTwoString, JointTwoString และ IWillSee เพื่อสนับสนุน Story ข้างต้นได้เป็น

string _st1;
string _st2;
public void IHaveTwoString(string st1, string st2)
{
    _st1 = “Chav”;
    _st2 = “P”;
}

string _real;
public void JointTwoString()
{
    _real = _st1 + “:” + _st2;
}
public void IWillSee(string expectedValue)
{
    Assert.AreEqual(expectedValue, _real);
}

8. OK เสร็จแล้วครับ BDD กับ StoryQ ลอง run unit test Story นี้ดูจะได้ผลแบบนี้

Story is ทดสอบ BDD ด้วย StoryQ
  In order to ดูว่า StoryQ มันใช้งานยังไง
  As a นักพัฒนา
  I want ทดสอบกับ method ง่ายๆนะ

      With scenario ต่อข้อความสองตัว ก็คือ Chav กับ P
        Given I have two string(Chav, P)              => Passed
        When joint two string                         => Passed
        Then I will see(Chav:P)                       => Passed

 ทดลองแก้ไข method JointTwoString ดูครับเช่น st1 + “.” + st2 แล้วลอง run ดูไรแบบนี้ หรือลองกำหนด IHaveTwoString ใหม่ก็ได้ เทคนิค BDD มีอีกมากมายเลยทีเดียวเชียว เมื่อผมเปิดแล้วเป็นหน้าที่ของคุณที่จะไปประยุกต์ใช้ตามความเหมาะสมในแต่ละ Story เฉพาะของคุณเองครับ

ขอบคุณครับ 🙂

 

Advertisements

#agile-software-development, #design, #unit-test