Category: programare

Implementarea Setup și Teardown în testele Selenium cu TestNG și Java

Atunci când dezvoltăm teste automate pentru aplicații web cu Selenium și Java, este important să avem un mediu bine configurat pentru a asigura că testele rulează corect și eficient. O abordare comună în acest sens este utilizarea setup și teardown, oferite de framework-ul TestNG. În acest articol, vom explora cum să implementăm setup și teardown în teste Selenium folosind Java și TestNG.

Setarea mediului cu Setup

Metoda @BeforeClass din TestNG este utilizată pentru a executa cod înaintea primului test dintr-o clasă de teste. Această metodă este ideală pentru operațiile de setup care trebuie realizate o singură dată pentru întregul set de teste.

import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class SeleniumTest {

    @BeforeClass
    public void setup() {
        // Configurare WebDriver, deschidere browser, etc.
        System.out.println("Setup pentru testele Selenium");
    }

    @Test
    public void test1() {
        // Test 1
        System.out.println("Execută Test 1");
    }
}

În exemplul de mai sus, metoda setup() va fi apelată înaintea execuției oricărui test din clasă. Aici poți configura WebDriver-ul, deschide browser-ul sau executa orice alte operațiuni de setup necesare.

Cleanup cu Teardown

Metoda @AfterClass din TestNG este utilizată pentru a executa cod după ce toate testele dintr-o clasă au fost rulate. Aceasta este o oportunitate ideală pentru operațiunile de cleanup sau pentru închiderea resurselor deschise în timpul setup-ului.

import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;

public class SeleniumTest {

    @BeforeClass
    public void setup() {
        // Configurare WebDriver, deschidere browser, etc.
        System.out.println("Setup pentru testele Selenium");
    }

    @Test
    public void test1() {
        // Test 1
        System.out.println("Execută Test 1");
    }

    @Test
    public void test2() {
        // Test 2
        System.out.println("Execută Test 2");
    }

    @AfterClass
    public void teardown() {
        // Închidere browser, eliberare resurse, etc.
        System.out.println("Teardown după testele Selenium");
    }
}

Metoda teardown() este apelată după ce toate testele din clasă au fost rulate, oferind un loc potrivit pentru operațiuni de curățare și eliberare a resurselor.

O practică recomandată în dezvoltarea de teste automate este organizarea metodelor de setup și teardown într-o clasă separată, numită adesea TestBase sau BaseTest. Această clasă servește drept punct central pentru toate operațiunile de configurare și curățare și este extinsă de către clasele de teste specifice.

Avantaje ale utilizării unei Clase de Bază (BaseTest):

  1. Reutilizare a Codului: Prin plasarea metodelor de setup și teardown într-o clasă separată, poți reutiliza aceste metode în toate clasele de teste care extind această clasă de bază. Acest lucru conduce la un cod mai curat și mai ușor de întreținut.
  2. Consistență: Toate clasele de teste care extind BaseTest vor beneficia de aceeași configurare și curățare, asigurând consistența întregii suită de teste.
  3. Flexibilitate: Prin intermediul clasei de bază, poți adăuga și gestiona cu ușurință alte funcționalități globale necesare pentru testele tale, cum ar fi gestionarea datelor de test, logging-ul, sau interacțiunea cu servicii externe.

Iată un exemplu simplu pentru o clasă de bază (BaseTest) care conține metodele de setup și teardown:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

public class BaseTest {
    protected WebDriver driver;

    @BeforeClass
    public void setup() {
        System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        // Alte operațiuni de configurare
    }

    @AfterClass
    public void teardown() {
        if (driver != null) {
            driver.quit();
        }
        // Alte operațiuni de curățare
    }
}

O dată ce ai definit clasa de bază, poți extinde această clasă în toate clasele tale de teste specifice, precum SeleniumTest:

import org.testng.annotations.Test;

public class SeleniumTest extends BaseTest {

    @Test
    public void test1() {
        // Test specific
        // Nu este nevoie să configurezi WebDriver-ul sau să gestionezi cleanup-ul explicit
    }

    @Test
    public void test2() {
        // Alt test specific
    }
}

Această organizare a codului facilitează menținerea și extinderea suitei de teste și contribuie la un cod mai curat și mai ușor de gestionat în timp.

Utilizarea setup și teardown în teste automate cu Selenium și Java oferă o structură bine organizată și modulară pentru gestionarea configurării și închiderii mediului de test. TestNG facilitează aceste operațiuni prin intermediul anotărilor @BeforeClass și @AfterClass. Implementând aceste practici, poți asigura că testele tale rulează într-un mediu coerent și că resursele sunt gestionate eficient.

Cum să faci un screenshot folosind librăria Selenium în Java

