BLOG
SOFTWARETEST

Blog: Pairwise kombination af datadrevet test - et perfekt match

Jeg arbejder ret meget med Cucumber, og ofte laver jeg en datadrevet test hvor jeg bruger Cucumbers abstrakte scenario med dataeksempler for at få en super dækning med kun en scenario beskrivelse.

[18. juni 2015] Joseph Wilk har været så venlig at lave et værktøj som tager en YML fil med de enkelte kolonner og deres data som input hvorefter det bliver udsat for pairwise kombinatorik og bliver outputtet direkte til standard out. Dette kan så fanges og bruges til at tilføje direkte til den feature fil du har beskrevet dette i. Lad mig vis dig hvordan her:

Først skal du naturligvis have værktøjet som hedder pairwise samt Cucumber installeret. Dette gøres nemmest via gems. Åbn en konsol og skriv følgende:

gem install pairwise cucumber

Hvis du allerede har dem installeret, bliver de opdateret hvis der er opdateringer, hvis ikke bliver de installeret. Hvis du arbejder på en LINUX/UNIX maskine og du arbejder på default installationen af Ruby, så skal du nok tilføje et 'sudo' foran kommandoen ovenover.

Det eksempel jeg har tænkt mig at bruge her er et meget tænkt eksempel, men det tjener formålet at demonstrere anvendelsen af dette godt, så det er OK.

Hvis vi så antager du har en featrue fil der ser nogen lunde sådan her ud:

#language: da

Egenskab: T-shirt kombinationer
Man skal kunne sælge 4 forskellige t-shirts som kommer med 2 forskellige tryk og i 3 forskellige farver. Der er så også størrelserne, og de er:
XS, S, M, L, XL, XXL. 

@CloseBrowser
Abstract Scenario: T-Shirt kombinationer
  Givet jeg åbner en default browser
  Givet jeg logger ind i shoppen
  Og jeg navigere til tøj sektionen
  Og jeg vælger t-shirt af typen "<t-shirt>"
  Og jeg vælger tryk "<tryk>"
  Og jeg vælger farven "<farve>"
  Og jeg vælger størrelsen "<str>"
  Når jeg klikker på køb knappen
  Så skal jeg have 1 vare i kurven

Eksempler:

Vi antager der er lavet noget meningshuldt gluecode til de steps der er defineret her. Vi antager også at tagget @CloseBrowser betyder at browseren bliver ryddet op sådan at testcasesn ikke behøver at gøre det. Så er det eneste vi mangler sådan set selve eksemplerne som skal bruges til at lave testen ud fra. Hvis vi kigger på antallet af kombinationer ser regne stykket sådan her ud: 4 * 2 * 3 * 6 hvilket er 144 kombinationer. Hvis vi skulle teste dette villle det tage meget lang tid, og da Cucumber kører enkelt trådet er det ikke den bedste ide. Det er så her Pairwite kommer ind i billedet. Måden man bruger Pairwise på er at lave en såkaldt YML fil, en linie pr tag og mulighederne listes komma separeret. Det ser nogen lunde sådan her ud:

t-shirt: [2012, 2013, 2014, 2015]
tryk: [elephant, logo]
farve: [Sort, Grå, Rød]
str: [XS, S, M, L, XL, XXL]

Dette gemmes så en fil der f.eks hedder data.yml i samme mappe som feature filen ligger i. Her efter navigeres til mappen i en konsol og følgende kommando aktivere Pairwise funktionen:

pairwise data.yml

Det generere et output som ligner noget i den her retning:

| farve | str | t-shirt | tryk     |
| Sort  | XS  | 2012    | elephant |
| Sort  | S   | 2015    | logo     |
| Sort  | M   | 2014    | logo     |
| Sort  | L   | 2013    | logo     |
| Sort  | XL  | 2015    | elephant |
| Sort  | XXL | 2015    | logo     |
| Grå   | XS  | 2015    | logo     |
| Grå   | S   | 2014    | elephant |
| Grå   | M   | 2013    | elephant |
| Grå   | L   | 2012    | logo     |
| Grå   | XL  | 2014    | logo     |
| Grå   | XXL | 2014    | elephant |
| Rød   | XS  | 2014    | logo     |
| Rød   | S   | 2013    | elephant |
| Rød   | M   | 2015    | logo     |
| Rød   | L   | 2015    | elephant |
| Rød   | XL  | 2012    | logo     |
| Rød   | XXL | 2013    | elephant |
| Rød   | S   | 2012    | logo     |
| Grå   | M   | 2012    | logo     |
| Sort  | XXL | 2012    | logo     |
| Grå   | XS  | 2013    | logo     |
| Sort  | XL  | 2013    | logo     |
| Sort  | L   | 2014    | logo     |

Og således blev 144 testcases reduceret til 24 testcases. Hvis man så lige vil være ekstra sej, så kan man få Pairwise funktionen til selv at tilføje det til slutningen af feature filen bruge følgende kommando:

pairwise data.yml >> "T-Shirt Kombinationer.feature"

Det lille tricks virker for øvrigt både på Windows og UNIX/Linux systemer.

Den samlede feature fil se sådan her ud:

#language: da

Egenskab: T-shirt kombinationer
Man skal kunne sælge 4 forskellige t-shirts som kommer med 2 forskellige tryk og i 3 forskellige farver. Der er så også størrelserne, og de er:
XS, S, M, L, XL, XXL. 

@CloseBrowser
Abstract Scenario: T-Shirt kombinationer
  Givet jeg åbner en default browser
  Givet jeg logger ind i shoppen
  Og jeg navigere til tøj sektionen
  Og jeg vælger t-shirt af typen "<t-shirt>"
  Og jeg vælger tryk "<tryk>"
  Og jeg vælger farven "<farve>"
  Og jeg vælger størrelsen "<str>"
  Når jeg klikker på køb knappen
  Så skal jeg have 1 vare i kurven

Eksempler:
| farve | str | t-shirt | tryk     |
| Sort  | XS  | 2012    | elephant |
| Sort  | S   | 2015    | logo     |
| Sort  | M   | 2014    | logo     |
| Sort  | L   | 2013    | logo     |
| Sort  | XL  | 2015    | elephant |
| Sort  | XXL | 2015    | logo     |
| Grå   | XS  | 2015    | logo     |
| Grå   | S   | 2014    | elephant |
| Grå   | M   | 2013    | elephant |
| Grå   | L   | 2012    | logo     |
| Grå   | XL  | 2014    | logo     |
| Grå   | XXL | 2014    | elephant |
| Rød   | XS  | 2014    | logo     |
| Rød   | S   | 2013    | elephant |
| Rød   | M   | 2015    | logo     |
| Rød   | L   | 2015    | elephant |
| Rød   | XL  | 2012    | logo     |
| Rød   | XXL | 2013    | elephant |
| Rød   | S   | 2012    | logo     |
| Grå   | M   | 2012    | logo     |
| Sort  | XXL | 2012    | logo     |
| Grå   | XS  | 2013    | logo     |
| Sort  | XL  | 2013    | logo     |
| Sort  | L   | 2014    | logo     |

todo todo