When I’m working on something new at work, I like to be able to work on it in my own time at nights and on the weekend to polish my skills through experimentation, and share what I learn. I’ve recently been working on setting up Acceptance Test Driven Development in C# at work, but unfortunately Microsoft makes it really, really hard to polish your skills in C# development at home, unless you’re willing to part with large sums of cash (say from $20,775, and I’d prefer a new car). This is probably one of the reasons why I find the Microsoft .NET testing community (and the dev community too) quite insular, Microsoft just doesn’t encourage their users to share their craft.
Sure, Microsoft provides Visual Studio 2010 (VS2010) Express Edition – which can be used free of charge, even for commercial purposes, but the limitations on its functionality are borderline ridiculous. For example, it doesn’t support Microsoft’s own unit testing framework (Microsoft obviously don’t encourage TDD), and all add-ins are banned (no ReSharper for you). It also doesn’t work with Microsoft’s own version control system (TFS).
So, Microsoft it basically makes it really hard to do anything you want to do, but there are ways to get stuff done, even if they’re convoluted.
ATDD Frameworks in C#
I know of three main open source ATDD/BDD frameworks that work in C#: SpecFlow, Cuke4Nuke and StoryQ. Only two of these use Gherkin (StoryQ uses its own slightly modified DSL), and I like Gherkin, so I’ll ignore StoryQ for now. Cuke4Nuke still requires some Ruby glue, and to keep things pure, I like SpecFlow as it’s a pure .NET implementation of ATDD with full Gherkin syntax support. For this reason, SpecFlow seems to be the most prevalent ATDD framework in the .NET community and this is what I will use for this example.
SpecFlow as an Acceptance Test Driven Development Framework
SpecFlow is an open source framework that is delivered as a Windows installer, and this installs support for feature and step definition files in Visual Studio through an Add-In that automatically generates unit tests for you from the feature files. Unfortunately, as VS2010 Express doesn’t allow add-ins, SpecFlow won’t work without some tinkering.
Install SpecFlow & NUnit
Before we get started, we need to install VS2010 Express, SpecFlow and NUnit.
- Install VS2010 C# Express if you don’t already have it
- Install the latest SpecFlow version from the SpecFlow GitHub downloads page.
- Install the latest NUnit version from the NUnit download page.
- Add the Specflow directory (C:\Program Files\TechTalk\SpecFlow or similar) and the NUnit directory (C:\Program Files\NUnit 2.5.9\bin\net-2.0 or similar) to your Windows path.
Adding SpecFlow templates to Visual Studio 2010 Express
When installing SpecFlow to VS2010 (non-express) it creates templates that can be accessed through the “New Item” menu. Fortunately, it is fairly trivial to add these to VS2010 Express. Just download the templates I have uploaded here (2010, or here (2012) unzip this directory and place the .zip files (SpecFlowFeature.zip, SpecFlowStepDefinition.zip etc.) into your Visual Studio 2010 Express C# templates directory (usually:
C:\Users\username\Documents\Visual Studio 2010\Templates\ItemTemplates\Visual C# or similar).
This means you now have access to the SpecFlow templates when adding a new item to your C# project.
Generating SpecFlow NUnit tests from Feature Files
When you add a SpecFlow feature to the full version of VS2010, it automatically generates a unit test file behind the feature file, so that it’s always up to date. This doesn’t work in Express edition, so you have to use the specflow.exe file to do this for you. Fortunately, this can be done in a batch file, and then added as an “external tool” to VS2010 Express, so you get the same functionality, but not quite as neat.
Expert Settings in VS2010 Express (if not already enabled), by choosing
- Create a batch file in your project directory called something like “generatespecflowtests.bat” with the following content:
echo Starting to generate SpecFlow unit tests
SpecFlow generateAll %1 /force /verbose
echo Finished generating SpecFlow unit tests
- Add an external tool command in VS2010 Express, using Tools->External Tools->Add. Make sure you set the starting directory, and “show output”
- You can then generate your tests from the
Tools menu or, if you like, you can add this command to a new Toolbar by using
Tools -> Customize -> Toolbars -> New, then
Tools -> Customize -> Commands -> Toolbar -> Add Command.
Running SpecFlow NUnit tests from Feature Files
Simon Whittemore from London wrote an excellent post about how to automatically run Specflow NUnit tests, and capture a pretty html result, on his blog. I’ve included his batch file here, as it’s what we’ll use to run our tests from within VS2010 Express.
- Create a batch file in your project directory named
runspecflowtests.bat or similar.
- Include Simon’s content (below) in your batch file.
specflow.exe nunitexecutionreport %2 /xmlTestResult:%3
if NOT %errorlevel% == 0 (
echo "Error generating report - %errorlevel%"
if %errorlevel% ==0 TestResult.html
- Create an external tool setting the same as we did for the generate unit tests, but with the parameters defined on this dialog:
- Command: Link to your batch file
- Arguments: $(TargetName)$(TargetExt)$(ProjectDir)$(ProjectFileName)$(BinDir)TestResult.xml
- Initial Directory: $(BinDir)
- Use Output Window: checked
- Optionally add this to your VS2010 Express Toolbar as above
When you run this command in VS2010, all SpecFlow features are run, and the resulting report is launched in your default web browser.
What I have shown is that although Microsoft makes it very hard, it is possible to use VS2010 Express and open source tools like SpecFlow so that you can polish your skills in your own time.
In this theme of ATDD using C# and .NET, over the coming days I will demonstrate how you can use SpecFlow to write and run automated web tests against a web browser using the open source tool WebDriver. Stay tuned!
Update: 20 Feb 2011
The original link to the templates was wrong, I have now updated it to the correct link.
Update 29 Sep 2013
Yannick de Kercadio has kindly provided VS2012 templates here.