Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Maj 2003Unit tests i.NET – på vejen mod færre fejl !1 Carsten Juel Andersen Softwarearkitekt Mobil: 2348 0003 Captator Tlf: 8748 0202.

Lignende præsentationer


Præsentationer af emnet: "Maj 2003Unit tests i.NET – på vejen mod færre fejl !1 Carsten Juel Andersen Softwarearkitekt Mobil: 2348 0003 Captator Tlf: 8748 0202."— Præsentationens transcript:

1 maj 2003Unit tests i.NET – på vejen mod færre fejl !1 Carsten Juel Andersen Softwarearkitekt juel@captator.dk Mobil: 2348 0003 Captator Tlf: 8748 0202 www.captator.dk NUNU

2 maj 2003Unit tests i.NET – på vejen mod færre fejl !2 Agenda Indledning Fra test som et nødvendigt onde til noget bedre Kort om eXtreme Programming Historien bag NUnit Automatisering af unit tests med NUnit NUnit introduktion og demo af automatiske tests med NUnit NUnit users guide Test-først programmering Test-først, simpelt design og refactoring Via demo anskueliggøres disse principper NUnit guidelines og ideer Test af applikationer, komponenter mv. Todo’s / forslag til forbedringer af NUnit

3 maj 2003Unit tests i.NET – på vejen mod færre fejl !3 Test-først og automatiske test Fra test som et nødvendigt onde Test i kodefase ofte overfladiske og ikke repeterbare ► følgefejl, frygt ved større rettelser Verificerende tests ofte noget, der ligger som en afsluttende aktivitet ►for sent at lave gennemgribende ændringer Til Automatiske test, der giver ro i sindet Repeterbare tests, så testen igen og igen kan afvikles og sikre mod følgefejl og test-først som design redskab fra design, kod, test til design med test, kod, udfør tests

4 maj 2003Unit tests i.NET – på vejen mod færre fejl !4 Fra JUnit til NUnit 2.0 Kent Beck og Eric Gamma “opfinder” JUnit JUnit porteres til mange sprog, og “open sourced” NUnit - en blandt mange “ports” til.NET NUnit 2.0 udnytter.NET features

5 maj 2003Unit tests i.NET – på vejen mod færre fejl !5 NUnit 2.0 – Et testværktøj Keep the bar green to keep the code clean... Citat fra www.junit.org

6 maj 2003Unit tests i.NET – på vejen mod færre fejl !6 Et eksempel – unittest af Calculus Calculus er en “slags lommeregner” Et matematisk udtryk indtastes som en tekststreng Det parses for fejl Hvis udtrykket ikke indeholder fejl, så beregnes resultatet

7 maj 2003Unit tests i.NET – på vejen mod færre fejl !7 Et eksempel – unittest af Calculus Imports NUnit.Framework Namespace Calculus.Test Public Class CalculatorDoubleAndIntegerResultTester Private valError As New Calculator.ValidationError() Public Sub AddAndSubExpression() Dim calc As New Calculus.Calculator() Assertion.Assert(calc.ValidateExpression("100 + 1 - 4 + 13-1", valError)) Assertion.AssertEquals(100+1-4+13-1, calc.CalculateIntegerResult(valError)) End Sub Public Sub ConstantsPropertyMethods()... calc.Constants.Add("const1", 10.0) Try calc.Constants.Add("const1", 20.0) Assertion.Fail() Catch ex As System.ArgumentException ' This should occur End Try... Imports NUnit.Framework Namespace Calculus.Test Public Class CalculatorDoubleAndIntegerResultTester Private valError As New Calculator.ValidationError() Public Sub AddAndSubExpression() Dim calc As New Calculus.Calculator() Assertion.Assert(calc.ValidateExpression("100 + 1 - 4 + 13-1", valError)) Assertion.AssertEquals(100+1-4+13-1, calc.CalculateIntegerResult(valError)) End Sub Public Sub ConstantsPropertyMethods()... calc.Constants.Add("const1", 10.0) Try calc.Constants.Add("const1", 20.0) Assertion.Fail() Catch ex As System.ArgumentException ' This should occur End Try... Eksempel på hvordan der testes for, om fejlsituationer resulterer i den forventede fejl Først parses udtrykket. ValidateExpression returnerer true, hvis det gik godt Derefter checkes om Calculus regner rigtigt

8 maj 2003Unit tests i.NET – på vejen mod færre fejl !8 NUnit 2.0 NUnit loader én assembly af gangen (.dll eller.exe) Finder alle TestFixtures Opbygger træstruktur af alle tests udfra namespace Afvikler den valgte test og alle i de underliggende namespaces Træet viser alle tests i assemblien Her vises fejl (exceptions), hvilke tests der er udeladt m.m.

