Skip to main content

NUnit in Team Foundation Build

Not everyone have embraced Microsofts testing platform, but prefer to use other tools for unit testing, for instance NUnit. Because this is such a common scenario there is lots of information and components to help with integrating NUnit in Team Foundation Build.

The easiest solution is to use two add-on components. MSBuild Community Tasks to make configuration easier and NUnit for Team Build to integrate the testresults in the build log and get the results in reports. Both of these components are open source and free to download.

Begin with installing NUnit, MSBuild Community Tasks and NUnit for Team Build. After that only some changes in TFSBuild.proj are needet to get a really nice integration of NUnit in Team Foundation Server.

Import MSBuild Community Tasks by adding the following row:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.targets" />

Now we have the possibility to use every task that is defined in the imported file, but the one we are interested in here is only the one that concerns NUnit. To add an NUnit task, add the following at the bottom of TFSBuild.proj:

<Target Name="AfterCompile">
    <!-- Create a Custom Build Step -->
    <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Name="NUnitTestStep" Message="Running Nunit Tests">
        <Output TaskParameter="Id" PropertyName="NUnitStepId" />
    </BuildStep>

    <!-- Get Assemblies to test -->
    <ItemGroup>
        <TestAssemblies Include="$(OutDir)\**\cs-*.dll" />
    </ItemGroup>

    <!-- Run NUnit and check the result -->
    <NUnit ContinueOnError="true" Assemblies="@(TestAssemblies)" OutputXmlFile="$(OutDir)nunit_results.xml" ToolPath="$(ProgramFiles)\Nunit 2.4.7\bin\">
        <Output TaskParameter="ExitCode" PropertyName="NUnitResult" />
    </NUnit>
    <BuildStep Condition="'$(NUnitResult)'=='0'" TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Id="$(NUnitStepId)" Status="Succeeded" />
    <BuildStep Condition="'$(NUnitResult)'!='0'" TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Id="$(NUnitStepId)" Status="Failed" />

    <!-- Regardless of NUnit success/failure upload the results to TFS. -->
    <Exec Command="&quot;$(MSBuildProjectDirectory)\NUnitTFS.exe&quot; -n &quot;$(OutDir)nunit_results.xml&quot; -t &quot;$(TeamProject)&quot; -b &quot;$(BuildNumber)&quot; -f &quot;%(ConfigurationToBuild.FlavorToBuild)&quot; -p &quot;%(ConfigurationToBuild.PlatformToBuild)&quot; -x &quot;$(MSBuildProjectDirectory)\NUnitToMSTest.xslt&quot;" />

    <!-- If NUnit failed it's time to error out -->
    <Error Condition="'$(NUnitResult)'!='0'" Text="Unit Tests Failed" />
</Target>

If you would like to run the test with a specific App.config like a testrunconfig file, it is possible to put the App.config file in the Source Control tree in the same directory as TFSBuild.proj. By running a copy command in the test task the special App.config could be copied with the current build. Add the following row for the concerned test DLL:s before the NUnit step:

<Exec Command="copy &quot;$(MSBuildProjectDirectory)\App.config&quot; &quot;$(OutDir)\MyTest.dll.config&quot; /y" />

Note the /y attribute which means that an existing file will be overwritten automatically.

Comments

Popular posts from this blog

Binding a HTML-formatted string to a WPF WebBrowser control

Sometimes there is a need to display a HTML formatted string in a WPF application. There are a couple of ways to do this, but the most stright forward is to use a WebBrowser control and the NavigateToString method.

This approach has one big flaw, you cannot use binding to a string out of the box, but I found a great solution through Stack Overflow which adds a bindable property to the  WebBrowser control using  NavigateToString.

The following class is all that is needed to add that behavior. A new depencency property named Html is introduced to the  WebBrowser and the proper change action is performed in the OnHtmlChanged method.

public class BrowserBehavior { public static readonly DependencyProperty HtmlProperty = DependencyProperty.RegisterAttached( "Html", typeof(string), typeof(BrowserBehavior), new FrameworkPropertyMetadata(OnHtmlChanged)); [AttachedPropertyBrowsableForType(typeof(WebBrowser))] public static string GetHtml(WebBrowser browser) { …

Using Bootstrap Tooltip to show Parsley validation errors

I'm currently working on a web application using a variety of different frameworks, such as Backbone for the back-end, Bootstrap for the front-end and Parsley for client side form validation. Parsley is a really powerful validation toolkit, but it takes some tweaking to make it blend with the Bootstrap front-end. Fortunately this is a one time fix, which can be re-used all over our project.

Since there will be some custom options in our Parsley object, we can't use the default parsley-validate attribute on the form. Instead we have to initialize the validation with the jQuery syntax:

$('#my-form').parsley(parsleyOptions);
The options are were the magic happens, and in our case we have a global options object that our forms use to get the same experience all over the application. Here's what it looks like:

var parsleyOptions = {  // Sets success and error class to Bootstrap class names  successClass: 'has-success',  errorClass: 'has-error',  // Bo…

The Cornball goes to Brunch with Chaplin

Lately I've been working pretty hard on different projects but not really stumbling upon anything blogworthy. The most recent project is quite interesting though, a single page, touch friendly, web application using the latest and greatest technologies. We've ended up with using Brunch with Chaplin, which is a very neat way of setting up a Backbone based single page web project with Brunch and Chaplin.

Aside from this, I have my own little project that has lived on for almost 15 years already, The Cornball. From being a plain Windows application written i C an Win32 API, it has been ported to .NET using WPF, and is currently a Silverlight application hosted on Windows Azure.

I could not find a better time to reanimate this project and create a new web based version, touch friendly, super optimized, awesome in any way. So I did... So please follow my journey at Github. It's going to take a while, I assure you, but I already have some ground work done.

Meanwhile, check out …