top of page

Visual Regression Testing - Wat is het en wat heb je eraan?

  • Foto van schrijver: Bas Dam
    Bas Dam
  • 7 nov 2018
  • 6 minuten om te lezen

Bijgewerkt op: 7 nov 2023


Visual Regression Testing, of visuele regressie testen, is een categorie van testen die zich focust op het identificer

en van visuele wijzigingen tussen iteraties of versies van een website. Dit kan handmatig door schermen of schermafdrukken te vergelijken, maar het is beter herhaalbaar en sneller te testen door dit automatisch te doen.



Het mooiste is om deze testen als een van de latere stappen in de build pipeline te plaatsen zodat het volledig automatisch kan, maar als er vaak verschillen zijn (wat niet per-sƩ regressie, achteruitgang, hoeft te zijn) leidt dit tot veel vals positieven die toch handmatig verwerkt moeten worden. Je kan er dan ook voor kiezen om deze testen op gezette tijden uit te voeren als onderdeel van de Definition of Done van een work-item. Ook helpt het ontwikkelaars om in controle te blijven als ze wijzigingen in de stylesheets moeten doen waar impact mogelijk is door de gehele applicatie heen.


Veel VRT frameworks hebben de mogelijkheid om te ā€œapprovenā€. We hebben dit al eerder gezien bij Approval Testing. Ook met Approval Testing is het mogelijk om schermen met elkaar te vergelijken, maar omdat dit een onderdeel in het grotere geheel van Approval Testing is, zijn de mogelijkheden beperkt. Specifieke VRT frameworks hebben vaak meer mogelijkheden door alleen bepaalde schermregionen te testen waardoor de testset een stuk fijnmaziger wordt. Deze regionen worden vaak bepaald door wat er getoond wordt binnen een onderdeel van de HTML-DOM. Selecties van welk onderdeel dat is, gebeurt bijvoorbeeld via xpath expressies of CSS paden.


Bepaalde VRT frameworks kunnen headless draaien, dat betekent: testen zonder dat er een browser geopend hoeft te worden; wat een significante versnelling kan betekenen. Ook kan je vaak aangeven op welk device (in het geval van mobile), welke browser, of op welke schermformaat je wilt testen. Deze testen kunnen deels parallel worden uitgevoerd, wat de totale doorlooptijd van de testen flink verkort.


Waarom zou jeĀ VisualĀ RegressionĀ TestingĀ willen? Door de gehele CI/CD pipelineĀ te automatiseren kunnen we steeds sneller nieuwe features naar productie brengen. Onze unit, integratie en acceptatie testenĀ controlerenĀ of we geen ongewenste features hebbenĀ geĆÆntroduceerdĀ in de nieuwe code, maar dat is over het algemeen op het gebied van data, gedrag of processen. Maar stel dat er per ongeluk een dansende pony in je applicatie verschijnt, dan is hetĀ voor een geautomatiseerd proces heel moeilijk om te detecteren dat de ongewenste visuele wijziging heeft plaatsgevonden terwijl het voor een menselijke gebruiker overduidelijk is dat er een verandering is opgetreden.Ā  VRT kan hiervoor een oplossing bieden.Ā  Dat is echter wel afhankelijk van de website die je wilt testen.Ā  Als het een website betreft met veel dynamische content, zoals een nieuwssite, dan is het de vraag of VRT veel toegevoegde waarde heeft. De dynamische content zal immers uitgesloten moeten worden van de test. Indien de website zeer statisch is zal er waarschijnlijk weinig veranderen en zal de toegevoegde waarde van VRT ook laag zijn. De toegevoegde waarde van VRT zit vooral in het feit dat automatisch gecontroleerd kan worden of bepaalde wijzigingen op de website onbedoelde bij-effecten hebbenĀ opĀ deĀ layoutĀ van de website.


Hoe doe jeĀ VisualĀ RegressionĀ Testing? Nagenoeg alleĀ VRTsĀ werken volgens de Capture, Test,Ā ApproveĀ workflow:


Capture: Je definieert als eerste schermen en/of regionen die je op een herhaalbare wijze automatisch kan tonen. Van dit scherm of deze regio maak je een schermafdruk, ofĀ capture. Dit is de baseline.


Test: Bij eenĀ nieuwe iteratie wordt van dezelfde regio eenĀ captureĀ gemaakt en tegen de baselineĀ captureĀ aangehouden. Indien er een verschil is zal dit gemeld worden, bijvoorbeeld in een testrapport.


