NUnit  

NUnit er et simpelt, men særdeles effektivt testværktøj. Er du .NET udvikler, bør du kende til dette værktøj.

Siden softwareudviklingsmetoden eXtreme Programming (XP) kom frem i 1999, har den fået mere og mere omtalte, og i det seneste års tid har også de danske softwareudviklere for alvor taget det til sig. I dag arbejder mange softwareudviklingsteams med alle eller mange af elementerne fra XP. Flere af de 12 dicipliner omhandler tests, og test-først programmering er en grundsten i XP. For at kunne anvende test-først programmering og automatisering af tests kræves et værktøj.

NUnit er dette værktøj - et forholdsvis simpelt testværktøj. NUnit er en direkte "udløber" af JUnit (til java), det oprindelige unit-test værktøj. JUnit var oprindeligt lavet af Kent Beck og Erich Gamma henholdsvis XP's "fader" og en af de fire forfattere bag design patterns. NUnit er en portering til .NET og i den nyeste version er den i høj grad tilpasset .NET, bl.a. udnyttes attributter intensivt.

Den superkorte user guide

For at lave en automatisk test med NUnit skal du oprette en testklasse, der indeholder en eller flere testmetoder. Her er et eksempel på en testmetode, det er fra et reelt projekt - Captators Calculus komponent. Calculus er en slags lommeregner/udtryksevaluator, hvor man kan angive et matematisk udtryk (som en streng). For at få beregnet udtrykket er der to skridt: Først valideres udtrykket - hvis det kan valideres (dvs. der ingen syntaksfejl eller ukendte funktioner er) - og derefter kan man foretage beregningen. For at afgøre om Calculus fungerer på et meget simpelt udtryk skal man således checke, om der returneres true i det første skridt (altså at syntaksen er ok) og i det andet skridt skal man undersøge, om udregningen giver den rigtige værdi:

  <TestFixture()> Public Class CalculatorDoubleAndIntegerResultTester

    Private valError As New Captator.Eifos.Calculus.Calculator.ValidationError()

    <Test()> Public Sub SimpleExpression()
      Dim evaluator As New Captator.Eifos.Calculus.Calculator(Calculator.TypeDef.AsDouble)
      
      Assertion.Assert(evaluator.ValidateExpression("100 + 2", valError))
      Assertion.AssertEquals(102, evaluator.CalculateIntegerResult(valError))
    End Sub
  End Class

Eksempel 1 - Et NUnit eksempel, en testklasse med en testmetode

NUnit arbejder ud fra en assembly. Når assemblyen loades, scanner NUnit assemblyen igennem for klasser, der er erklæret med attributten <TestFixture()>. Når den har fundet en testfixture, så scannes denne klasse igennem for metoder med attributten <Test()> - hver af disse metoder betragtes som en selvstændig test.

Tests i NUnit har for det meste et udseende som vist i eksempel 1. Først oprettes det/de objekter, hvorpå testen skal foretages. Herefter kaldes de metoder, der skal testes, og slutteligt checkes, om det forventede resultat stemmer overens med det den testede funktion returnerer.

Start NUnit-GUI applikationen og udpeg den assembly, hvori testene ligger. Herefter scanner NUnit assemblien og bygger et tree-view op udfra de klasser, der er <TestFixture()>'s og deres testmetoder. Træet ordnes efter namespaces på de enkelte klasser. I eksemplet herunder er testen SimpleExpression i klassen CalculatorDoubleAndIntegerResultTester (der ligger i namespacet Captator.Eifos.Calculus.Test). I eksemplet er metoden SimpleExpression testet. Som det ses af den grønne farve, gik testen godt.

Test-først programmering

Når du har lært at lave NUnit test, kan du opnå fordelen ved at benytte NUnit - nemlig de automatiske teste. Ved at automatisere tests kan de afvikles igen og igen og igen. Derved kan du, hver gang du har lavet en ny stump kode, køre alle tests og forsikre dig om, at du ikke har indført nogle følgefejl. Det er virkelig en utrolig dejlig fornemmelse! 

Test-først programmering handler om at benytte tests meget aktivt, når der kodes. Som navnet antyder så skrives testen først - og hermed menes - FØR selve den kode, der skal testes! Test-først programmering er en diciplin, som kan være svær at forholde sig til, medmindre man har prøvet det på "egen krop". Captator er i gang med at lave en tutorial, der step for step gennemgår et eksempel, så "stay tuned".

Hvordan kommer jeg videre

Find henvisninger til download af NUnit under Diverse Downloads på vores essentielle .NET download side (en side med alle de .NET downloads vi er stødt på og har ment var relevante for de fleste .NET udviklere).

Hvis du vil har kommentarer til denne artikel eller vil vide mere om brugen af NUnit, best practices mv. så kontakt Captator: juel@captator.dk.