{"id":48140,"date":"2019-05-26T05:35:27","date_gmt":"2019-05-26T05:35:27","guid":{"rendered":"https:\/\/www.softwaretestinghelp.com\/?page_id=48140"},"modified":"2025-04-01T08:08:28","modified_gmt":"2025-04-01T08:08:28","slug":"specflow-tutorial","status":"publish","type":"page","link":"https:\/\/www.softwaretestinghelp.com\/specflow-tutorial\/","title":{"rendered":"Specflow Tutorial: The Ultimate Guide to BDD Tool"},"content":{"rendered":"\n<p><b>A Complete Guide to Specflow and Behavior-Driven Development (BDD) Tutorial:<\/b><\/p>\n\n\n\n<p><strong>What is Specflow?<\/strong><\/p>\n\n\n\n<p><em>Specflow is a testing framework supporting BDD practices in .NET framework. It\u2019s an open-source framework hosted on GitHub. It aids in using ATDD (Acceptance test driver development) for .NET Applications. With this, we can define scenarios in plain English defined by Gherkin language that is understandable by anyone.<\/em><\/p>\n\n\n\n<p><em>There are various tools for writing tests in the BDD approach like Cucumber\/JBehave for Java, Lettuce for Python, Jasmine for Javascript, <strong>Specflow<\/strong> for .NET.&nbsp;<strong><\/strong><\/wp-block><\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-and-BDD.png\"><img decoding=\"async\" width=\"650\" height=\"366\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-and-BDD.png\" alt=\"Specflow and BDD\" class=\"wp-image-48304\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-and-BDD.png 650w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-and-BDD-300x169.png 300w\" sizes=\"(max-width: 650px) 100vw, 650px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>BDD<\/strong> (Behavior Driven Development) is a set of practices or an approach similar to TDD (Test Driven Development), which aims to bridge the communication gap between different stakeholders like Product, Developers, and Testers.<\/p>\n\n\n\n<p>The end goal of the BDD approach is to create business requirements that could be understood by the entire team to avoid misunderstandings and help to ship the feature being developed most acceptably.<\/p>\n\n\n\n<p><span style=\"color: #ff6600;\"><strong>A Complete Specflow Tutorial Series:<\/strong><\/span><\/p>\n\n\n\n<p>Read through the <strong>Complete Specflow Training Series<\/strong> for a better understanding of the concept.<\/p>\n\n\n\n<p><strong>Tutorial #1:<\/strong> <a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-tutorial\/\">Introduction to Specflow BDD Tool<\/a> (This Tutorial)<br><strong>Tutorial #2:<\/strong> <a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-and-selenium\/\">Specflow and Selenium Example<\/a><br><strong>Tutorial #3:<\/strong>&nbsp;<a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-bindings-hooks-step-reuse\/\">Specflow Binding &amp; Advanced Concepts<\/a><br><strong>Tutorial #4:<\/strong> <a href=\"https:\/\/www.softwaretestinghelp.com\/step-argument-transformations-specflow-tables\/\">Step Argument Transformations &amp; Specflow Tables<\/a><br><strong>Tutorial #5:<\/strong> <a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-pickles\/\">Specflow Living Documentation with Pickles<\/a><br><strong>Tutorial #6:<\/strong>&nbsp;<a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-reporting\/\">Specflow Report Generator<\/a><br><strong>Tutorial #7:<\/strong> <a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-interview-questions\/\">Specflow Interview questions<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><span style=\"color: #ff6600;\"><strong>A Brief Overview of Tutorials in the Specflow Series:<\/strong><\/span><\/p>\n\n\n\n<div id=\"tablepress-708-scroll-wrapper\" class=\"tablepress-scroll-wrapper\">\n<table id=\"tablepress-708\" class=\"tablepress tablepress-id-708 tablepress-responsive\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">Tutorial #<\/th><th class=\"column-2\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">1<\/td><td class=\"column-2\"><strong><a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-tutorial\/\">Introduction to Specflow BDD Tool<\/a> (This Tutorial)<\/strong><br \/>\n<br \/>\nThis introductory tutorial will explain you all about Specflow in detail. Specflow is a testing framework supporting BDD practices in .NET framework. It\u2019s an open source framework hosted on GitHub. It aids in using ATDD (Acceptance test driver development) for .NET Applications.<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">2<\/td><td class=\"column-2\"><strong><a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-and-selenium\/\">Specflow and Selenium Example<\/a><\/strong><br \/>\n<br \/>\nThis tutorial will focus on the Integration of Selenium with Specflow framework through a simple test scenario of video search on Youtube application. You will also check how to share data across different bindings through private class fields.<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">3<\/td><td class=\"column-2\"><strong><a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-and-selenium\/\">Specflow and Selenium Example<\/a><\/strong><br \/>\n<br \/>\nThis tutorial will focus on the Integration of Selenium with Specflow framework through a simple test scenario of video search on Youtube application. You will also check how to share data across different bindings through private class fields.<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">4<\/td><td class=\"column-2\"><strong><a href=\"https:\/\/www.softwaretestinghelp.com\/step-argument-transformations-specflow-tables\/\">Step Argument Transformations &amp; Specflow Tables<\/a><\/strong><br \/>\n<br \/>\nThis informative Specflow tutorial will expalin in detail about Step Argument transformations which allow custom type conversions for Specflow arguments to avoid boilerplate code and Specflow tables come in handy when you need to pass in a lot of fields\/data in single step in a user friendly tabular format.<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">5<\/td><td class=\"column-2\"><strong><a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-pickles\/\">Specflow Living Documentation with Pickles<\/a><\/strong><br \/>\n<br \/>\nFrom this Specflow tutorial you will get to know how to generate good looking living documentation through an open source framework called pickles using your existing Specflow files.<\/td>\n<\/tr>\n<tr class=\"row-7\">\n\t<td class=\"column-1\">6<\/td><td class=\"column-2\"><strong><a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-reporting\/\">Specflow Report Generator<\/a><\/strong><br \/>\n<br \/>\nIn this Specflow Reporting tutorial, you will learn the ways of executing Specflow feature tests along with generating HTML reports through the Specflow executable.<\/td>\n<\/tr>\n<tr class=\"row-8\">\n\t<td class=\"column-1\">7<\/td><td class=\"column-2\"><strong><a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-interview-questions\/\">Specflow Interview questions<\/a><\/strong><br \/>\n<br \/>\nA list of the most popular Specflow interview questions and answers with examples are included in this tutorial for you to crack any Specflow interview successfully at the first attempt.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<!-- #tablepress-708 from cache -->\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Let&#8217;s start with the first tutorial in this series.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to Specflow BDD Tool<\/h2>\n\n\n\n<p><strong><span style=\"color: #ff6600;\">Watch the Video Tutorial:<\/span>&nbsp;<\/strong><\/p>\n\n\n\n<p><strong>Here is a video tutorial on Specflow and Behavior Driven Development:<\/strong><\/p>\n\n\n\n<p><iframe src=\"https:\/\/www.youtube.com\/embed\/wSJmus43l4A\" width=\"650\" height=\"350\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><span data-mce-type=\"bookmark\" style=\"display: inline-block; width: 0px; overflow: hidden; line-height: 0;\" class=\"mce_SELRES_start\">?<\/span><\/iframe><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Features of BDD<\/h3>\n\n\n\n<p><strong>The key features of BDD are briefed below:<\/strong><\/p>\n\n\n\n<p><strong>#1)<\/strong> It tries to define the behavior of the system or feature being developed through an example or scenario. For instance, if you are building a simple Calculator Application then the different behaviors include addition, multiplication, division, etc.<\/p>\n\n\n\n<p>Hence through BDD, all the stakeholders will first meet to decide the behavior of the application like Addition and will have scenarios as shown below.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">Given, I have 2 numbers 30 and 50 as input\nWhen I add these 2 numbers\nThen I should get an output of 80<\/pre><\/pre>\n\n\n\n<p>If you see the above representation it\u2019s a scenario in plain English that is clearly understandable by anyone and makes the requirements for a feature clear (as per the acceptance criteria). Hence the first step is to articulate these requirements.<\/p>\n\n\n\n<p><strong>#2)<\/strong> Now with a set of these scenarios, the QA writes tests against these and this will initially fail as the feature is not yet developed.<\/p>\n\n\n\n<p><strong>#3)<\/strong> Now, the developer writes a feature code and executes these tests again.<\/p>\n\n\n\n<p><strong>#4)<\/strong> The tests may pass or fail. If they fail \u2013 refactor code and repeat the process<\/p>\n\n\n\n<p><strong>#5)<\/strong> Once code refactoring is complete all the scenarios\/tests should pass.<\/p>\n\n\n\n<p>Hence, in essence, BDD uses the TDD approach and takes it to the next level by having some common easily understandable specifications in the form of scenarios. They also represent the feature documentation in itself.<\/p>\n\n\n\n<p>There are various tools for writing tests in the BDD approach like Cucumber\/JBehave for Java, Lettuce for <a href=\"https:\/\/www.softwaretestinghelp.com\/python\/\">Python<\/a>, Jasmine for Javascript, <strong>Specflow<\/strong> for .NET.<\/p>\n\n\n\n<p><strong>In this tutorial, we will be focusing on Specflow.<\/strong><\/p>\n\n\n\n<p><strong><em>Also, Read =><\/em> <a href=\"https:\/\/www.softwaretestinghelp.com\/behavior-driven-development-bdd-tools\/\">Top BDD Tools and Testing Framework<\/a><\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Keywords \u2013 Given, When &amp; Then<\/h3>\n\n\n\n<p>From the unit testing world, most of us are familiar with the 3 A\u2019s i.e. Arrange, Act, and Assert. Now, Given, When and Then are the replacements for these in the BDD world?<\/p>\n\n\n\n<p>Let\u2019s take an <span style=\"text-decoration: underline;\"><strong>Example<\/strong><\/span> for understanding each of these. Suppose you are listing down a scenario for validating a product that gets added to the shopping cart of an e-commerce application which requires you to be logged in as a pre-requisite.<\/p>\n\n\n\n<p><strong>The specification can be written as follows:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">Scenario: Products get added to cart for a logged in customer\nGiven I have a logged-in customer on my application\nWhen I add 2 quantity of a product to my shopping cart\nThen the shopping cart should get updated and have the right product and quantity <\/pre><\/pre>\n\n\n\n<p><span style=\"color: #ff6600;\"><strong>Given<\/strong>:<\/span> This is used for describing a set of pre-conditions for the scenario being defined. For instance, in the example, the scenario\u2019s pre-requisite is a logged-in customer. Hence compared to the Arrange analogy in a unit test, the step implementation will need to ensure that there is a logged-in customer.<\/p>\n\n\n\n<p><span style=\"color: #ff6600;\"><strong>When<\/strong>:<\/span> This is used to describe an action or execution step. In the example, it shows that the customer is trying to add a product to his shopping cart. Hence the step implementation for this step will take care of the simulation code to add a product to the cart. This can be compared to the <em>Act <\/em>step in the Unit tests.<\/p>\n\n\n\n<p><span style=\"color: #ff6600;\"><strong>Then<\/strong>:<\/span> This is used to describe the Outcome of the scenario and essentially where the validations should be placed. It can be compared to the Assert step in the Unit testing world. In the example here, the step implementation will assert whether the product was added and the quantity is the same as that was chosen by the customer.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Feature File<\/h3>\n\n\n\n<p>The feature file is essentially a grouping of multiple scenarios for the application under development or testing. It can also be simply thought of as different modules of the application by which the application can be logically separated.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><strong>For Example:<\/strong><\/span><\/p>\n\n\n\n<p>An e-commerce application can decide to have different high-level feature files like:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Login\/Logout functionality<\/li>\n\n\n\n<li>Shopping Cart<\/li>\n\n\n\n<li>Payment etc.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">What is Specflow?<\/h3>\n\n\n\n<p>Specflow is a tool supporting BDD practices in .NET framework. It\u2019s an open-source framework hosted on GitHub. It aids in using ATDD (Acceptance test driver development) for .NET Applications.<\/p>\n\n\n\n<p>Binding business requirements for an application using the Specification By Example paradigm helps in a better understanding of the application behavior by all the stakeholders and thereby results in shipping the product with correct expectations.<\/p>\n\n\n\n<p>It makes use of <a href=\"https:\/\/cucumber.io\/docs\/gherkin\/\" target=\"_blank\" rel=\"noopener nofollow\">Gherkin<\/a> syntax for creating features &amp; scenarios. It also has an active discussion\/developer <a href=\"https:\/\/groups.google.com\/forum\/#!forum\/SpecFlow\" target=\"_blank\" rel=\"noopener nofollow\">forum<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Specflow \u2013 Getting Started<\/h3>\n\n\n\n<p>In this section, we will explore installing specflow in the Visual Studio IDE and creating feature files for a simple String Utility Application.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span style=\"color: #ff6600;\">About Sample Application<\/span><\/h4>\n\n\n\n<p>We will be illustrating different features of the Specflow framework in this tutorial using a Calculator Application that has functions\/interfaces to provide different operations like:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Adding 2 numbers.<\/li>\n\n\n\n<li>Subtracting 2 numbers.<\/li>\n\n\n\n<li>Dividing and Multiplying 2 numbers.<\/li>\n\n\n\n<li>Finding the Square root of the given number.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\"><span style=\"color: #ff6600;\"><strong>Specflow <\/strong>Installation Guide<\/span><\/h4>\n\n\n\n<p><strong>Specflow installation is a 2 step process<\/strong><\/p>\n\n\n\n<p><strong>#1)<\/strong> Installing the required plugins in the Visual Studio IDE.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>To install the specflow plugin navigate to Tools -> Extension &amp; Updates.<\/li>\n\n\n\n<li>Now click \u201cOnline\u201d on the left panel.<\/li>\n\n\n\n<li>Now search for specflow in the right panel.<\/li>\n\n\n\n<li>From the search results select \u201cSpecflow for Visual Studio 2017\u201d.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-PluginInstallation.png\"><img decoding=\"async\" width=\"2106\" height=\"1418\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-PluginInstallation.png\" alt=\"Specflow-Plugin Installation\" class=\"wp-image-48255\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-PluginInstallation.png 2106w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-PluginInstallation-300x202.png 300w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-PluginInstallation-768x517.png 768w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-PluginInstallation-1024x689.png 1024w\" sizes=\"(max-width: 2106px) 100vw, 2106px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>#2)<\/strong> Setting up the project with feature files and step definitions.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create a simple new project in Visual Studio. We can create any kind of project like a Class Library \/ Console Application \/ Unit test project etc. For simplicity, we are taking up a Class Library project. Name the project as \u201cSpecflowBasic\u201d.<\/li>\n\n\n\n<li>To run the Specflow scenarios that we are going to create, we need a test runner. Specflow provides a runner out of the box called Specflow + Runner (which is a paid version and the free version introduces a delay).<\/li>\n<\/ul>\n\n\n\n<p>(Other runners are also available for NUnit and MsTest which we will see in the further articles in this series).<\/p>\n\n\n\n<p>To install Specflow + Runner \u2013 <strong>Navigate to Tools -&gt; NuGet Package Manager -&gt; Package Manager Console.<\/strong><\/p>\n\n\n\n<p>Once the Package Manager Console opens up \u2013 Run the command.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> Install-Package SpecRun.SpecFlow<\/pre><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/05\/Specrun-Installation.png\"><img decoding=\"async\" width=\"748\" height=\"240\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/05\/Specrun-Installation.png\" alt=\"Specrun-Installation\" class=\"wp-image-81410\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/05\/Specrun-Installation.png 748w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/05\/Specrun-Installation-300x96.png 300w\" sizes=\"(max-width: 748px) 100vw, 748px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Also, to assert the values, we will need the help of a test framework. NUnit can be one of the options and the others include MsTest, etc. To install the NUnit framework to the application, open the Package Manager Console and type the command.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> Install-Package NUnit <\/pre><\/pre>\n\n\n\n<p><strong>#3)<\/strong> Create a new class named \u201cCalculatorApplication\u201d which will become our application under test. This is a simple class having functions to perform addition\/multiplication\/division\/square root etc., for the given input. This is what the CalculatorApplication class looks like.<\/p>\n\n\n\n<p><strong>#4)<\/strong> Once the package gets installed, create 2 folders in the project and name them as Features and Step Definitions for storing the feature files and step bindings respectively. We will discuss in detail the reason for this folder organization for Feature &amp; Step definitions.<\/p>\n\n\n\n<p><strong>#5)<\/strong> Now in the features folder, add a new Feature file and name it as CalculatorFeature.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-FeatureFileAdd.png\"><img decoding=\"async\" width=\"698\" height=\"405\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-FeatureFileAdd.png\" alt=\"Calculator Feature\" class=\"wp-image-48256\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-FeatureFileAdd.png 698w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Specflow-FeatureFileAdd-300x174.png 300w\" sizes=\"(max-width: 698px) 100vw, 698px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>You would see that by default the feature file has some description in Feature and Scenario.<\/p>\n\n\n\n<p><strong> Replace that with what we are going to test.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> Feature: CalculatorFeature\nIn order to test my application\nAs a developer\nI want to validate different operations of the application\n\nScenario: Add two numbers\nGiven I have provided 70 and 20 as the inputs\nWhen I press add\nThen the result should be 90\n\nScenario: Substract two numbers\nGiven I have provided 70 and 20 as the inputs\nWhen I press substract\nThen the result should be 50\n\nScenario: Multiply two numbers\nGiven I have provided 70 and 20 as the inputs\nWhen I press multiply\nThen the result should be 1400\n\nScenario: Divide two numbers\nGiven I have provided 70 and 20 as the inputs\nWhen I press divide\nThen the result should be 3.5\n\nScenario: SquareRoot of number\nGiven I have provided 70 as input\nWhen I press squareroot\nThen the result should be 8.37<\/pre><\/pre>\n\n\n\n<p><strong>#6)<\/strong> Generating Step Definitions: Specflow provides an automated way to generate bindings\/implementation for the different steps in feature file scenarios. This can be achieved by right-clicking on the feature file and clicking \u201cGenerate Step Definitions\u201d.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/GenerateStep-Preview.png\"><img decoding=\"async\" width=\"492\" height=\"384\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/GenerateStep-Preview.png\" alt=\"Generate Step Definition\" class=\"wp-image-48257\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/GenerateStep-Preview.png 492w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/GenerateStep-Preview-300x234.png 300w\" sizes=\"(max-width: 492px) 100vw, 492px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>This step does not guarantee an implementation <\/strong>for all the steps, but it tries its best to group the common steps in scenarios and reuse as many bindings it can. However, it does the job of avoiding boilerplate code whenever a scenario step needs to be implemented.<\/p>\n\n\n\n<p>After clicking <strong>\u201cGenerate Step Definitions\u201d<\/strong>, A window will show up listing the identified step implementations that the processor has detected. One can select or de-select as per the requirements.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/StepDetails-AutoGenerated.png\"><img decoding=\"async\" width=\"700\" height=\"552\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/StepDetails-AutoGenerated.png\" alt=\"Generate Step Definition Skeleton\" class=\"wp-image-48258\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/StepDetails-AutoGenerated.png 700w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/StepDetails-AutoGenerated-300x237.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>In the later sections, we will look into more details about the Style dropdown shown in the above screenshot.<\/p>\n\n\n\n<p>For now, let\u2019s keep all of them selected with default settings. Clicking on the Preview will show a snapshot of how the implementation will look like.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/StepDefinitions-Preview.png\"><img decoding=\"async\" width=\"742\" height=\"1227\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/StepDefinitions-Preview.png\" alt=\"Snapshot of Implementation\" class=\"wp-image-48259\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/StepDefinitions-Preview.png 742w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/StepDefinitions-Preview-181x300.png 181w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/StepDefinitions-Preview-619x1024.png 619w\" sizes=\"(max-width: 742px) 100vw, 742px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>After creating Step definitions, still, if there are still some unimplemented steps, the Feature files have a visual way of identifying the unimplemented applications. It shows those steps in a different color by making it simple to know that some steps don\u2019t have an implementation yet (or have any ambiguous step definitions).<\/p>\n\n\n\n<p><strong>A Sample Screen Depicts that Below:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Missing-Steps.png\"><img decoding=\"async\" width=\"490\" height=\"209\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Missing-Steps.png\" alt=\"Missing implementation\" class=\"wp-image-48260\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Missing-Steps.png 490w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/Missing-Steps-300x128.png 300w\" sizes=\"(max-width: 490px) 100vw, 490px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><span style=\"color: #ff6600;\"><strong><em><span style=\"text-decoration: underline;\">Note:<\/span> <\/em><\/strong><\/span>The Step definitions can be created manually as well \u2013 Any .cs file having [Binding] Attribute is a Step implementation class and the Gherkin syntax will look for matching the implementation of the given scenario step<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Execution<\/h3>\n\n\n\n<p>As we have already added Specflow+ Runner in the above section, executing the Scenarios is pretty straightforward (since it\u2019s an evaluation version of Specrun, it introduces a variable delay of 10-20s before the scenarios execute. , This delay is not present for registered variants and other flavors of Specrun runner like NUnit and MsTest).<\/p>\n\n\n\n<p>If all the steps have <strong>not been<\/strong> implemented and if there are still bindings that have a pending state. Then the output will show as pending.<\/p>\n\n\n\n<p>Let\u2019s try to run these tests\/scenarios at this point when there is no implementation for the bindings, and the scenarios are all pending.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/PendingScenarios.png\"><img decoding=\"async\" width=\"668\" height=\"554\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/PendingScenarios.png\" alt=\"Pending Scenarios\" class=\"wp-image-48270\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/PendingScenarios.png 668w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/PendingScenarios-300x249.png 300w\" sizes=\"(max-width: 668px) 100vw, 668px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Now let\u2019s try to implement the CalculatorApplication class with the methods that we want to test i.e. add, subtract, multiply, divide, and sqrt.<\/p>\n\n\n\n<p><strong>Given below is a code sample of how our CalculatorApplication class looks like:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks; \n\nnamespace SpecflowBasic\n{\nclass CalculatorApplication\n{\npublic int add(int input1, int input2)\n{\nreturn input1 + input2;\n} \n\npublic int subsctract(int input1, int input2)\n{\nreturn input1 - input2;\n} \n\npublic int multiply(int input1, int input2)\n{\nreturn input1 * input2;\n} \n\npublic double divide(double input1, double input2)\n{\nreturn input2 != 0 ? Math.Round(input1 \/ input2, 2) : 0;\n} \n\npublic double squareRoot(int input1)\n{\nreturn input1 != 0 ? Math.Round(Math.Sqrt(input1), 2) : 0;\n} \n\n}\n} <\/pre><\/pre>\n\n\n\n<p>Once the application is ready, let\u2019s try to figure out the ways to implement the bindings for each of the scenario steps.<\/p>\n\n\n\n<p><strong>Let\u2019s see the step-by-step<\/strong> approach to implementing<strong> these:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>First, we need to have an instance of the application that needs to be tested. For simplicity, we can instantiate the AUT (Application Under Test class) in step bindings and use the instantiated instance to call different methods\/functions as per the step that\u2019s implemented.<\/li>\n\n\n\n<li>To capture the input and output we are declaring variables to hold these values to call functions on the Application instance.<\/li>\n<\/ul>\n\n\n\n<p>Let\u2019s see the end-to-end implementation for all the bindings involved in validating the Add functionality (The rest of the scenarios are simply extending this).<\/p>\n\n\n\n<p><strong>The Add scenario looks as shown below:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">Scenario: Add two numbers\nGiven I have provided 70 and 20 as the inputs\nWhen I press add\nThen the result should <\/pre><\/pre>\n\n\n\n<p>Let\u2019s see the step implementation for each of these individual steps. For use of all the step implementations, we are declaring an instance of the Application under test as well as variables to hold input and output variables as shown below:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\/\/ instantiating application instance\nCalculatorApplication app = new CalculatorApplication(); \n\n\/\/ variables to hold input values and the intermeditate result\nint input1, input2;\ndouble output; <\/pre><\/pre>\n\n\n\n<p>Let\u2019s see the implementation of scenario steps one by one.<\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Step 1:<\/span><\/strong> Given I have provided 70 and 20 <strong>as<\/strong> the inputs.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">&#x5B;Given(@&amp;amp;quot;I have provided (.*) and (.*) as the inputs&amp;amp;quot;)]\npublic void GivenIHaveProvidedAndAsTheInputs(int p0, int p1)\n{\ninput1 = p0;\ninput2 = p1;\n} <\/pre><\/pre>\n\n\n\n<p>Here, we have just initialized the input variables with the values passed in from the scenario steps. p0 and p1 are the values that are passed in from the scenario step and will be initialized as 70 &amp; 20 respectively.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><strong>Step 2:<\/strong><\/span> When I press add.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">&#x5B;When(@&amp;amp;quot;I press add&amp;amp;quot;)]\npublic void WhenIPressAdd()\n{\noutput = app.add(input1, input2);\n} <\/pre><\/pre>\n\n\n\n<p>This is the Execution (or Act) step where the actual method is called on the Application under test. Notice that since the input variables input1 and input2 already contain the values passed in Step1 the application instance can call the method with these variables.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><strong>Step 3:<\/strong><\/span> &#8211; Then the result should be 90.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">&#x5B;Then(@&amp;amp;quot;the result should be (.*)&amp;amp;quot;)]\npublic void ThenTheResultShouldBe(double p0)\n{\nAssert.AreEqual(p0, output);\n&amp;nbsp;}<\/pre><\/pre>\n\n\n\n<p>This is the Validation (or Assert) step where the output is generated by the method call on and the Application instance is validated against the expected output.<\/p>\n\n\n\n<p>Notice, that the <em>Assert<\/em> keyword used is from NUnit Framework, which returns true or false depending on the validation\/expectation that is set. In case it returns false, it will cause the Step implementation to fail and that will show the scenario result as fail.<\/p>\n\n\n\n<p>Also, please note that the output variable gets the value from the previous step where the actual method was called on the application instance.<\/p>\n\n\n\n<p>Similar to the above, Step implementations for the rest of the scenario steps are performed in the same way, the difference is in calling different methods on the application instance and asserting different output values.<\/p>\n\n\n\n<p>Once all the Scenario steps are implemented, the tests can be executed.<\/p>\n\n\n\n<p><strong>The resultant output will look as shown below:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/ConsolidatedOuput.png\"><img decoding=\"async\" width=\"700\" height=\"534\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/ConsolidatedOuput.png\" alt=\"Consolidated Ouput\" class=\"wp-image-48271\" style=\"width:511px;height:auto\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/ConsolidatedOuput.png 700w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/ConsolidatedOuput-300x229.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>You can also view the output of the individual scenario which lists down the output of individual steps as well:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/ScenarioOutput.png\"><img decoding=\"async\" width=\"700\" height=\"361\" src=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/ScenarioOutput.png\" alt=\"Scenario Output\" class=\"wp-image-48272\" srcset=\"https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/ScenarioOutput.png 700w, https:\/\/www.softwaretestinghelp.com\/wp-content\/qa\/uploads\/2019\/03\/ScenarioOutput-300x155.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>Hope this article has given you a basic understanding of what BDD is and what are the tools that support BDD for .NET where we covered Specflow.<\/p>\n\n\n\n<p>We also discussed installing and executing Specflow feature files with the help of a sample application.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code Files<\/h3>\n\n\n\n<p><strong>The code files used in the application are shown below:<\/strong><\/p>\n\n\n\n<p><strong>CalculatorFeatureSteps.cs<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">using System;\nusing TechTalk.SpecFlow;\nusing NUnit;\nusing NUnit.Framework;\n\nnamespace SpecflowBasic.StepDefinitions\n{\n&#x5B;Binding]\npublic class CalculatorFeatureSteps\n{\n\/\/ instantiating application instance\nCalculatorApplication app = new CalculatorApplication();\n\n\/\/ variables to hold input values and the intermeditate result\nint input1, input2;\ndouble output;\n\n&#x5B;Given(@&amp;amp;quot;I have provided (.*) and (.*) as the inputs&amp;amp;quot;)]\npublic void GivenIHaveProvidedAndAsTheInputs(int p0, int p1)\n{\ninput1 = p0;\ninput2 = p1;\n}\n\n&#x5B;Given(@&amp;amp;quot;I have provided (.*) as input&amp;amp;quot;)]\npublic void GivenIHaveProvidedAsInput(int p0)\n{\ninput1 = p0;\n}\n\n&#x5B;When(@&amp;amp;quot;I press add&amp;amp;quot;)]\npublic void WhenIPressAdd()\n{\noutput = app.add(input1, input2);\n}\n\n&#x5B;When(@&amp;amp;quot;I press substract&amp;amp;quot;)]\npublic void WhenIPressSubstract()\n{\noutput = app.subsctract(input1, input2);\n}\n\n&#x5B;When(@&amp;amp;quot;I press multiply&amp;amp;quot;)]\npublic void WhenIPressMultiply()\n{\noutput = app.multiply(input1, input2);\n}\n\n&#x5B;When(@&amp;amp;quot;I press divide&amp;amp;quot;)]\npublic void WhenIPressDivide()\n{\noutput = app.divide(input1, input2);\n}\n\n&#x5B;When(@&amp;amp;quot;I press squareroot&amp;amp;quot;)]\npublic void WhenIPressSquareroot()\n{\noutput = app.squareRoot(input1);\n}\n\n&#x5B;Then(@&amp;amp;quot;the result should be (.*)&amp;amp;quot;)]\npublic void ThenTheResultShouldBe(double p0)\n{\nAssert.AreEqual(p0, output);\n}\n\n}\n} <\/pre><\/pre>\n\n\n\n<p><strong>CalculatorApplication.cs<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace SpecflowBasic\n{\nclass CalculatorApplication\n{\npublic int add(int input1, int input2)\n{\nreturn input1 + input2;\n}\n\npublic int subsctract(int input1, int input2)\n{\nreturn input1 - input2;\n}\n\npublic int multiply(int input1, int input2)\n{\nreturn input1 * input2;\n}\n\npublic double divide(double input1, double input2)\n{\nreturn input2 != 0 ? Math.Round(input1 \/ input2, 2) : 0;\n}\n\npublic double squareRoot(int input1)\n{\nreturn input1 != 0 ? Math.Round(Math.Sqrt(input1), 2) : 0;\n}\n\n}\n} <\/pre><\/pre>\n\n\n\n<p><strong>packages.config<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n\n&amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot; encoding=&amp;amp;quot;utf-8&amp;amp;quot;?&amp;amp;gt;\n&amp;amp;lt;packages&amp;amp;gt;\n&amp;amp;lt;package id=&amp;amp;quot;Newtonsoft.Json&amp;amp;quot; version=&amp;amp;quot;10.0.3&amp;amp;quot; targetFramework=&amp;amp;quot;net461&amp;amp;quot; \/&amp;amp;gt;\n&amp;amp;lt;package id=&amp;amp;quot;NUnit&amp;amp;quot; version=&amp;amp;quot;3.11.0&amp;amp;quot; targetFramework=&amp;amp;quot;net461&amp;amp;quot; \/&amp;amp;gt;\n&amp;amp;lt;package id=&amp;amp;quot;SpecFlow&amp;amp;quot; version=&amp;amp;quot;2.4.0&amp;amp;quot; targetFramework=&amp;amp;quot;net461&amp;amp;quot; \/&amp;amp;gt;\n&amp;amp;lt;package id=&amp;amp;quot;SpecRun.Runner&amp;amp;quot; version=&amp;amp;quot;1.8.5&amp;amp;quot; targetFramework=&amp;amp;quot;net461&amp;amp;quot; \/&amp;amp;gt;\n&amp;amp;lt;package id=&amp;amp;quot;SpecRun.SpecFlow&amp;amp;quot; version=&amp;amp;quot;1.8.5&amp;amp;quot; targetFramework=&amp;amp;quot;net461&amp;amp;quot; \/&amp;amp;gt;\n&amp;amp;lt;package id=&amp;amp;quot;SpecRun.SpecFlow.2-4-0&amp;amp;quot; version=&amp;amp;quot;1.8.5&amp;amp;quot; targetFramework=&amp;amp;quot;net461&amp;amp;quot; \/&amp;amp;gt;\n&amp;amp;lt;package id=&amp;amp;quot;System.ValueTuple&amp;amp;quot; version=&amp;amp;quot;4.3.0&amp;amp;quot; targetFramework=&amp;amp;quot;net461&amp;amp;quot; \/&amp;amp;gt;\n&amp;amp;lt;\/packages&amp;amp;gt;\n\n<\/pre><\/pre>\n\n\n\n<p><em><strong>Our upcoming tutorial will brief you on End to End example of using Specflow and Selenium Webdriver!<\/strong><\/em><\/p>\n\n\n\n<p><a href=\"https:\/\/www.softwaretestinghelp.com\/specflow-and-selenium\/\"><strong>NEXT Tutorial<\/strong><\/a><\/p>\n\r\n\t\t\t<div id=\"daexthefup-container\"\r\n\t\t\t\tclass=\"daexthefup-container daexthefup-layout-stacked daexthefup-alignment-center\"\r\n\t\t\t\tdata-post-id=\"48140\">\r\n\r\n\t\t\t\t<div class=\"daexthefup-feedback\">\r\n\t\t\t\t\t<div class=\"daexthefup-text\">\r\n\t\t\t\t\t\t<h3 class=\"daexthefup-title\">Was this helpful?<\/h3>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"daexthefup-buttons-container\">\r\n\t\t\t\t\t\t<div class=\"daexthefup-buttons\">\r\n\t\t\t\t\t\t\t\r\n\t\t\t<div class=\"daexthefup-yes daexthefup-button daexthefup-button-type-icon\" data-value=\"1\">\r\n\t\t\t\t\r\n                <svg>\r\n                    <defs>\r\n                        <style>.thumb-up-cls-1{fill:#c9c9c9;}.thumb-up-cls-2{fill:#e1e1e1;}.thumb-up-cls-3{fill:#676767;}<\/style>\r\n                    <\/defs>\r\n                    <g id=\"thumb_up\">\r\n                        <path class=\"thumb-up-cls-2 daexthefup-icon-circle\" d=\"m24,3c11.58,0,21,9.42,21,21s-9.42,21-21,21S3,35.58,3,24,12.42,3,24,3m0-1C11.85,2,2,11.85,2,24s9.85,22,22,22,22-9.85,22-22S36.15,2,24,2h0Z\" \/>\r\n                        <g>\r\n                            <rect class=\"thumb-up-cls-3 daexthefup-icon-secondary-color\" x=\"10\" y=\"20\" width=\"6\" height=\"15\" rx=\"1.5\" ry=\"1.5\" \/>\r\n                            <path class=\"thumb-up-cls-1 daexthefup-icon-primary-color\" d=\"m30.57,9.06l-.49-.1c-.81-.17-1.61.35-1.78,1.16l-5.3,11.74c-.17.81,3.16,1.61,3.97,1.78l1.96.41c.81.17,1.61-.35,1.78-1.16l2.18-10.27c.34-1.61-.7-3.21-2.31-3.56Z\" \/>\r\n                            <path class=\"thumb-up-cls-1 daexthefup-icon-primary-color\" d=\"m38.17,20h-18.67c-.83,0-1.5.67-1.5,1.5v12c0,.83.67,1.5,1.5,1.5h16.27c.71,0,1.33-.5,1.47-1.21l2.4-12c.19-.93-.53-1.8-1.47-1.8Z\" \/>\r\n                        <\/g>\r\n                    <\/g>\r\n                <\/svg>\t\t\t<\/div>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t<div class=\"daexthefup-no daexthefup-button daexthefup-button-type-icon\" data-value=\"0\">\r\n\t\t\t\t\r\n                <svg>\r\n                    <defs>\r\n                        <style>.thumb-down-cls-1{fill:#c9c9c9;}.thumb-down-cls-2{fill:#e1e1e1;}.thumb-down-cls-3{fill:#676767;}<\/style>\r\n                    <\/defs>\r\n                    <g id=\"thumb_down\">\r\n                        <path class=\"thumb-down-cls-2 daexthefup-icon-circle\" d=\"m24,3c11.58,0,21,9.42,21,21s-9.42,21-21,21S3,35.58,3,24,12.42,3,24,3m0-1C11.85,2,2,11.85,2,24s9.85,22,22,22,22-9.85,22-22S36.15,2,24,2h0Z\" \/>\r\n                        <g>\r\n                            <rect class=\"thumb-down-cls-3 daexthefup-icon-secondary-color\" x=\"10\" y=\"13\" width=\"6\" height=\"15\" rx=\"1.5\" ry=\"1.5\" \/>\r\n                            <path class=\"thumb-down-cls-1 daexthefup-icon-primary-color\" d=\"m30.57,38.94l-.49.1c-.81.17-1.61-.35-1.78-1.16l-5.3-11.74c-.17-.81,3.16-1.61,3.97-1.78l1.96-.41c.81-.17,1.61.35,1.78,1.16l2.18,10.27c.34,1.61-.7,3.21-2.31,3.56Z\" \/>\r\n                            <path class=\"thumb-down-cls-1 daexthefup-icon-primary-color\" d=\"m38.17,28h-18.67c-.83,0-1.5-.67-1.5-1.5v-12c0-.83.67-1.5,1.5-1.5h16.27c.71,0,1.33.5,1.47,1.21l2.4,12c.19.93-.53,1.8-1.47,1.8Z\" \/>\r\n                        <\/g>\r\n                    <\/g>\r\n                <\/svg>\t\t\t<\/div>\r\n\r\n\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\r\n\t\t\t\t<div class=\"daexthefup-comment\">\r\n\t\t\t\t\t<div class=\"daexthefup-comment-top-container\">\r\n\t\t\t\t\t\t<label id=\"daexthefup-comment-label\" class=\"daexthefup-comment-label\"><\/label>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"daexthefup-comment-character-counter-container\">\r\n\t\t\t\t\t\t\t\t<div id=\"daexthefup-comment-character-counter-number\"\r\n\t\t\t\t\t\t\t\t\tclass=\"daexthefup-comment-character-counter-number\"><\/div>\r\n\t\t\t\t\t\t\t\t<div class=\"daexthefup-comment-character-counter-text\"><\/div>\r\n\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<textarea id=\"daexthefup-comment-textarea\" class=\"daexthefup-comment-textarea\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Type your message\"\r\n\t\t\t\t\t\t\t\tmaxlength=\"\r\n\t\t\t\t\t\t\t\t400\t\t\t\t\t\t\t\t\t\"><\/textarea>\r\n\t\t\t\t\t<div class=\"daexthefup-comment-buttons-container\">\r\n\t\t\t\t\t\t<button class=\"daexthefup-comment-submit daexthefup-button\">Submit<\/button>\r\n\t\t\t\t\t\t<button class=\"daexthefup-comment-cancel daexthefup-button\">Cancel<\/button>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\r\n\t\t\t\t<div class=\"daexthefup-successful-submission-text\">Thanks for your feedback!<\/div>\r\n\r\n\t\t\t<\/div>\r\n\r\n\t\t\t","protected":false},"excerpt":{"rendered":"<p>A Complete Guide to Specflow and Behavior-Driven Development (BDD) Tutorial: What is Specflow? Specflow is a testing framework supporting BDD practices in .NET framework. It\u2019s an open-source framework hosted on GitHub. It aids in using ATDD (Acceptance test driver development) for .NET Applications. With this, we can define scenarios in &#8230; <\/p>\n<p class=\"read-more-container\"><a title=\"Specflow Tutorial: The Ultimate Guide to BDD Tool\" class=\"read-more button\" href=\"https:\/\/www.softwaretestinghelp.com\/specflow-tutorial\/#more-48140\" aria-label=\"Read more about Specflow Tutorial: The Ultimate Guide to BDD Tool\">Read more<\/a><\/p>\n","protected":false},"author":9,"featured_media":48304,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_helpful_pro_status":1,"footnotes":""},"categories":[572],"tags":[],"class_list":{"0":"post-48140","1":"page","2":"type-page","3":"status-publish","4":"has-post-thumbnail","6":"category-framework"},"acf":[],"_links":{"self":[{"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/pages\/48140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/comments?post=48140"}],"version-history":[{"count":0,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/pages\/48140\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/media\/48304"}],"wp:attachment":[{"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/media?parent=48140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/categories?post=48140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.softwaretestinghelp.com\/wp-json\/wp\/v2\/tags?post=48140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}