Approve: Een menselijke gebruiker kan het rapport doornemen te Approven, (de nieuweĀ captureĀ wordt de baseline), of een incident aan te maken als er daadwerkelijk regressie is opgetreden.


SoortenĀ VisualĀ RegressionĀ TestingĀ frameworks Op het web zijn er verschillende VRTĀ frameworksĀ te vinden. De verschillen zitten hem in het platform: as-a-service, betaald of open source; de gebruikte taal (JavaScript, Ruby, .NET, Java); onderliggendeĀ captureĀ technieken (Selenium al dan niet metĀ PhantomJS, Chromium) en mogelijkheden. Ook onderscheiden deĀ frameworksĀ zich in ondersteuning, community en mate vanĀ ontwikkel activiteit, dus in hoeverre hetĀ frameworkĀ onderhouden wordt. Vooral bijĀ browsertestingĀ is dat laatste belangrijk omdat nieuwe browsers deĀ captureĀ functionaliteit kunnen breken van bestaande tools. Hieronder vind je een incomplete lijst van veel genoemdeĀ frameworks die laat zien aan welke keuzes je moet denken. Applitools:Ā DitĀ frameworkĀ werkt tweeledig.Ā CapturenĀ moet lokaalĀ gebeuren met behulp vanĀ applitoolsĀ eyesĀ library. Dit kan op een tal van omgevingen: Web, iOS,Ā AndroisĀ en tal van testĀ frameworks:Ā Appium, Selenium,Ā ProtractorĀ en veel meer. Het vergelijken vanĀ capturesĀ gebeurtĀ as-a-service. De screenshots worden naarĀ applitoolsĀ verzonden via de API.Ā Je logt in op de website vanĀ applitoolsĀ en daar kan je via een erg gelikteĀ gebruikers interfaceĀ de verschillen zien en eventueel een nieuwe baseline instellen. Een aparte management tool is handig voor projecten waar het approven door een andere partij wordt gedaan (business gebruikers of testers) dan degene die hetĀ frameworkĀ heeft ingericht.


VisualReview: Werk je metĀ ProtractorĀ en vind je deĀ API oplossingĀ handig maar doe je dat liever onĀ premiseĀ (op je eigen server), dan kan je terecht bijĀ VisualReview. Het management is wat minder gebruiksvriendelijk en de opties zijn iets minder uitgebreid. De laatsteĀ commitĀ op het project is ook al even geleden, wat kan duiden op een verlaten project.


WebdriverCSS:Ā een andere tool die in eerste instantie veelbelovend lijkt in zijn mogelijkheden isĀ WebdriverCSS. Het leunt zwaar op zijn grote broerĀ WebdriverIO, dus een goede keus als je ditĀ frameworkĀ al gebruikt. Helaas is de laatsteĀ commitĀ vanĀ webdriverCSSĀ ook al van twee jaar geleden. Het gebruikt standaardĀ PhantomJSĀ en kan dusĀ headlessĀ capturen. Het blinkt uit in het definiĆ«ren van regio’s en het instellen van toleranties.


BackstopJS:Ā eenĀ NodeJSĀ libraryĀ die zeer goed te configureren isĀ met regio’s en pre-captureĀ scripts.Ā GecapturedeĀ files worden lokaal opgeslagen en kunnenĀ viaĀ eenĀ handige web interface vergeleken worden met de baseline. De open sourceĀ libraryĀ wordt goed onderhouden en support daardoor de nieuwste technieken zoalsĀ headlessĀ chromeĀ enĀ puppeteer.Ā Het is echter erg ChromeĀ georiĆ«nteerd, dus minder geschikt voorĀ multiĀ browser testen.


Screenster:Ā deze service neemt je het meeste werk uit handen. Je geeft via deĀ webinterfaceĀ de URL, device, browser en resolutie op. Om op de juiste plek binnen de webapplicatie te komen kan je ook eenĀ klikpadĀ opnemen. Vanaf wordt erĀ gecapturedĀ en kan er vergeleken worden met een nieuwe iteratie. Op deze manier is het ultra low-code en heel bruikbaar voor teamleden die geen ontwikkelaars zijn.Ā OokĀ heeft Screenster integratiemogelijkheden om de eerder geconfigureerde testen in een geautomatiseerdeĀ buildĀ te hangen.

