TestAutomatisering & PerformanceTesten

Regular Expressions en Testautomatisering, twee problemen of juist een oplossing?

Bij geautomatiseerde checks wil je regelmatig een verwachte waarde controleren tegen een actuele waarde. Vroeg of laat kom je dan in aanraking met wildcards: Je wilt bijvoorbeeld weten of de tekst “Er zijn 42 resultaten gevonden” voorkomt, maar het aantal, hier 42, kan variabel zijn. Van 42 wil je dan een wildcard maken.

De meest gebruikte wildcard language is de regular expression. Binnen het testautomatiseren gebruik ik graag regular expressions:

Maar eigenlijk is de belangrijkste reden:

Wat betekent dit? Je hoeft de check niet programmatisch af te handelen. Laten we kijken hoe we dit programmatisch zouden kunnen afhandelen:

public void CheckCorrectResultAmountMessage(string actualText) 
{
    // Check the start of the text
    Assert.IsTrue(actualText.StartsWith("Er zijn "));

    // Check the end of the text
    Assert.IsTrue(actualText.EndsWith(" resultaten gevonden"));

    // Grab the amount
    var amountText = actualText.Replace("Er zijn ", "").Replace(" resultaten gevonden", "");

    // Check if the amount is a valid integer
    int amount;
    Assert.IsTrue(int.TryParse(amountText, out amount), "The amount '{0}' is not a valid integer", amountText);
}

Dat is best wel veel gedoe voor de check van 1 regel tekst en dan zijn er nog genoeg cases die niet afgedekt worden: negatieve waarden worden niet als foutief gezien, wat gebeurt er als je ‘4 2’, ‘4.2’, ‘4e2’ of ‘4,2’ terugkrijgt? (dit vereist interne kennis over de int.TryParse method). En hoe ga je dit uitbreiden naar “Er zijn geen resultaten gevonden” en “Er is 1 resultaat gevonden”?

Het onderliggende probleem is: We proberen twee problemen tegelijkertijd op te lossen: Wat we willen checken en hoe we dat doen. Een betere strategie is om dat uit elkaar te trekken.

We kunnen dit oplossen door een regular expression te gebruiken:

public void CheckCorrectResultAmountMessage(string actualText)
{
    var pattern = "^Er zijn [0-9]+ resultaten gevonden$";
    Assert.IsTrue(Regex.IsMatch(actualText, pattern));
}

Nu kunnen de definitie (wat) en de implementatie (hoe) scheiden waarbij je het pattern op een andere plek bepaalt (in een config file, een database, Excel bestand of je testscenario) dan waar je het test. Als we dit bijvoorbeeld in een Feature file gebruiken dan bepalen we in de feature file de definitie (Wat we testen):

Scenario: There must be an amount displayed if there are results
Given I search for "ipod"
Then I can see the message "Er (zijn \d+ resultaten|is 1 resultaat) gevonden"

Scenario: A message should be shown when no results are found
Given I search for "sony walkman"
Then I can see the message "Er zijn geen resultaten gevonden"

en in de step definitie de implementatie (Hoe we dat doen):

[Then(@"I can see the message ""(.*)""")]
public void ThenICanSeeTheMessage(string expectedMessagePattern)
{
      var msg = MyFancyWebApp.GetMessage();
      Assert.IsTrue(Regex.IsMatch(msg, expectedMessagePattern));
}

Regular expressions is maar één gebied dat je helpt om definitie en implementatie te scheiden. Binnen applicatie development en dus ook test automatisering is Separation of Concerns een leidend principe dat je binnen een goede code basis veel terug zal zien komen. Samen met DRY (Don’t Repeat Yourself) en KISS (Keep It Simple Stupid) vormt dit de basis code principes waarmee je niet alleen jezelf, maar ook je team enorm helpt.

 

 

Dit bericht is geplaatst in Testautomatisering en getagd in design principles regular expressions

2 reacties op “Regular Expressions en Testautomatisering, twee problemen of juist een oplossing?”

  1. Mathijs schreef:

    Hoe maak je in je testdata onderscheid tussen een regular expression en een gewone tekst, in gewone tekst komen af en toe tekens voor die mis gaan bij een regex zoals haakjes of een plusteken?

  2. Bas Dam schreef:

    Goede vraag Mathijs. Als je SpecFlow gebruikt kan je een extra step aanmaken, eentje met “The message should be ‘something'” en een ander “The message should match ‘something'”. Dit zorgt vaak wel weer voor meer orchestratie in je step definities.

    Een andere manier die nog wel eens gebruikt wordt, vooral in ruwe check data zoals tabellen, is door een signaal karakter te gebruiken voor een regular expression. In het verleden gebruikte ik nog wel een het uitroepteken (dat komt nog uit de WinRunner tijd) maar tegenwoordig vaak een slash (/) voor en achter een pattern (zoals in bijvoorbeeld Java en JavaScript gebruikelijk is).

    Om nog even op de eerste methode terug te komen, in combinatie met Fluent Assertions en ArgumentTransformations kan je een generieke comparer aanmaken dat je de orchestratie uit handen neemt. Ik kan hier binnenkort wel eens iets over schrijven.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Nieuws

