FluentAutomation Et automatiserings-rammeverk for regresjonstesting (og mye annet! )
Om meg Thomas Fjelde Krog, thomas.fjelde.krog@bouvet.no Bor på Jørpeland Ansatt i Bouvet siden mars 2012 Utvikler i prosjektet TaxiFinans Faglig støtte: Arne Kristian Jansen, arne.jansen@bouvet.no, samme prosjekt 2
Om TaxiFinans Regnskapsapplikasjon for taxisentraler Turtransaksjoner fakturaer/utbetalinger regnskapsjournaler Nyutvikling av gammel løsning ca. 4-5 utviklere pågått siden høsten 2011 Vi tester & regresjonstester stort sett selv ASP.NET MVC 4 EF 5, Code First Migrations NServiceBus 4 Bootstrap Git TeamCity Octopus Deploy 3
Om FluentAutomation Wrapper rundt Selenium WebDriver (seleniumhq.org) eller WatiN (watin.org) Fluent syntaks Støtter de fleste nettlesere: IE (32/64), Chrome, Firefox, Safari, Android (eksperimentell), ipad (eksperimentell), iphone (eksperimentell), PhantomJS (eksperimentell) Kjører «synlig» eller «usynlig», støtter screenshot Kan kjøres remote; kan skriptes Ganske konfigurerbar Finnes på NuGet: install-package FluentAutomation.SeleniumWebDriver install-package FluentAutomation.WatiN Testing bare én av mange funksjonsområder, kan generelt brukes til å utføre alle slags repetitive ting i en nettleser Anbefalt lesestoff: søk på FluentAutomation Doc 4
Om Selenium Sender kommandoer til nettleseren om handlinger som skal utføres Bruker nettleserens native kommandoer (API). Oppsummering hentet fra seleniumhq.org/docs: Selenium-WebDriver makes direct calls to the browser using each browser s native support for automation. How these direct calls are made, and the features they support depends on the browser you are using. Information on each browser driver is provided later in this chapter. For those familiar with Selenium-RC, this is quite different from what you are used to. Selenium-RC worked the same way for each supported browser. It injected javascript functions into the browser when the browser was loaded and then used its javascript to drive the AUT within the browser. WebDriver does not use this technique. Again, it drives the browser directly using the browser s built in support for automation. Støtte for utvikling i flere språk, bl.a. Java og C# Anbefalt lesestoff: seleniumhq.org 5
Om FluentAutomation API Gir tilgang til hele DOM'en Lettforståelige og ensartede signaturer: tar typisk inn selector (streng), «ElementProxy» og/eller sidekoordinater Støtter både CSS- og jquery-selector-syntaks «PageObject» Egne metoder for assertion, som enten logger assertion-feil eller kaster exception direkte Kan asserte på veldig mye, f.eks. eksistens av elementer, CSSklasser, attributter eller tekst, eller på en egendefinert funksjon som igjen bruker kan bruke API et og som returnerer true/false Mange av metodene har en implisitt «vent/prøv på nytt»-funksjon innebygd Automatiseringen går nemlig meget raskt, kan fort skape utfordringer 6
Hvorfor valgte vi FluentAutomation og ikke Selenium direkte? Enkelt rammeverk mindre og mer lettlest kode for standard handlinger (Bakside: Mister vi noe av Seleniums funksjonalitet på veien til fluent syntaks?) 7
Hvordan bruker vi FluentAutomation i prosjektet? Hittil beskjeden testsuite (20ish tester) som kjører automatisk ved hvert bygg Tester noen utvalgte features vi anser som viktige, + noen vanlige «happy path»-scenarier I tillegg noen nyttige automatiseringer som bistår manuell testing / ytelsestesting Strukturert Fluent-koden veldig, slik at selve testmetodene blir svært enkle å lese/skrive, nesten på pseudokodenivå Initierer et nytt taxifirma for hver test, for å unngå at tester går i beina på hverandre og evt. brukere Valgt å initiere databasen med grunndata via «bakdøra», ikke via CRUD Sender inn taxiturer på vanlig måte via køene 8
FluentAutomation våre erfaringer Støter stadig på utfordringer men finner som regel en vei rundt bruk av 3.parts JS/HTML-rammeverk øker risikoen for utfordringer De første testene er relativt kostbare å skrive, men går lettere etter hvert (vel å merke med intelligent, DRY kode) Stor verdi i å automatisere regresjonstest-suiten, kan betale seg allerede etter et par releaser Veldig sårbare for selv små endringer i GUI Når man tester det man selv utvikler: blir mye mer bevisst på å skrive en god og testbar (!) DOM Blir bevisst på å konstruere et «lukket testlaboratorium» Gøy! Særlig når det fungerer! 9
Vår foreløpige konklusjon Automatiserte tester gir stor verdi i lengden, men koster litt å vedlikeholde. Egner seg derfor best for mer langsiktige prosjekter uten radikale endringer for hver iterasjon. Løpende vurdere hvilke deler av systemet som er gode kandidater for automatisert testing 10
Demo / spørsmål Eksempel på tenkt regresjonstest av en arbitrær ekstern webside kanbanflow.org testen er utviklet av meg for anledningen (Prosjektet kan lastes ned; se etter KanbanFlowAutomations.zip ved siden av denne presentasjonen.) Slik ser det ut når vi kjører TaxiFinans sin regresjonstest-suite Spørsmål? (helst ikke ;-) 11