Zelf aan de slag? Wil je zelf aan de slag, dan zou ik eens beginnen met BackstopJS. Dit framework heeft voldoende ondersteuning, maar door het open source karakter kan je er ook lekker mee kunnen knutselen zodat je beter kan begrijpen hoe VRTs werken. Open source projecten zijn wat dat betreft vaak beter geschikt om mee te experimenteren. Ook in vergelijking met andere open source VRTs steekt deze er boven uit: De grote gebruikerspopulatie en de actieve ontwikkeling in BackstopJS (gemiddeld wekelijks download van 11.500 en veel pull requests), het gemak waarmee het framework geïnstalleerd en geconfigureerd kan worden, mede door de duidelijke documentatie en het gemak waarmee een baseline gecreëerd kan worden en de testen kunt uitvoeren.


Installatie en gebruik Eigenlijk wijst deĀ GithubĀ pagina vanĀ BackstopJSĀ voor zichzelf. Die isĀ erg volledig en bevat meer voorbeelden dan we hier kunnen omschrijven. Toch hieronder een aantal tips en een snelle plug-and-playĀ instructie.

Tip: Zorg ervoor dat de laatste versie vanĀ NodeJSĀ is geĆÆnstalleerd (BackstopJSĀ werkt alleen metĀ NodeJSĀ 8.0 en hoger)


Open eenĀ commandĀ prompt (CMD/GitĀ Bash/PowerShell) en navigeer naar de map waar je project staat (of waar een nieuw project moet komen te staan). Voer vervolgens de volgende stappen uit:


npmĀ installĀ -gĀ backstopjs 
backstopĀ init 
backstop test
#Bij deze stap zullen de tests falen omdat er nog geen baseline-screenshots zijn gecreëerd. In de volgende stap worden die wél gedefinieerd.
backstopĀ approve
#Hiermee worden de screenshots die zijn genomen tijdens bovenstaande stap opgeslagen om alsĀ baselineĀ te dienen voor toekomstige tests (m.a.w. de website wordt tijdens een test met deze screenshots getoetst op wijzigingen).

Tip: als alternatief voor stap 3 en 4 kan initieel ook het commando ā€˜backstopĀ reference’ worden gebruikt om – zonder een initiĆ«le test – baseline-screenshots aan te maken.Ā 

Het is mogelijk om meerdere scenario’s te testen en te configureren en deze parallel te laten uitvoeren. Deze scenario’s kunnen gebruikmaken vanĀ customĀ scripts om de website in een bepaalde staat te krijgen: denk hierbij aanĀ het inloggen op een website om een gesloten domein te testenĀ ofĀ het invoeren van een rekeningnummer om een bepaald mutatieoverzicht te kunnen testen. Handige commando’sĀ hierbij zijn:

  • backstopĀ reference – maak/updateĀ  screenshotsĀ die als uitgangssituatie zalĀ wordenĀ gebruikt

  • backstopĀ test – vergelijk set van baseline-screenshots met nieuwe set van screenshots

  • backstopĀ approve – sla de resultaten van de laatste test op als nieuwe baseline


Conclusie VisualĀ RegressionĀ TestingĀ lijkt in eerste instantie erg geschikt om afbeeldingen op een website te controleren. Echter kom je er al gauw achter dat afbeeldingen niet vaak wijzigen en als ze wel vaak wijzigen, (denk aan een nieuws website), je ze niet wilt meenemen in je visuele regressie test. WaarĀ VRTsĀ juist wel geschikt voor zijn is het checken van ongewenste effecten van veranderingen in deĀ stylesheetĀ of pagina structuur.Ā  Welk typeĀ frameworkĀ jeĀ voorĀ jeĀ VRTĀ kiest hangt af van veel factoren: op welk moment in hetĀ buildĀ proces doe je deze testen, wie implementeert het, hoe technisch zijn de approvers, op welk platform wil je de applicatie testen etc.Ā  In dit artikel stippen we er vijf aan en laten al zien dat ze onderling best kunnen verschillen. WeĀ gaan iets dieper in opĀ BackstopJS, eenĀ open source toolĀ met een brede community en veel potentie. Echter beperkt het zich tot voornamelijk deĀ Chrome browserĀ en zal je thuis moeten zijn inĀ NodeJS.Ā Maak je al gebruik vanĀ WebdriverIOĀ in je testen, dan kan je kiezen voorĀ WebdriverCSS.Ā In andereĀ gevallen kan jeĀ bijvoorbeeldĀ meer geholpen zijn met een service en een makkelijke gebruikersinterface en ben je best bereid daarvoor te betalen. We horen graag welk VRTĀ FrameworkĀ jij gebruikt of zou willen gebruiken en waarom.

ComentƔrios


PerformanceArchitecten

©PerformanceArchitecten

bottom of page