9 maj 2003Unit tests i.NET – på vejen mod færre fejl !9 Attributter i.NET Et lille.NET sidespring... Attributter Extra meta-data om typer og members i det kompilerede program Typesikker, declarativ styring af funktionalitet (semantik) Angives i i VB og i [... ] i C# Kan angives på assemblies, klasser, metoder, properties, … Bruges af kompileren, CLR, værktøjer,... Eksempler: AssemblyInfo.vb, Obsolete, Transaction, WebMethod,... Egne attributter... NUnit benytter sig af Attributter

10 maj 2003Unit tests i.NET – på vejen mod færre fejl !10 NUnit 2.0 – brug af attributter Brug af attributter En klasse skal være en TestFixture for at NUnit leder efter tests i den Setup kaldes inden hver enkelt test Teardown kaldes efter hver enkelt test Ignore kan bruge til midlertidig at sætte en test ud af kraft (gul bar i stedet for grøn) Public Class CalculatorDoubleAndIntegerResultTester... Public Sub PrepareTest()... Public Sub DeallocateTestData()... Public Sub AddAndSubExpression()... Public Sub TestException()... Public Sub AnotherTest()...... Public Class CalculatorStringResultTester... Public Class CalculatorDoubleAndIntegerResultTester... Public Sub PrepareTest()... Public Sub DeallocateTestData()... Public Sub AddAndSubExpression()... Public Sub TestException()... Public Sub AnotherTest()...... Public Class CalculatorStringResultTester...

11 maj 2003Unit tests i.NET – på vejen mod færre fejl !11 Alt kan testes... Pocket PC applikation Kør den som Windows app, og test den her Eksempel – Dam spil til Pocket PC (og windows) Eksterne resourcer DB – lav en test DB Hardware – lav en simulator og test op mod den

12 maj 2003Unit tests i.NET – på vejen mod færre fejl !12 XP’s programmings praktikker Fortløbende integration Test 37-timers arbejdsuge Kode standarder Programmering i par Kollektivt ejerskab Kunde involvering ”The Planning Game” Simpelt design Refaktorering Kort tid mellem releases Metafor Kort tid mellem releases Test Programmering Team praktikker Proces

13 maj 2003Unit tests i.NET – på vejen mod færre fejl !13 Refactorering Refactoring is the process of changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure. It is a disciplined way to clean up code that minimizes the chances of introducing bugs. In essence when you refactor you are improving the design of the code after is has been written Martin Fowler

