Introduksjon til Unit Testing

Introduction til Unit Testing
Del
Del
Del
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert å bare $ 3. Ikke gå glipp av.

er Unit testing relativt ny i Action prosjekter. Selv FlexUnit har vært rundt på en stund det var ikke intuitivt å sette opp, og det var mange av uoverensstemmelser med dokumentasjonen. Heldig for oss, er FlexUnit nå bygget inn i Flash Builder 4. Selv om dokumentasjonen er fortsatt sparsom, vil denne opplæringen være en god primer for å sette opp en Test Suite, går over flere enheten testeksempler og viser hvordan du kjører /analysere dem.


For de av dere som ikke er kjent med enhetstesting la oss se hva Wikipedia har å si

I dataprogrammering, er enhetstesting en programvare verifikasjon og validering metode der programmere gevinster tillit til at enkelte enheter av kildekode er egnet til bruk ... Unit tester er vanligvis skrevet og drevet av programvareutviklere å sikre at koden oppfyller sin design og oppfører seg som forutsatt. - Wikipedia

I denne opplæringen vil jeg vise deg hvordan jeg satt opp noen enkle enhet tester på min Flash Camo rammeverk. Du må laste ned en kopi av Flash Builder 4 (i Beta akkurat nå) for å følge med. Også, vil du ønsker å laste ned den nyeste versjonen av Flash Camo (2.2.1) herfra

Trinn 1:. Sette opp en Unit Test Prosjekt

La oss lage et nytt prosjekt kalt < . em> UnitTestIntro

Vi må plassere vår Flash Camo SWC inn i en libs /swcs
mappe inne i vårt prosjekt:

Til slutt vil vi trenge å fortelle vårt prosjekt hvor du finner vår SWC, høyreklikk på prosjektet og gå inn i dens egenskaper. Gå til Action Build Path og velg Library Path kategorien. Klikk på Legg SWC mappe og peker til lib /swcs katalogen.

Nå som vi har alt oppsett, kan vi begynne å gjøre noen grunnleggende enhetstesting. Det er viktig å merke seg at du ikke kan gjøre enhetstesting direkte i en Flex bibliotekprosjektet. Det er ikke et problem for dette prosjektet, men hvis du ønsker å teste et bibliotek med kode hva jeg vanligvis gjør er å sette opp et nytt prosjekt (som vi gjør her) deretter koble de to prosjektene sammen og lage alle testene i det nye prosjektet.

Hvis du ikke jobber i en Flex Library prosjekt og ønsker å teste koden din kan du ganske enkelt lage dine tester i det samme prosjektet. Jeg vil foreslå å holde de to separate, på denne måten kan du tydelig se hva som er test klasser og hva er virkelige klasser. Vi skal gå inn på dette litt senere når du ser hvor vi setter opp test

Trinn 2:. Utarbeidelse en Plan

Før jeg starter noe, jeg ta en stund å finne ut nøyaktig hva jeg skal gjøre. Dette er svært viktig når du setter opp enhet tester. Denne typen utvikling kalles Test Driven Development
. Jeg tror jeg ser en annen definisjon kommer opp:

Test-drevet utvikling (TDD) er en programvare utviklingen teknikk som bruker korte utviklingsiterasjoner basert på forhåndsskrevne testtilfeller som definerer ønskede forbedringer eller nye funksjoner. Hver iterasjon produserer kode er nødvendig for å passere som iterasjon tester. Til slutt, programmerer eller team refactors koden for å imøtekomme endringer. Et sentralt TDD konseptet er at å forberede tester før koding til rette for rask tilbakemelding endringer. - Wikipedia

Siden dette er en kort intro vi kommer til å bruke en eksisterende kodebibliotek for å teste mot. Men som du bygge din egen applikasjon du bør skrive tester underveis for å bekrefte at koden fungerer og at eventuelle endringer /refactoring ikke knekke koden implementering. Her er en oversikt over de testene vi skal utføre:

Opprett en forekomst av en CamoPropertySheet

Valider at det kan analysere CSS

Test antall.. velgere fant den.

Test at CamoPropertySheet kan konverteres tilbake til en streng.

Test hva som skjer når vi ber om en velger som ikke ble funnet.

Valider avklarer en CamoPropertySheet.