Selenium este o librărie populară pentru automatizarea testelor pe aplicații web. Printre numeroasele funcționalități pe care le oferă, se numără și posibilitatea de a realiza capturi de ecran (screenshot-uri) ale paginilor web. În acest articol, vom explora cum poți utiliza Selenium în Java pentru a realiza un screenshot al unei pagini web.

Pasul 1: Configurarea proiectului Java

Pentru a începe, asigură-te că ai configurat un proiect Java și ai adăugat librăria Selenium în claspath-ul proiectului tău. Poți face acest lucru prin adăugarea dependenței în fișierul de configurare Maven (pom.xml) sau prin descărcarea și adăugarea manuală a bibliotecilor Selenium.

Exemplu pentru Maven:

  <dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.16.1</version> <!-- Asigură-te că utilizezi ultima versiune disponibilă -->
    </dependency>
</dependencies>

Pasul 2: Inițializarea driver-ului Selenium

Înainte de a realiza un screenshot, trebuie să inițializezi un driver Selenium pentru a controla un browser. În exemplul nostru, vom utiliza ChromeDriver.

public class HotToTakeScreenshotWithSelenium {

	
	 public static void main(String[] args) {

	        // Inițializează un obiect WebDriver pentru Chrome
	        WebDriver driver = new ChromeDriver();

	        // Deschide o pagină web
	        driver.get("https://www.keybooks.ro");

	        // Realizează un screenshot și salvează-l într-un fișier
	        try {
	            // Utilizează metoda getScreenshotAs pentru a realiza captura de ecran
	            File screenshotFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
	            
	            // Salvează captura de ecran într-un fișier
	            FileUtils.copyFile(screenshotFile, new File("poze/screenshot.png"));
	        } catch (IOException e) {
	            e.printStackTrace();
	        }

	        // Închide browser-ul
	        driver.quit();
	    }
	
}

Pasul 3: Adăugarea excepțiilor și importurile necesare

În exemplul de cod de mai sus, am adăugat un bloc try-catch pentru a trata excepțiile care pot apărea în timpul realizării și salvării capturii de ecran. De asemenea, am importat clasele necesare pentru a gestiona aceste operațiuni.

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

Concluzie:
Utilizând librăria Selenium în Java, realizarea unui screenshot al unei pagini web devine o sarcină simplă. Acest exemplu furnizează o bază solidă pentru începerea automatizării testelor și a altor activități care implică capturi de ecran în cadrul proceselor de dezvoltare software.

Exemplul de cod poate fi accesat aici: github.com

Ce presupune testarea unui website?

Testarea unui site web sau web testing cum i se mai spune, presupune verficarea si validarea mai multor aspecte care tin de functionalitate, utilizare, siguranta datelor, performanta, integrarea si compatibilitea unei aplicatii web inainte de a fi lansata catre utilizatorii finali.

Astfel, putem extrage foarte usor din explicatia de mai sus care sunt cele mai importante tipuri de testare pe care trebuie sa le avem in vedere in momentul in care facem web testing.

Sa le luam pe rand.

Functionalitate (Functional testing)

Aici va trebui sa testam toate functionalitatile de bussines definite pentru website. Toate scenariile pe care ne asteptam sa le execute utilizatorii finali.
Deasemenea trebuie sa ne asiguram nu doar de scenariile pozitive merg, cat si de scenariile negative.
Ce se intampla daca un utilizator iese de pe un scenariu predefinit si incearca altceva?
De exemplu, ce se intampla daca pe website un produs are stocul afisat ca fiind de 5 bucati si utilizatorul incearca sa adauge 6 in cos? Este lasat? Poate sa ajunga la plata cu produse care nu sunt pe stoc?
Desigur, acest scenariu este posibil, insa este datoria testerului sa il preintampine sau sa sesizeze aceasta situatie.

Functionalitatile adiacente ale websiteului vor fi deasemenea testate. Poate utilizatorul sa isi actualizeze profilul cu o poza noua ? Sau sa isi stearga contul?
Testarea tuturor linkurilor din site se va face tot aici. Precum si verificarea eventualelor erori de HTML sau CSS.
La fel si testarea formularelor si testarea functionalitaii diferitelor elemente ale siteului.
Practic acest tip de testarea este cea mai complexa si poate include inclusiv elemente din tipurile de testare enumerate si mai jos.
Scopul prinicipal ramane insa testarea functionalitatlior de bussines. Verificarea si validarea ca website- ul isi indeplineste scopul pentru care a fost creat.

Utilizare (Usability testing)

Testarea de utilizare este foarte importanta pentru experienta finala a utilizatorului care foloseste aplicatia.
Acest tip de testare verifica cat de usoara este navigarea intre diferite pagini ale siteului spre exemplu.
Sau cat de usor si de intuitiv de folosit sunt diversele meniuri din website.
Sau cat de usor lizibile sunt prezentate anumite informatii importante pentru utilizator.
Deasemenea cat de usor este de folosit website-ul in scopul in care el a fost creat. Sau de exemplu, aaca vorbim de un magazine online, cat de usor ii este unui utilizator sa gaseasca gasi pe website un produs si de a il adauge in cosul de cumparaturi pentru a finaliza comanda.

Siguranta datelor (Security testing)

Acest tip de testare este vital pentru orice aplicatie, mai ales daca este expusa publicului larg.
Trebuie sa ne asiguram ca urmatoarele aspect sunt acoperite :
• Accesul neautorizat nu ar trebui sa fie permis. Aici vorbim de la utilizatorii care au cont valid de a utiliza aplicatia pana la drepturile pe care fiecare dintre utilizatori le au in interiorul aplicatiei si accesul lor la diferite seturi de date.
• Verificarea sesiunilor si a datelor care se inregistreaza la nivel de sesiune, cookies etc
• Token-urile de acces. Acestea pot fi vazute ca niste chei cu periodata de expirare. Spre exemplu in urma unei autentificari, se genereaza un token de acces, dar acesta poate avea o valabilitate de cateva ore sa zicem. Trebuie sa verificam daca dupa expirarea timpului acel token mai poate fi folosit pentru autentificare. In realitate acesta nu ar trebui sa mai mearga.
• Deasemenea verificarea certificatelor SSL si redirect-urile pe care websiteul le face trebuies verificate.

Performanta (Performance testing)

In cazul testarii de perfomanta va trebui sa ne asiguram ca urmatoarele aspecte sunt in parametrii aceeptati.
• Aplicatia raspunde intr-un timp optim. Spre exemplu, o cautare mai ampla pe site care poate aduce multe rezultate in interfata nu dureaza foarte mult.
• Trebuie sa verificam daca cum se comporta aplicatia cand este supusa unui volum foarte mare de date. Se poate intampla ca in acecst caz, webserverul ar putea sa nu faca fata unui volum mare de cereri si sa nu raspunda in timp util sau chiar sa opreasca procesarea.
• Trebuie sa verificam comportamentul aplicatiei in momentul in care este accesata de volume mari de useri. In acest caz cerintele de business legate de numarul de utilizatori preconizat are un impact foarte mare.
• Deaseamea, putem sa verificam si cum se comporta aplicatia pe un timp indelungat de folosinta cu diverse volume de useri si/sau volume de date care trebuiesc procesate.
Acestea sunt doar cateva exemple.

Multe dintre tipurile de teste care intra in sfera testarii de performanta trebuiesc definite in functie de specificatiile de bussines ale aplicatiei: un website de prezentare nu va fi supus acelorlasi teste cum este supus un magazine online.

Compatibilitatea (Compatibility testing)

Testele de compatibilitate ne asigura ca websiteul functioneaza in parametrii optimi pe diferite configuratii.
Aceste configuratii pot fi:
• Browsere (Chrome, Firefox, Edge, Safari, Opera)
• Sisteme de operare (MacOS, Linux, Windows, Android, iOS)
• Laptopuri, telefoane mobile, tablete
Avem nevoie sa facem aceste teste pentru ca in functie de configuratie, elementele site-ului (poze, butoane, diverse form-uri) pot sa fie afisate diferit din cauza rezolutiei ecranului , executiei JavaScript in functie de browser, etc.

Integrarea (Integration testing)

In testarea de integrare va trebui sa ne asiguram ca exista o comunicare optima a tuturor componentelor care alcatuiesc aplicatia.
Aici vor fi implicate, in principal, trei componente: aplicatia, serverul web si baza de date.
Din partea de aplicatie vor pleca toate cererile catre web server si baza de date.
Din zona de web server trebuie sa ne asiguram ca aceste cereri sunt gestionate corect si redirectionate acolo unde este cazul catre alte componente cum ar fi baza de date.
Din zona bazei de date trebuie sa ne asiguram ca atunci cand cerem anumite date ele sunt gestionate corect. Spre exemplu, o simpla cautare intr-o pagina web va ajunge in spate sa execute un query in baza de date, care va raspunde cu anumite date in functine de criteriile de cautare.

Acestea sunt principalele tipuri de testare care se executa in procesul de dezvoltare al unui website, dar nu sunt singurele.  De asemenea , fiecare dintre ele poate cuprinde mai mult elemente decat cele enumerate mai sus in functie de specificul si scopul aplicatiei.

 

Happy testing!

PS: In curand vom incepe un nou Curs Practic de Testare Software. Poti afla mai multe despre acesta aici.