Behavior Driven Development (or BDD) is an Agile software development technique that encourages collaboration between developers, QA, and non-technical or business participants in a software project.
Dalam BDD kita menggunakan aspek Given/When/Then ketika membuat Feature. Dari Feature ini, Tester dapat membuat scenario test. Sedangkan bagi Developer bisa digunakan untuk membuat Unit Testing. Hindari menggunakan terlalu banyak istilah teknis di dalam feature yang kita buat. Salah satu tujuan menggunakan BDD adalah agar menghindari salah pengertian mengenai sebuah feature antara tester, analis dan developer. Kita akan menggunakan SpecFlow sebagai framework BDD kita.
Sebagai contoh kita mempunyai story seperti ini. Story ini dibuat menggunakan SpecFlow feature file.
Feature: Add Vehicle As an Administrator I want to be to add new vehicle In order to a Customer can reserve it @mytag Scenario: Vehicle Name is not blank Given I have entered '' into the field name When I press Submit Then I see message saying name is mandatory
Kemudian klik kanan file feature yang kita buat untuk membuat step.
SpecFlow akan menghasilkan file steps seperti ini.
using System; using TechTalk.SpecFlow; namespace BDDTest { [Binding] public class AddVehicleSteps { [Given(@"I have entered '(.*)' into the field name")] public void GivenIHaveEnteredIntoTheFieldName(string p0) { ScenarioContext.Current.Pending(); } [When(@"I press Submit")] public void WhenIPressSubmit() { ScenarioContext.Current.Pending(); } [Then(@"I see message saying name is mandatory")] public void ThenISeeMessageSayingNameIsMandatory() { ScenarioContext.Current.Pending(); } } }
Kita running unit step tersebut, terlihat bahwa unit tersebut diskip karena belum ada implementasi di dalamnya.
Kita akan membuat class untuk menghandle bisnis logic untuk feature tersebut dan memodifikasi class steps di atas.
using BDDProject; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using TechTalk.SpecFlow; namespace BDDTest { [Binding] public class AddVehicleSteps { private IVehicleBLL _vechileBll = new VehicleBLL(); private Vehicle _vehicle = new Vehicle(); private string _message; [Given(@"I have entered '(.*)' into the field name")] public void GivenIHaveEnteredIntoTheFieldName(string EmptyName) { _vehicle.Name = EmptyName; } [When(@"I press Submit")] public void WhenIPressSubmit() { try { _vechileBll.Add(_vehicle); } catch (Exception ex) { _message = ex.Message; } } [Then(@"I see message saying name is mandatory")] public void ThenISeeMessageSayingNameIsMandatory() { Assert.AreEqual(_message.ToLower(), "name is mandatory"); } } }
Kita jalankan lagi unit test kita, dan hasilnya seperti ini.