Hvis du er ny til Flash Camo kan du sjekke ut introen jeg skrev (del 1 og del 2), men du kan enkelt gjøre denne opplæringen uten noen kunnskap om hvordan rammeverket fungerer. Igjen, dette er rett og slett kommer til å være et kodebibliotek for oss å teste med

Trinn 3:. Opprette Vår første test

Nå som vi har en plan for å gjøre vår testing, la oss lage vår første test. Høyreklikk på prosjektet og velg Ny > Test Case Class

Du vil nå bli presentert med veiviseren. Det bør være kjent for alle som har skapt en klasse i Flex /Flash Builder før. Her er hva vinduet ut:

La oss snakke om noen av de nye feltene i veiviseren. Vi kan starte med det faktum at superklassen er allerede fylt ut for oss: flexunit.framework.TestCase
. Du kan ikke endre dette, og sannsynligvis ikke burde. Alt dette gjør er å utvide basen test klasse fra Unit Test Framework. Neste vil du se noen boksene for kodegenerering. La alle disse merket av som standard. Endelig er det et felt for klasse vi ønsker å teste

Siden vi kommer til å teste Flash Camo sin CamoPropertySheet la oss fylle følgende verdier i skjemaet.
Navn: CamoPropertySheetTestClass til test: camo.core .property.CamoPropertySheet

Her er et skjermbilde av hvordan jeg setter opp dette:

Hit finish og vi skal ha vår første test klar for oss å legge til noen kode for å

Trinn 4. : Anatomy of a Testcase klasse

La oss ta en titt på koden Flash Builder har generert for oss:

Vi starter ut ved å ha en privat eiendom som heter classToTestRef
som er satt til verdien av vår CamoPropertySheet. Dette gjør testen for å opprette en forekomst av denne klassen og tvinger kompilatoren for å importere det når vi driver vår test.

Den neste viktig metode er Oppsett
. Det er der vi vil opprette en forekomst av vår test klasse, konfigurere den og sørge for at alt er klart for oss å utføre en test.

Den siste metoden her er Teardown
. Det er der vi vil ødelegge vår test klassen 'eksempel når testen er fullført. Dette er veldig viktig når du kjører flere tester.

Du har kanskje lagt merke til på slutten av klassen det er en annen metode som kalles testSampleMethod
som er kommentert ut. Dette er et eksempel på hvordan du ville sette opp en enkelt test.

Hver test vil være en metode vi legge til denne klassen. Når vi kjører Unit Test Harness vil den automatisk ringe alle våre metoder dynamisk, selvfølgelig starter med oppsett og etterbehandling med Teardown
.

Nå som vi har en grunnleggende forståelse av TestClass oppsett la oss se på å kjøre den

Trinn 5:. Kjøre Unit Test

Før vi kan kjøre dette vi trenger minst én test. La oss uncomment testSampleMethod
for eksempel

Når du har uncommented testSampleMethod
la oss høyreklikk på prosjektet vårt og velg Kjør som >.; Utfør FlexUnit Test.

Du skal nå se følgende vindu som ber oss om å velge hvilken test vi ønsker å kjøre.

Som du ser, dette er satt opp for når vi har mye å teste, men for nå har vi bare én testSampleMethod å kjøre. Velg Merk alt og traff OK

Etter at testen kjøres, vil nettleseren din dukker opp med følgende side:.

Hvis du går tilbake til Flash Builder du vil også se dette i den FlexUnit Resultater panelet:

Se hvor enkelt dette var å kjøre? Vi har utført vår første enheten test og allerede har vi en enkelt feil. Før vi går videre for å fikse denne feilen la oss snakke om disse to vinduer.

Nettsiden som var åpen bør lukkes automatisk, men noen ganger er det ikke. Dette er en enkel swf som utfører våre tester i Flash og utganger noen data Flash Builder leser å vise til resultater av testen. Du kan ignorere denne websiden for det meste.

FlexUnit Resultater panelet er der alle resultatene vil bli vist så vel som et sted som lar deg organisere og filtrere testen tilbakemeldinger. Vi vil gå over dette litt senere i opplæringen når vi faktisk har noe å teste

Trinn 6:. Sett opp

