BDD on .NET Framework and Where I Learned About It

I recently received an insightful email from Jose Samonte asking for resources on Behavior-Driven Development (BDD) and where to start learning about it. Given the depth of my own journey with BDD, I thought I’d share my experiences and recommendations publicly.

Start Here

My introduction to BDD began with a blog post by Dan North: Introducing BDD. This post provides a solid foundation on the origins and principles of BDD. For further reading, Dan’s article “What’s in a Story” is also highly recommended as it delves into the concept of user stories in BDD.

Learn from Others

Much of the early work in BDD was done on platforms other than .NET, particularly in the Ruby and Java communities. Here are some key resources that have been instrumental in my understanding:

  • The RSpec Book: This book offers an introduction to BDD within the...
Read More

Theory of Constraints and Specification by Example Part II

Following up on my previous post about Specification by Example and Theory of Constraints, I’ve received insightful feedback from colleagues, particularly Håkan Forss, whom I greatly respect.

The Five Focusing Steps

Håkan pointed out some valuable perspectives on the Theory of Constraints’ five focusing steps:

  1. Identify the Constraint
  2. Decide How to Exploit the Constraint
  3. Subordinate All Other Processes to the Above Decision
  4. Elevate the Constraint
  5. If the Constraint Moves, Return to Step 1

Assuming the Goal of the Organization

The first step is to articulate the goal. In system development, this might be phrased as:

Develop a system that meets the needs of the users

Understanding the goal of your project can help direct the focus of improvement efforts and influence how trade-offs are managed throughout the process.

Identify the Constraint

In physical systems, identifying constraints is often straightforward—like observing...

Read More

Theory of Constraints and Specification by Example

Since I first encountered Specification by Example (or BDD as it’s also known), I felt it had a natural alignment with Lean thinking and related theories. Today, I want to explore how the Theory of Constraints can be applied through Specification by Example to enhance the system development process.

Standing on the Shoulders of Giants

This post reflects my own thoughts and tries to piece together insights from various experts. I owe much to pioneers like Dan North, Elijah Goldratt, and Gojko Adzic, among others.

Theory of Constraints

Last year, I read the insightful book, The Goal by Elijah Goldratt. Goldratt’s Theory of Constraints (TOC) asserts that every system has at least one bottleneck that limits its overall performance. Improvements to other areas are less effective if they don’t address the bottleneck.

Here’s a simple example:

Imagine Marcusoft Welded Steel-plates,...

Read More

Clean up your steps–use page objects in SpecFlow step definitions

If you are a developer doing BDD, as me, you’ll soon run into the joys of UI automation. The BDD community today seems to lean towards running your specifications/test end-to-end in order to capture the whole stack of the application as well as getting great regression tests.

But tests against the GUI can be brittle, that part of the application is the one that most often is changed, in my experience. So writing automated stuff (in essence programs) against a changing environment is not very pleasant as you might well know.

This post is about using the Page Object pattern that can help you handle this brittleness as well as structuring your test code in a nice, maintainable way. That in turn will help us to place code in the right place – which I like. Some guidelines, if you like.

Inspiration

I have of course not invented...

Read More

Two Types in SpecFlow - ScenarioContext and FeatureContext

Recently, I had the chance to explore more advanced error handling with SpecFlow and delved into the ScenarioContext and FeatureContext objects. These components offer some powerful capabilities that are worth understanding. In this post, I’ll take a closer look at both and offer some tips on how to utilize them effectively in your SpecFlow projects.

ScenarioContext

Most of us have encountered the ScenarioContext in the code generated by SpecFlow when a step definition is missing:

[Binding] public class StepDefinitions { [Then(@"I don't have this step definition in place yet")] public void ThenIDonTHaveThisStepDefinitionInPlaceYet() { ScenarioContext.Current.Pending(); } } 

However, ScenarioContext provides several other useful features:

ScenarioContext.Pending

The Pending method is well-known for marking steps as pending when...

Read More

KanbanBoards VI–OpenId Integration

It’s been a while since I did any work on the KanbanBoards project, but now I got around to add some more features. I planning on doing some acceptance tests for creating new boards. The controller functionality was spec’d out in then last installment of the series.

To do that properly I need to touch on two main areas of functionality:

  • Authentication – here I plan to use OpenID and see if I can plug-in some functionality that already exists.
  • Uploading pictures – just for fun I will try to store the pictures in the database and see how that sits. I can already here give away the fact that I didn’t do this today.

And finally show that the whole thing works using an acceptance test that verifies the functionality end-to-end.

Let’s go.

Feedback and updates

I got some great feedback from some people,...

Read More

Specification by Example with SpecLog – Some Initial Thoughts

I have been talking about BDD or specification by example almost every day for a year and a half now. I still love the idea—executable specifications that everyone concerned can read, so you can talk about the behavior of the system before a single line of code is written. Yeah, you see, as soon as I start to write about it, it’s hard to stop.

Most people (or roles rather) react positively to this idea; developers love the possibility to get a detailed specification to start from, testers see great promises in automating the tests, and requirements people love the traceability features and the level of detail that you get before you start.

It’s the workflow or process that is the “problem.” How do we organize the work around this? Who writes those features? Where are they updated? I have blogged about this several times before, but...

Read More

SpecFlow presentation at Sweden Progressive .NET

I got an invitation to the Sweden Progressive .NET (the group formerly known as Alt.Net Sweden) to do a presentation on SpecFlow. I know many of the people in this group, a lot of them work for Avega, and have the highest respect for their knowledge.

So to get an invite from them to talk about a BDD tool was really cool, and a bit nerve-wracking. But it also made me step up my game and I put quite a lot of time into creating a demonstration project that shows the different features of SpecFlow and how to use them effectively.

Of course, I created features for them so that you can easily read and understand them without even having to look at code. This was inspired by how TechTalk themselves spec out new features of SpecFlow and proved to work very well. I plan to update them as new...

Read More

Error “The provider did not return a ProviderManifestToken string” with SQL Compact Edition

I was totally terrified when this happened to my yesterday. I had prepared a little website to use on a SpecFlow demonstration. I had run it several times and it worked fine. But all of a sudden – when I was doing one of those “just checking” it failed on me with this (“The provider did not return a ProviderManifestToken string”) error.

The site was using Entity Framework Code first with SQL CE as described here

Goggling for it didn’t help me to much but I suddenly realized that something was missing. I had used MvcScaffolding to create the database, but I hadn’t added any entries into the .config. Neither had MvcScaffolding but it was totally a slip from me. So I simply added this:

<connectionStrings> <add name="[Name from you dbContext class]" connectionString="DataSource=|DataDirectory|AnyName.sdf" providerName="System.Data.SqlServerCe.4.0"

      Read More
    

In SpecFlow the test runner is just glue

I answered a question on Twitter today from a guy who had problems running SpecFlow scenarios with MSTest. That shouldn’t be I thought to myself – in SpecFlow the test runner is only used for the auto-generated stuff (#2 in this pictures) and shouldn’t affect the code you write. Lets try it.

The default test runner is NUnit so first I simply create a new Specs-project and created the following scenario:

stupid steps in scenario

I then Nuget’d SpecFlow, Should and NUnit with these commands:

Install-Package SpecFlow Install-Package NUnit Install-Package ShouldFluent 

And sure enough – when I compile some NUnit code is auto generated for me:

generated NUnit code

Just for good manners I implemented the steps and ran the specification. It worked with these (naïve) steps in place:

naive steps

If I now change...

Read More