Caracteristici castravete: o prezentare generală

Publicat: 2022-04-20

Introducere

Gherkin este un limbaj folosit încă în multe cadre de automatizare a testelor. Uneori pentru că clientul ne cere să-l folosim, alteori pentru că echipa decide să facă acest lucru.

Sincer să fiu, nu a fost dragoste la prima vedere pentru mine. Eu personal am o călătorie destul de lungă cu Gherkin – de la că-l place la început, până la detestarea limbii pentru o vreme, apoi ajungând să-mi placă din nou. În acest articol voi prezenta cele mai importante caracteristici ale Cucumber împreună cu implementarea Java.

Iată toate caracteristicile Castravetelui acoperite în acest articol:

Caracteristică Descriere
Scenariu Scenariu simplu
Schița scenariului Solicită utilizatorului să furnizeze date de testare în secțiunea „Exemple”.
Tabele de date Solicită utilizatorului să furnizeze date de testare pentru etapa de testare
Contextul scenariului Partajarea valorilor între pașii de testare
Tipuri de date castraveți Tipuri de date gestionate de castraveți
Expresia regulată de castraveți Utilizarea expresiei regulate în scenariile de castraveți
Cârlige de castraveți Execută cod suplimentar în scenariile de testare
Tabelul 1. Caracteristicile castraveților și java abordate în acest articol

Fișier de caracteristici

În primul rând, ce este un fișier de caracteristici? În lumea tehnică a fost creată o abordare non-tehnică pentru a permite oamenilor non-tehnici să coopereze cu echipa în timpul dezvoltării unei aplicații. Limbajul Gherkin a fost creat ca un strat suplimentar în abordarea BDD. Testele Gherkin sunt localizate în așa-numitele fișiere de caracteristici care sunt lipite cu codul (Java, Kotlin, C# etc.). De obicei, Gherkin este foarte ușor de utilizat și necesită cunoștințe minime de programare, dar există caracteristici care necesită o anumită codare.

Să începem cu ceva ușor.

Scenariu

Iată cel mai simplu și mai ușor de utilizat exemplu al testului Castraveților:

 Caracteristică: Scenariu

 Context: înainte de scenarii de testare
   Dat fiind că execut înainte de pas

 @Test
 Scenariu: Scenariu 
   Dat fiind că folosesc pasul parametrizat al „Scenariului 1”

Blocul de cod 1. Scenariu

Blocul de cod 1. conține câteva lucruri care trebuie explicate:

  • Caracteristică : titlul fișierului caracteristic
  • Context : cuvântul cheie care permite utilizatorului să execute pași de testare înainte de fiecare scenariu de testare definit în fișierul de caracteristici
  • @Test : Etichetă care spune cadrului de testare ce scenariu de testare trebuie executat. „Test” este definit de utilizator. Putem folosi de exemplu „@SmokeTest”
  • Scenariu : Numele scenariului de testare

Testele Gherkin folosesc cuvinte cheie [Given, When, Then, But] înainte de fiecare pas de testare. În singurul nostru pas de testare, cu excepția pasului de fundal, folosim un parametru în care trecem valoarea „Scenariu 1”.

Acum, să vedem cum arată codul Java lipit:

 @Given ("Execut înainte de pas")
public void iExecuteBeforeStep() {
   //o oarecare implementare
}

@Given ("Folosesc pasul parametrizat al lui {șir}")
public void iUseParametrizedStepOf(String p) {
   //o oarecare implementare
}

Blocul de cod 2. Implementarea codului Java a scenariului

Schița scenariului

Să facem ceva mai complex:

 Caracteristică: Contur scenariu

 @Test
 Schiță scenariu: Schiță scenariu
   Dat fiind că rulez pasul cu „<parameter1>” și ​​„<parameter2>”
 Exemple:
     | parametrul 1 | parametrul2 |
     | parametrul1a | parametrul2a |
     | parametru1b | parametru2b |

Blocul de cod 3. Structura scenariului

De data aceasta vom folosi Scenario Outline care ne permite să repetăm ​​scenariile de testare cu diferite configurații de date de testare. Blocul de cod 3. conține câteva lucruri de explicat:

  • Exemple : matricea datelor de testare care va fi utilizată de scenariile de testare. Primul rând este un antet cu nume de parametri.

Și implementarea java:

 @Given ("Eu rulez pasul cu {șir} și {șir}")
public void iRunStepWithAnd(String p1, String p2) {
   //o oarecare implementare
}

Blocul de cod 4. Implementarea Java a Scenario Outline

Tabel de date

Schița scenariului este foarte utilă, dar ce se întâmplă dacă nu vrem să repetăm ​​întregul scenariu de testare, ci doar un singur pas de testare? Gherkin are o modalitate de a face asta și se numește „Tabel de date”.

 Caracteristică: Tabel de date

@Test
Scenariu: Scenariul tabelului de date
 Dat fiind că verific că coloana conține valoarea așteptată
 | columnName | valoare așteptată |
 | someColumnName | someExpectedValue |

Blocul de cod 5. Tabel de date

Scenariul cu tabel de date nu diferă mult de Structura scenariului. Singurul lucru este că nu punem cuvântul cheie „Exemple” înaintea tabelului.

Implementarea Java pare puțin mai complexă decât în ​​cazurile anterioare:

 @Given(„Verific că coloana conține valoarea așteptată”)
public void iVerifyColumnValuesInTableUsingQueryFromFileOnSchema(DataTable dataTable) {
   List<Map<String, String>> date = dataTable.asMaps();
   pentru (Map<String, String> form: data) {
       String columnName = form.get("columnName");
       String waitResult = form.get("expectedValue");
       //o oarecare implementare
       }
   }
}

