tisdag, oktober 02, 2007

NUnit Asserts i VS2008 unit testing

Med NUnit 2.4 så kom möjligheten att använda en ny modell för hur man hanterar Asserts, en Constraint-baserad modell. Tidigare var man tvingad att använda olika asserts beroende på vad man vill testa (som t ex Assert.IsTrue() eller Assert.AreEqual) men nu kan man istället använda sig av Assert.That(). En av överlagringarna i Assert.That tar ett Constraint-objekt som inparameter. Constraint-objekt ligger i ett eget namespace i nunit.framework.dll som heter NUnit.Framework.Constraints.

Utöver det så finns även ett namespace som heter NUnit.Framework.SyntaxHelpers. SyntaxHelpers innehåller en klass som heter Is (eller Iz för VB.Net) och alla metoder i Is returnerar ett object av typen Constraint.

Detta gör att man kan skriva asserts av typen:

Assert.That(strMyName, Is.EqualTo("Björn Eriksen").IgnoreCase);

eller

Assert.That(11111.3, Is.EqualTo(11111.31).Within(0.1));

eller

Assert.That(50, Is.Not.EqualTo(100));





Det här sättet att skriva asserts tycker jag är väldigt trevligt och man saknar det snabbt om man måste gå tillbaka och skriva på det "gamla" sättet.

I Visual Studio 2008 finns inte något inbyggt stöd för att använda constraints-baserade asserts men det är ju onekligen en trevlig IDE att använda för unit testing så vad gör man...?

Det man kan göra är att använda NUnit constraints based asserts i Visual Studios unit testing-ramverk!

För att få till det hela på ett smidigt sätt så måste man plocka bort using-referensen till Microsoft.VisualStudio.TestTools.UnitTesting; och ersätta den med:

using NUnit.Framework;

using NUnit.Framework.SyntaxHelpers;




Anledning till detta är att klassen Assert finns med i både NUnit.Framework och i Microsoft.VisualStudio.TestTools.UnitTesting, så kompilatorn vet inte vilken den ska välja. För enkelhetens skulle bör man därför plocka bort using-referensen till Microsoft.VisualStudio.TestTools.UnitTesting istället för den till NUnit. Då blir det enklare när man ska skriva Asserts i sina test-metoder.

Effekten blir då den att, för attribut och typer som man ska referera från Microsofts test-ramverk så måste man ha kompletta sökvägar t ex:

[Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod()]



I och med Visual Studio 2008 så kommer unit testing att vara med i Professional-versionen och förhoppningsvis leder det till att det blir enklare att införa unit testing i projekten!

Inga kommentarer: