PUG Norway – 12. nov 09Thomas Skjørten / Jan Kolstad
Agenda Kort reprise fra PUG Årsmøte 2009 Hva er automatisk bygging (Build)? Automatisk testing (unittesting) i OpenEdge
Det komplette utviklingsmiljø Moderne verktøyer for å styre alle deler av utviklingsprosessen. Utviklingsverktøy Kildekodekontroll Oppgavehåndtering Dokumentasjon Kvalitetessikring Build På tvers av teknologi Støtter alle roller i utviklingen
Verktøyer i bruk OE Architect (Eclipse) Teamprise Client Suite Microsoft Visual Studio Microsoft Team Foundation Server Microsoft Office
Automatisk bygging Egen prosess for bygging av programvare Kompilering av kildekode Automatisk testing for å sikre kvalitet Generering basert på ferdigkompilert kildekode ProxyGen Pakking av programvare (.pl) Installasjonspakker Kjøres alltid basert på innsjekket kildekode Kjøres basert på events (tidspunkt, innsjekking) eller manuelt
Automatisk bygging Svært nyttig ved utvikling i team (>1 person) Nødvendig ved smidig utvikling Kode bygges uavhengig av maskinoppsett Rask tilbakemelding til utviklere om deres endringer er i konflikt med andres Sikrer kvaliteten i alle endringer Forenkler deployment / release
Automatisk bygging - visualisering
Unittesting Kompilering sikrer at koden har rett syntaks Unittesting sikrer at koden gjør det den skal Sikrer kvaliteten i applikasjonen Hindrer at endringer får uønskede konsekvenser Sikkerhetsnett for endringer i hele applikasjonens levetid
Hva er en unittest? Kode som tester kode En prosedyre / metode som kaller en eller flere andre prosedyrer / funksjoner med forskjellige parametere for å sjekke at resultatet er som forventet. function GetUkeNrForDato returns int private (dato as date): def var oUke as int no-undo. if dato <> ? then assign oUke = (((dato - date(1,1,year(dato)) + 1) + ((weekday(date(1,1,year(dato))) + 5) mod 7) ) - ((weekday(dato) + 5) mod 7 + 1) - 1 ) / oUke = if weekday(date(1, 3, year(dato))) <= 3 then (if oUke = 1 then 53 else oUke - 1) else oUke. return oUke. end function. /* Tester funksjonen GetUkenrForDato */ PROCEDURE testGetUkenrForDato: def var ukenr as int no-undo. ukenr = GetUkeNrForDato(date(11,1,2009)). RUN assertEqualsInt(ukenr, 44). ukenr = GetUkeNrForDato(date(1,1,2009)). RUN assertEqualsInt(ukenr, 1). ukenr = GetUkeNrForDato(date(12,31,2009)). RUN assertEqualsInt(ukenr, 53). ukenr = GetUkeNrForDato(date(12,24,2009)). RUN assertEqualsInt(ukenr, 52). END.
Regler for en unittest Skal teste så konkrete ting som mulig Må være rask Være helt uavhengig av andre tester Tester skal kunne kjøres i en hvilken som helst rekkefølge Skal ikke være avhengig av eksterne ressurser Database Filsystem
Utfordringer Testbarhet er tett knyttet opp mot arkitektur Ikke tilrettelagt arkitektur kan gjøre unittesting umulig Avgrensning av testene Uavhengighet fra eksterne ressurser De fleste systemer er veldig datadrevne (CRUD), hvordan teste dette uten å ha tilknytning til databasen?
Unittesting i Progress Både prosedyrisk og objektorientert kode kan testes OO er ofte enklere fordi arkitekturen og ansvarsfordelingen er mer definert Krever et rammeverk for kjøring av testene ProUnit (Open source) Prosedyrisk Kjøres stand-alone OEUnit (Open source) Objektorientert Integreres i Eclipse Punit (Open source)
Oppsummert Med Eclipse, TFS og Teamprise har vi nå et komplett moderne miljø for Progressutvikling Automatisk bygging svært nyttig ved arbeid i team Unittesting sikrer kvaliteten i det vi lager både under utvikling og i framtiden
Linker Microsoft TFS us/teamsystem/default.aspx us/teamsystem/default.aspx Teamprise ProUnit OEUnit Punit