Introduction
BDD (Behavior driven development) adapted features of TDD(Test Driven Development) and extended a few syntaxes, which made the Product Owner (PO Role of Scrum Process) or Business Analyst job easy to convert requirements into standard scripts, by analysing the behaviour of features required by customers. And the developer's job will be easy with this behavior, scripts drive the development.
We will achieve this in C# using SpecFlow extension.
Install the SpecFlow as shown in the image below, Go to Extension --> Manage Extension --> Online and type specflow
We will try to achieve this with serialization and deserialization of samples.
Create specflow project as shown in images below with targeted framework .Net 6.0 and Testing framework Nunit (you can choose your convenient testing framework)
Add feature file in Features folder like below and update the feature, scenario, given, when, then like below (2 features file created)
//Filename: Serialization.feature
Feature: Serialization
A short summary of the feature
Scenario: Serialize object to json
Given a person object
When Serialize method is callled
Then get the object in json format
//Filename: Deserialization.feature
Feature: Deserialization
A short summary of the feature
Scenario: DeSerialize json to object
Given a person object in string format
When DeSerialize method is callled
Then get the json in person object
To generate a step definition for the above scripts, right click and select "Define steps" like below, which will popup Skelton for the given, when, then step methods, copy that add it in StepDefinations folder like below for both the files. and followed by providing the implementation.
// Filename: SerializationSteps.cs
using NUnit.Framework;
using Serialization.Deserialization;
namespace SampleSpecFlowProject.StepDefinitions {
[Binding]
public class SerializationSteps {
Person ? person;
Serialization_Deserialization ? serialization_Deserialization;
string ? result;
[Given(@ "a person object")]
public void GivenAPersonObject() {
person = new Person {
Name = "ABC",
Age = 20,
Gender = "Male",
IsStudent = true
};
serialization_Deserialization = new Serialization_Deserialization();
}
[When(@ "Serialize method is callled")]
public void WhenSerializeMethodIsCallled() {
result = serialization_Deserialization.Serialize(person);
}
[Then(@ "get the object in json format")]
public void ThenGetTheObjectInJsonFormat() {
string expected = "{\r\n \"Name\": \"ABC\",\r\n \"Age\": 20,\r\n \"Gender\": \"Male\",\r\n \"IsStudent\": true\r\n}";
Assert.AreEqual(result, expected);
}
}
}
using NUnit.Framework;
using Serialization.Deserialization;
//Filename: DeserializationStepDefinitions.cs
using System;
using TechTalk.SpecFlow;
namespace SampleSpecFlowProject.StepDefinitions {
[Binding]
public class DeserializationStepDefinitions {
string jsonText = string.Empty;
Serialization_Deserialization serialization_Deserialization = null;
Person result = null;
[Given(@ "a person object in string format")]
public void GivenAPersonObjectInStringFormat() {
jsonText = "{\"Name\":\"ABC\",\"Age\":20,\"Gender\":\"Mail\",\"IsStudent\":true}";
serialization_Deserialization = new Serialization_Deserialization();
}
[When(@ "DeSerialize method is callled")]
public void WhenDeSerializeMethodIsCallled() {
result = serialization_Deserialization.Deserialize < Person > (jsonText);
}
[Then(@ "get the json in person object")]
public void ThenGetTheJsonInPersonObject() {
Assert.IsNotNull(result);
}
}
}
Solution Explorer looks like below,
Once all the above steps are done. goto view--> Test Explorer --> you should be able to see 2 test cases like below,
Create console project with targeted framework .Net 6.0
Below is the code files for serialization and deserialization. Here to develop this, we need to follow TDD. As the article is to know about BDD. I am putting code directly.
//Filename: Serialization_Deserialization.cs
using Newtonsoft.Json;
namespace Serialization.Deserialization {
public class Serialization_Deserialization {
public string Serialize(object obj) {
string json = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);
return json;
}
public T Deserialize < T > (string jsonText) {
T obj = JsonConvert.DeserializeObject < T > (jsonText);
return obj;
}
}
}
namespace Serialization.Deserialization
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
public bool IsStudent { get; set; }
}
}
Execute the test case by right clicking on it and fix it, if you have issues.
Summary
In this article we understood the use of BDD along with specFlow, hope it helps. FYR I have attached a project, and make use of it.