14 maj 2003Unit tests i.NET – på vejen mod færre fejl !14 Refactoring eksempel – Extract Method En af de simpleste og hyppigst anvendte refactoreringer er Extract Method Motiv Der er et kode fragment, der kan grupperes Løsning Lav fragmentet til en metode, hvis navn forklarer hvad formålet med kode fragmentet er void printOwning(double amount) { printBanner(); // print details System.out.println(“name :” + _name); System.out.println(“amount:” + amount); } void printOwning(double amount) { printBanner(); // print details System.out.println(“name :” + _name); System.out.println(“amount:” + amount); } void printOwning(double amount) { printBanner(); printDetails(amount); } void printDetails(double amount) { System.out.println(“name :” + _name); System.out.println(“amount:” + amount); } void printOwning(double amount) { printBanner(); printDetails(amount); } void printDetails(double amount) { System.out.println(“name :” + _name); System.out.println(“amount:” + amount); }

15 maj 2003Unit tests i.NET – på vejen mod færre fejl !15 Refaktorerings katalog “Refactoring – Improving the Design of Existing Code” beskriver et katalog af 72 refaktoreringer Der er beskrevet et motiv og en løsning for hver Ofte går en refaktorering begge veje alt efter omstændighederne ex: Pull Up Field kontra Push Down Field Eksempler fra bogen Collapse Hierarchy, Encapsulate Field, Extract Class, Inline Class, Introduce Assertion, Introduce Null Object, Move Field, Move Method, Pull Up Field, Push Down Field, Replace Constructor with Factory Method, Replace Inheritance with Delegation, Replace Magic Number with Symbolic Constant

16 maj 2003Unit tests i.NET – på vejen mod færre fejl !16 Unit tests – ”The short story” Sikkerhed, tiltro og MOD til at lave ændringer i designet Udviklerne skriver unit tests (hele tiden) Før en funktion skrives (test-first programming) Interface til metode er uklart Implementation/algoritme formodes (lidt) indviklet Usædvanlig måde at benytte metoden på (testen kommunikerer brugen) Senere Når der findes en fejl isoleres den i en test Ved refactoreringer af et område der ikke har tilstrækkelige tests Alle tests skal kunne afvikles på nogle få minutter Enhver funktionalitet uden test eksisterer ikke...

17 maj 2003Unit tests i.NET – på vejen mod færre fejl !17 Test-først cyklus: Design / Test / kod... Skriv den simplest mulige test Prøv testen og se at den fejler Implementer kun lige nok til at kunne compilere Foretag Refactorering for at fjerne duplikeret kode etc. Implementer kun lige nok til at testen går godt Compilér – det fejler, hvis du endnu ikke har implementeret koden, som testen kalder Prøv testen og se at den nu går godt Lav et ”overordnet” design

18 maj 2003Unit tests i.NET – på vejen mod færre fejl !18 Test-først eksempel - DEMO Opgave: Lav en metode Der lægger beløb sammen og returnere det i danske kroner Vi har en klasse – MonetaryAmount, der repræsenterer et beløb Namespace MoneyDemo Public Enum Currency DKK = 1 EUR... End Enum Public Class MonetaryAmount... Public Property Amount() As Integer... Public ReadOnly Property Currency() As Currency... Public Sub New(ByVal amount As Integer, ByVal currency As Currency)... Public Overloads Function Equals(ByVal obj As Object) As Boolean... Public Overrides Function GetHashCode() As Integer... Public Overrides Function ToString() As String...... Namespace MoneyDemo Public Enum Currency DKK = 1 EUR... End Enum Public Class MonetaryAmount... Public Property Amount() As Integer... Public ReadOnly Property Currency() As Currency... Public Sub New(ByVal amount As Integer, ByVal currency As Currency)... Public Overloads Function Equals(ByVal obj As Object) As Boolean... Public Overrides Function GetHashCode() As Integer... Public Overrides Function ToString() As String......

19 maj 2003Unit tests i.NET – på vejen mod færre fejl !19 Guideline: Test af applikationer og komponenter Applikation (.exe assembly) Komponent X (.dll assembly) Komponent Y (.dll assembly) Komponent Z (.dll assembly) X Tester (.dll assembly) Y Tester (.dll assembly) Z Tester (.dll assembly)

20 maj 2003Unit tests i.NET – på vejen mod færre fejl !20 Guideline: Test af applikationer og komponenter Test af en applikation (.exe assembly) Man kan ikke lave en anden.exe eller.dll, hvori testene ligger... (Det kan man godt i.NET, men Visual Studio understøtter det ikke) Det er ikke noget problem, fordi andre typisk ikke tilgår ens.exe assembly Placer TestFixtures i selvstændige klasser i.exe assembly’en Test af en komponent (.dll assembly) Her vil testklasser være med til at gøre komponentens interface unødigt komplekst Lav en seperat.dll assembly, hvori TestFixtures ligger I begge tilfælde Placer tests af en klasse i et test sub-namespace, eksempel: Test af “Captator.Calculus.Calculator” placeres i “Captator.Calculus.Test.CalculatorTest”

21 maj 2003Unit tests i.NET – på vejen mod færre fejl !21 NUnit – the good, the bad and...  /  NUnit kan køres fra Visual Studio Mulighed for debugging  (bortset fra uncaught exceptions  ) Men så skal man hele tiden skifte startup projekt  og det kan kun lade sig gøre fra.dll komponenter, ellers skal man ind og rette i project-properties hele tiden !  NUnit kan køres som extern applikation Hurtigere reload, lav en build og afvikl test umiddelbart herefter , ingen debugging  Anbefaling: Hav NUnit kørende som extern app, når du skal debugge så attach NUnit til VS debuggeren

22 maj 2003Unit tests i.NET – på vejen mod færre fejl !22 NUnit – the good, the bad and...  /  Pt. er det lidt besværligt at lave unit tests “the XP way” med NUnit Hurtigt skift mellem tests af få fixtures til applikations-wide tests Test pr. assembly, ingen hjælp til at lave tests af komplet projekt / solution 

23 maj 2003Unit tests i.NET – på vejen mod færre fejl !23 Spørgsmål www.captator.dk www.captator.dk nyheder, artikler, information,...

24 maj 2003Unit tests i.NET – på vejen mod færre fejl !24 Nunit / XUnit referencer NUnit – Lidt dokumentation samt download http://www.nunit.org XP test framework for Java – JUnit http://www.junit.org Andre XUnit frameworks http://www.xprogramming.com/software.htm Extreme Testing Ron Jeffries, Software Testing & Quality Engineering, V1I2, March/April 1999, pp 22-27., http://www.xprogramming.com/software_testing.htm Simple Smalltalk Testing: With Patterns Kent Beck, original artikel om XP test. http://www.xprogramming.com/testfram.htm JUNIT: A Cook’s Tour Erich Gamma & Kent Beck; Java Report, Maj 1999

25 maj 2003Unit tests i.NET – på vejen mod færre fejl !25 Web XP ressourcer Ward Cunninghams Wiki om XP http://c2.com/cgi/wiki?ExtremeProgrammingRoadmap Ron Jeffries XP site http://www.xprogramming.com Don Wells XP site http://www.extremeprogramming.org Object Mentor http://www.objectmentor.com Martin Fowler http://martinfowler.com Agile Alliance http://www.agilealliance.org


Download ppt "Maj 2003Unit tests i.NET – på vejen mod færre fejl !1 Carsten Juel Andersen Softwarearkitekt Mobil: 2348 0003 Captator Tlf: 8748 0202."

Lignende præsentationer


Annoncer fra Google