Blocul de cod 6. Implementarea Java a tabelului de date

Pentru a accesa datele dintr-un tabel de date, creăm un dataTable variabil special de tip „DataTable”. Toate datele vor fi stocate în variabila Listă.

Contextul scenariului

Folosind contextul scenariului, putem partaja date între pași. Să presupunem că avem un scenariu în doi pași în care dorim să transmitem „date” valorice de la pasul 1 la pasul 2 (Blocul de cod 7).

 @Test
Scenariu: Contextul scenariului
 Având în vedere că am setat valoarea contextului scenariului „date”
 Dat fiind că folosesc valoarea contextului scenariului

Blocul de cod 7. Contextul scenariului

În primul rând, trebuie să construim o clasă specială numită ScenarioContext cu caracteristici de context de scenariu de setare și obținere de date (Code Block 8). Contextul scenariului nostru este un HashMap cu o pereche cheie-valoare. Vom identifica valorile după cheia sa.

  • scenarioContext() : HashMap a perechii cheie-valoare
  • setContext() : metodă cheie-valoare pentru a stoca datele contextului scenariului
  • getContext() : metodă de a obține cheia de furnizare a datelor
 clasă publică ScenarioContext {

   privat Map<String, Object> scenarioContext;

   scenariu publicContext(){
       scenarioContext = new HashMap<>();
   }

   public void setContext(Cheie de context, valoare obiect) {
       scenarioContext.put(key.toString(), valoare);
   }

   obiect public getContext(cheie de context){
       return scenarioContext.get(key.toString());
   }

}

enumerare publică Context {
   ID;
}

Blocul de cod 8. Implementarea Java a clasei Scenario Context

Având acest lucru, putem folosi metodele implementate. În pasul 1 setăm apoi valoarea în contextul scenariului și în pasul 2 obținem valoarea (Code Block 9).

 ScenarioContext scenarioContext = new ScenarioContext();

@Given ("Am setat valoarea contextului scenariului {șir}")
public void iSetScenarioContextValue(Valoare șir) {
   scenarioContext.setContext(Context.ID, valoare);
}

@Given ("Folosesc valoarea contextului scenariului")
public void iUseScenarioContextValue() {
   String sharedValue = scenarioContext.getContext(Context.ID).toString();
}

Blocul de cod 9. Etapele contextului scenariului

Tipuri de date castraveți

Castravetele gestionează un număr limitat de tipuri de date. Putem defini șiruri de caractere, numere întregi și valori flotante, dar în cazul valorilor booleene trebuie să codificăm câteva soluții.

 @Test
Scenariu: Scenariu cu variabile
 Dat fiind că folosesc șirul „șir”, int 1, float 1.1 și boolean „false”

Blocul de cod 10. Tipuri de date castraveți

Codul Java ar arăta cam așa:

 @Given ("Folosesc șirul {șir}, int {int}, float {float} și boolean {șir}")
public void iUseStringIntFloatAndBoolean(String var1, int var2, double var3, String var4) {
   boolean f = Boolean.valueOf(var4);
   //un cod
}

Blocul de cod 11. Implementarea Java a Tipurilor de date Castravete

Expresia regulată de castraveți

Aceasta este o altă caracteristică folosită frecvent. Blocul de cod 12 prezintă un scenariu în doi pași care diferă doar prin utilizarea unor valori variabile diferite (var1 și var2). Acesta este de fapt doar un pas, iar în codul Java (Code Block 13) definim o singură metodă, dar cu regex și un parametru var.

 @Test
Scenariu: scenariu de expresie regulată
 Dat fiind că folosesc variabila var1
 Dat fiind că folosesc variabila var2

Blocul de cod 12. Expresia regulată în castravete

 @Given ("^Eu folosesc variabila (.*)")
public void examTimeTableInSummerSeason(String var) {
   dacă (var.equals("var1")){
       //un cod
   }
   else if(var.equals("var2")){
       //un cod
   }
}

Blocul de cod 13. Implementarea Java a expresiei regulate Cucumber

Cârlige de castraveți

Nu în ultimul rând: cârlige de castraveți.

Blocul de cod 14 prezintă cele mai importante 4 cârlige:

  • @Before : execută codul înainte de fiecare scenariu de testare
  • @After : execută cod după fiecare scenariu de testare
  • @BeforeStep : execută cod înainte de fiecare pas de testare
  • @AfterStep : execută cod după fiecare pas de testare
 @Inainte de
public void beforeScenario() {
   //un cod
}

@După
public void afterScenario() {
   //un cod
}

@BeforeStep
public void beforeStep() {
   //un cod
}

@AfterStep
public void afterStep() {
   //un cod
}

Cod Bloc 14. Cârlige de castraveți

rezumat

Sper că te-am convins să folosești Gherkin în teste. Aceste câteva caracteristici vor face testele dvs. mai lizibile și mai ușor de înțeles de către persoanele netehnice. De asemenea, pentru noii tamplari, va fi mai ușor să înțeleagă logica afacerii și să le reducă timpul de îmbarcare.