Blijf op de hoogte

APACHE MPM (op *nix servers)

07/11/2017

Benieuwd naar de impact van het wijzigen van Apache MPM Prefork naar Worker? Lees dan door! Bij één van onze klanten heb ik dit onderzocht. Omdat dit ook interessant kan zijn voor anderen, deel ik mijn resultaten en ervaringen graag. Het is misschien wat technisch allemaal, maar voor performancetesters, de doelgroep, is het vast goed […]

Performancetesten en CI/CD, gaat dat samen?

13/10/2017

De afgelopen najaarseditie van Testnet stond onder het thema Continuous Everything vooral stil bij CI/CD en natuurlijk testen. Gezien DevOps en CI/CD ook grote invloed hebben op het vakgebied performance (testen), zijn wij blij dat we vanuit PerformanceArchitecten een bijdrage mochten leveren door middel van het delen van onze visie hierop. Onze collega René Meijboom […]

Een eerste indruk van Gauge

08/09/2017

Tijdens één van onze kennismiddagen hebben we gekeken naar het testtool Gauge. Doel van de sessie was om een beeld te krijgen wat de toegevoegde waarde van Gauge is voor een tester. Benieuwd naar onze ervaringen? Lees dan snel verder! Gauge is een open source project, gesponsord door ThoughtWorks en belooft in het kort het […]

Test Automation Framework BDD

16/06/2017

De afgelopen tijd heb ik in een opdracht collega’s mogen adviseren over de positieve impact van het Test Automation Framework BDD rondom het thema Agile. In een vorige blog ‘Transformation’ is te lezen wat BDD voor mij betekent en hoe BDD voor synergie zorgt tussen verschillende disciplines binnen Agile-teams met als doel het leveren van kwalitatief hoogwaardig […]

Creëer meer eenheid in je SpecFlow steps met Step Argument Transformations

11/04/2017

Laatst kreeg ik de vraag, “Hoe maak je in je testdata onderscheid tussen een regular expression en een gewone tekst”. Oftewel: Hoe beheer je verschillende soorten steps als ze alleen verschillen in de manier waarop data vergeleken wordt. Je hebt een veld en je wilt controleren of er een bepaalde waarde in staat, maar soms […]

SSL/TLS versie en cipher in HP LoadRunner

29/03/2017

In deze blog wil ik even stilstaan bij de resultaten van een performance test die niet overeenkwamen met de verwachtingen die wij als team hadden. Een aantal transacties gingen in responstijd omhoog en het CPU gebruik nam flink toe. Omdat het ons veel tijd heeft gekost, deel ik dit graag met jullie zodat wij performance […]

Regular Expressions en Testautomatisering, twee problemen of juist een oplossing?

25/03/2017

Bij geautomatiseerde checks wil je regelmatig een verwachte waarde controleren tegen een actuele waarde. Vroeg of laat kom je dan in aanraking met wildcards: Je wilt bijvoorbeeld weten of de tekst “Er zijn 42 resultaten gevonden” voorkomt, maar het aantal, hier 42, kan variabel zijn. Van 42 wil je dan een wildcard maken. De meest […]

Automated Approval Testing with Dynamic Data Sets

21/02/2017

For some tests, you’ll need to check if files or documents are the same as they were before, or that they comply with a certain format. When something differs, you need to “reject” or “approve“ them, or even make them the new baseline if you are welcoming the changes. We call this Approval Testing. For more […]

Transformation

20/01/2017

Inmiddels hebben veel organisaties de overstap gemaakt van de traditionele waterval methode naar een iteratieve ontwikkelmethode als Agile/Scrum. Een aantal organisaties zijn in hun werkwijze een stap verder gegaan en hebben DevOps geïntroduceerd. Waar de methodiek Agile vooral focust op het tevredenstellen van de klant, richt DevOps zich daarnaast op het dichten van de kloof […]

Cucumber, Selenium en het gebruik van het Page Object Pattern

14/12/2016

Als je Selenium gebruikt om je testen aan te sturen, kan je gebruik maken van het Page Object Pattern om een laag van abstractie aan te maken: Het maakt een model van je pagina zodat het makkelijker is om acties op die pagina uit te voeren. Dit heeft grote voordelen: Zodra er een wijziging op de […]

SpecFlow Extensies voor Dummies

21/11/2016

TechTalk heeft voor SpecFlow natuurlijk al een handige set aan extensies uitgebracht die vooral het gebruik van eigen datatypes in combinatie met SpecFlow steps mogelijk maken. Dit is slimme, maar vrij geavanceerde set waarbij je best wel wat ervaring moet hebben met zowel het gebruik van SpecFlow als C#. De beginnende gebruiker zal eerder behoefte […]

SpecFlow Extensies voor Dummies, de code

21/11/2016

Hieronder vind je de code die behoort bij het artikel SpecFlow Extensies voor Dummies  Feature File: Feature: Table Transformations In order to have convenient datatypes As a SpecFlow user I want to transform tables into dictionaries or datatables Scenario: Transform a vertical table into a dictionary Given I have the following table: | Movie | […]