Før vi virkelig kan komme inn i testing vi trenger å sette opp vår test klasse. la oss legge til følgende kode i Oppsett
metode:
Var xml: XML = < css > < [CDATA [/* Dette er en kommentar i CSS-filen * /baseStyle {x: 10px; y: 10px; width: 100px; høyde: 100px; padding: 5px; margin: 10px; } BaseStyle .Button {x: 0px; y: 0px; background-color: # 000000; } #playButton {Background-color: #FFFFFF; background-image: url ('/images /full_screen_background.jpg'); } #fullScreenButton {Background-color: # FF0000; background-image: url ('/images /full_screen_background.jpg'); } #playButton: Over {background-color: # 333333; } Interaktiv {cursor: hand; }]] ≫ < /css >; rawCSS = xml.toString (); sheet = new CamoPropertySheet (); sheet.parseCSS (rawCSS);

Vi trenger også å sette opp noen egenskaper:
privat Var sheet: CamoPropertySheet; private Var rawCSS: String;

Her er hva som skjer i dette oppsettet: i rekkefølge for oss å teste våre CamoPropertySheet vi kommer til å trenge noen CSS som en streng. Normalt ville jeg legger i CSS fra en ekstern fil, men siden vi gjør en enkel test jeg bare lage en ny XML blokk og sette CSS tekst innsiden av den første noden. Normalt trenger du ikke å vikle CSS for CamoPropertySheet innsiden av XML, men når du arbeider med store strenger innsiden av redaktøren jeg synes det er enklere å bruke xml siden du kan pakke inn tekst, og den beholder noen formatering.

Neste vil du se at vi setter vår rawCSS eiendom til xml sin strengverdi. Dette konverterer xml til en streng. Deretter oppretter vi en ny CamoPropertySheet. Til slutt, forteller vi arket å analysere rawCSS.

Det er alt som er å sette opp denne klassen. Oppsettet er forskjellig for hver klasse du tester. Det er viktig å vise at vi gjør minimum for å få en klasse klar til å bli testet, og vi kan ikke teste en klasse uten verdier kan vi

Trinn 7: Vår første test
< p> La oss få rett til det. Når en CamoPropertySheet har fått analysert en css streng kan vi be om en rekke Selector navn å kontrollere alt har faktisk blitt analysert. For de som ikke er kjent med CSS sjargong, er en velger navnet på en css stil dvs. baseStyle {...}
ville ha en velger kalt baseStyle
.

I her er hva vår test vil se ut på engelsk:..


    Få en liste over velgere fra CamoPropertySheet

    Få lengden på velger rekke

    Sammenlign lengden verdi til 6 (antall vi forventer returnert)

    La oss erstatte vår testSampleMethod
    med følgende metode:.
    offentlig funksjon testParseCSS (): void {var velgere: Array = sheet.selectorNames; Var totalt: Antall = selectors.length; assertEquals (total, 6);}

    Som du ser får vi en rekke velger navn. Neste vi får samlet og presentere vår første test assetEquals
    . I neste trinn vil jeg forklare assertMethods i mer detalj, men la oss bare kjøre denne og se om testen går

    Når du kjører testen bør du se følgende i FlexUnit Resultater panel.

    Nice, vår test bestått. Vi fikk det nøyaktige antallet velgere som vi har ventet. La oss se på hva hevde tester vi kan bruke

    Trinn 8:. Påstander

    I enhetstesting vi kjører påstander. Hver påstand håndterer en bestemt type test. Her er en kort oversikt over de vanligste påstandene du vil sannsynligvis bruke.

  1. assertEquals Anmeldelser - test for å se om en verdi er lik en annen

    assertFalse Anmeldelser -. test for å se om verdien er lik false

    assertNotNull Anmeldelser -. test for å se om verdien ikke er lik null

    assertNotUndefined
    - test hvis verdien ikke er udefinert

    assertNull Anmeldelser -.. test hvis verdien er null

    assertStrictlyEquals Anmeldelser - test for å se om to verdier strengt lik hverandre

    assertTrue Anmeldelser -. test for å se om verdien er sant

    assertUndefined Anmeldelser -.. test for å se om verdien er udefinert

    Nå, før vi tester et eksempel på hver av dem la oss sette opp våre Teardown
    metode

    Trinn 9:. rive ned

    Dette kommer å være en svært kort skritt, men det er en veldig viktig en. La oss legge til følgende linje i vår Teardown
    metode etter super.tearDown () Bilde:
    ark = null;

    Hva dette egentlig gjør er å fjerne henvisningen til vår CamoPropertySheet så Garbage Collector kan fjerne det

    Du bør alltid sette opp din Teardown
    spesielt når du kjører flere test klasser eller en stor test suite

    Trinn 10:.. Assert lik

    Vi har allerede sett et eksempel på dette før i trinn 7, men la oss gå gjennom og legge til en annen assertEquals
    . Her er neste test vi skal utføre:


      Komprimer CSS tekst (fjern mellomrom, spesialtegn og andre hindringer i css parser kan ikke være i stand til å gjenkjenne) siden CamoPropertySheet komprimerer css test når automatisk det analyseres.

      Konverter CamoPropertySheet inn teksten (dette vil være en komprimert versjon av rawCSS vi brukte tidligere).

      Sammenlign at CamoPropertySheet teksten er lik vår komprimert css streng. < .no>

      For å kjøre testen, la oss legge til følgende metode:
      offentlig funksjon testToString (): void {var compressedCSS: String = "baseStyle {x: 10; y: 10; width: 100, høyde: 100; padding: 5; margin: 10;} baseStyle .Button{x:0;y:0;background-color:#000000;}#playButton{background-color:#FFFFFF;background-image:url('/images/full_screen_background.jpg');}#fullScreenButton{background-color:#FF0000;background-image:url('/images/full_screen_background.jpg');}#playButton:over{background-color:#333333;}interactive{cursor:hand;}"; assertEquals (sheet.toString (), compressedCSS);}

      Nå kjører Unit Test og sørg for at du velger begge testene fra boksene Nye tester ikke automatisk bli valgt hvis alt gikk bra skal du se en suksess.. og at 2 tester ble kjørt

      Trinn 11:.. Hevd False

      Vi kan gjøre en enkel test for å være sikker på om vi ber om en Selector som ikke eksisterer vi får en falsk verdi Her er hvordan vi skulle gjøre dette med CamoPropertySheet:


        Lag en anmodning om en velger som ikke eksisterer

        Sjekk navnet returnert velgeren er for å se om det tilsvarer "EmptySelector" -. . en konstant på PropertySelector klassen

        Assert hvis verdien er falsk

        Her er koden for å utføre testen.
        offentlig funksjon testEmptySelector (): void {var Velger: PropertySelector = sheet.getSelector ("testSelector"); Var finnes: Boolean = (selector.selectorName == PropertySelector.DEFAULT_SELECTOR_NAME) false: true; assertFalse (finnes);}

        Som du kan se, er vi bare ber om en falsk stil navn testSelector
        . Vi sjekker for å se om navn velgeren s er standardnavnet brukes når ingen velgeren er funnet. Til slutt passerer vi eksisterer variabelen til assertFalse
        metoden. Når du kjører dette bør du nå se 3 passerer til sammen en suksess

        Trinn 12:. Hevd Ikke Null

        Neste vi vil være sikker på at teksten verdien fra vår CamoPropertySheet er aldri null. La oss se på hvordan å strukturere vår test:


          samtale toString
          på vår CamoPropertySheets forekomst og test for å se om det ikke er null

          Her er vår testmetode:
          offentlig funksjon testCSSValue (): void {assertNotNull (sheet.toString ());}

          Dette er ganske rett frem, så når du kjører testen vi skal nå ha 5 suksesser. Hver gang vi kjører testen kan vi sjekke for å se navnene på våre metodetester ved å klikke på mappen Standard Suite vår FlexUnit Resultater Panel tilbake i Flash Builder

          Trinn 13:. Hevd Ikke Undefined

          I dette neste test skal vi følge opp på den tomme velgertest for å verifisere at alle velger har en selectorName
          .


            Få en velger som ikke eksisterer.

            Få en velger som ikke eksisterer

            Test for å se om begge velgere navn ikke er udefinert

            Her er en testmetode:..
            offentlig funksjons testSelectorsHaveNames (): void {var selectorA: String = sheet.getSelector ("testSelector") selectorName;. Var selectorB: String = sheet.getSelector ("baseStyle") selectorName;. assertNotUndefined (selectorA, selectorB);}

            De to første linjene er selvforklarende; vi bare be om to velgere og en som vi vet ikke eksisterer. Når vi gjør det hevde men du vil legge merke til vi kjører i to verdier i stedet for den vanlige ene vi har gjort frem til dette punktet. Dette er ikke et unikt eksempel, i virkeligheten hver av de Assert metodene gjør det mulig å passere i hvilket som helst antall verdier som skal testes. Her er vi rett og slett sørge for at selectorA og selectorB ikke er udefinert

            Trinn 14:. Hevd Strengt lik

            Her er et eksempel på hvordan man strengt sammenligne to stedene. Her bruker jeg strenger som kanskje ikke er den beste bruken av dette eksempelet, men det er godt å se testen i aksjon. Hva skal vi gjøre?


              klone CamoPropertySheet.
            1. Test at strengen verdien av vår CamoPropertySheet er lik verdien av en klonet CamoPropertySheet.
              offentlig funksjon testClone (): void {var klone: ​​CamoPropertySheet = sheet.clone () som CamoPropertySheet; assertStrictlyEquals (sheet.toString (), clone.toString ());}

              Som du ser vi kaller klone metoden i CamoPropertySheet å få tilbake en eksakt kopi av PropertySheet. Neste vi kjøre det gjennom hevde test ved å ringe toString
              metoden på hver. Hvis den returnerte CSS testen er den samme vi har en suksess for test

              Trinn 15:. Hevd Sann

              Nå ønsker vi å teste at når vi ber om en velger, har en egenskap vi forventer. Her er testen:..


                Be om baseStyle
                velger

                Test for å se om velgeren har egenskapen x


                Her er en testmetode:
                offentlig funksjon testSelectorHasProperty (): void {var Velger: PropertySelector = sheet.getSelector ("baseStyle"); assertTrue (selector.hasOwnProperty ("x"));}

                Som du kan se her vi venter vårt baseStyle
                velgeren å ha x eiendommen. Hvis dette finnes kan vi anta at det var riktig analysert fra CSS strengen. Siden det foreligger vi har passert denne testen.

                Hver av disse testene blir selvforklarende for hvordan du implementerer dem. La oss se nærmere på hva som skjer når vi ikke klarer en test i løpet av de neste to trinn

                Trinn 16:. Hevd Undefined

                Vi kommer til å teste for udefinert nå, men Flash Camo har blitt designet for å ikke returnere udefinert. Så følgende test vil mislykkes. La oss se nærmere på hva vi kommer til å teste for.


                  Ring klart metoden på CamoPropertySheet.
                1. Test for å se om du ringer toString
                  vil returnere udefinert .

                  Her er koden for testen:
                  offentlig funksjon testClear (): void {sheet.clear (); assertUndefined (sheet.toString ());}

                  Nå la oss kjøre denne testen og gå til neste trinn for å diskutere resultatene

                  Trinn 17: Sviktende A Test

                  Hvis du gjorde. forrige trinn og løp enheten testen, bør du se følgende i FlexUnit Resultater panelet:

                  Legg merke til hvordan vi har en svikt fra vår testClear
                  metode

                  Hvis? du dobbeltklikker på den mislykkede testen i testresultater panelet du vil hoppe til kilden av testen som mislyktes. Dette er en fin måte å korrigere feil eller endre testen slik at den ikke mislykkes. Det er ikke mye mer å mislykkes en test da dette. Hver test som svikter vil dukke opp i dette panelet, kan du fortelle panelet for å kun vise mislykkede tester ved å klikke på det røde utropstegn over hvor den forteller deg hvor mange feil du hadde.

                  Nå som vi har feilet denne testen erstatte det med følgende:
                  offentlig funksjon testClear (): void {sheet.clear (); assertEquals (sheet.toString (), "");}

                  Hvis du kjører testen på nytt vil du se at det vil passere. Nå har 7 av 7 bestått testene, og denne klassen er vellykket jobbet. La oss snakke om å sette opp enheten tester for dine egne klasser

                  Trinn 18:. Auto Genera Test Classes

                  Frem til dette punktet har vi testet en ferdigbygd bibliotek, men du kan være interessert i hvordan dette vil fungere på dine egne klasser. Vi kommer til å endre doc klassen litt deretter kjøre en tilpasset enhet test på den. For å komme i gang, erstatte all koden i UnitTestIntro klassen med følgende:
                  pakke {import flash.display.Sprite; public class UnitTestIntro strekker Sprite {private Var _firstName: String; private Var _lastName: String; private Var _loggedIn: Boolean; offentlig funksjon UnitTestIntro () {_firstName = "Jesse"; _lastName = "Freeman"; } Offentlig funksjon får fornavn (): String {return _firstName; } Offentlig funksjon får lastname (): String {return _lastName; } Offentlig funksjon isLoggedIn (): Boolean {return _loggedIn; }}}

                  Når du har koden på plass, høyreklikker du på UnitTestIntro Hotell og velg New > Test Case Class. Hvis du ser på veiviseren denne tiden vil du se alle feltene er fylt ut for oss:

                  Denne gangen, i stedet for å klikke Finish, traff neste og se på følgende vindu:

                  Her kan du velge alle de offentlige metoder i den klassen for å teste. Legg merke til hvordan våre kundeskaffere for fornavn og etternavn er ikke en del av denne listen. Enhetstesting kan bare utføres på offentlige metoder. Dessuten vil du se hver arvet metode i klassen så vi har Sprite /Displayobject metoder her siden vår doc klasse strekker Sprite. Velg isLoggedIn Hotell og treffer finish.

                  Hvis du blar ned til bunnen av den nye testen klassen som nettopp ble generert du får se det automatisk har lagt inn en Testmetode for isLoggedIn.

                  Når du skal teste din egen kode Flash Builder kan hjelpe automatisere prosessen med stillaser testene. Dette er en stor hjelp når du arbeider med store klasser som har mange metoder

                  Trinn 19:. Best Practices

                  Nå bør du ha en solid forståelse av hvordan Unit Testing i Flash Builder fungerer. Du kan selv være klar til å begynne å sette opp din egen test. Det er mange ting jeg ikke var i stand til å dekke i denne korte opplæringen så her er noen ting å huske på når du oppretter testene.

                2. Hold koden din liten og lett etterprøvbar. Lage korte metoder, bryte koden ned i "enheter" for å hjelpe lette testing. Det er ok å ha massevis av metoder i klassene. Ikke bare gjør det hjelpe deg når enhetstesting, men også når utvide klasser og håndtere arv altoverskyggende.
                3. Test en atferd og ikke en metode. Denne opplæringen viste deg hvordan jeg ville samhandle med forekomst av CamoPropertySheet. Jeg var testing atferdsresponser for den underliggende parsing /gjenfinningssystem. Pass på at du ikke tester som fungerer bare returnere verdier, men at den underliggende logikken er riktig. Gjorde noe bli analysert, gjorde de avhengige metoder gjør hva de var forventet å gjøre?
                4. Hold test navnene rent. Du bør være i stand til enkelt å forstå hva som skjer ved å se på navnet på testmetode. Husk denne koden er ikke kompilert inn i din endelige søknaden så hvis du har utrolig lange metodenavn, det er ok så lenge de er beskrivende.
                5. Ikke stol på konsollen vinduet for testen. Dette betyr at du bør ikke forvente en utvikler å se spor utganger for å se om testen fungerer som den skal. I stedet gjør testen mislykkes eller lykkes og ikke ut sine resultater.
                6. Gjør et søk etter Unit Testing på andre språk for å se hvordan det har blitt implementert andre steder. Også plukke opp en bok om Test Driven Development (TDD).

                  Konklusjon

                  Som du kan se, sette opp Unit Testing er veldig enkelt, men lage applikasjoner kretser rundt Test Driven Development er en kunstform i seg selv. Forhåpentligvis etter denne introen vil du være komfortabel å sette opp en enkel test for å bekrefte at koden fungerer som forventet. Som du stole mer og mer på enhetstesting antall feil i koden din vil dramatisk gå ned. Så lenge du husker å kode mot passerer en test, holde dine metoder små og validere din enhet tester ofte, vil du være godt på vei til å bygge mer stabil kode.

                  Takk for lesing. Anmeldelser