Sfaturi de testare superalimentate pentru 2019: un tutorial de testare a automatizării Java

Publicat: 2022-03-11

În fiecare an, inginerii de automatizare a testelor din întreaga lume vor cerceta cele mai recente instrumente și tehnici pentru a face cadrul lor de automatizare a testelor mai stabil, mai rapid și mai ușor de utilizat și întreținut. Acest lucru este vital pentru a asigura adoptarea continuă pe scară largă a cadrului lor în cadrul companiei lor. În general, cadrele umflate și depășite se demodează rapid.

În acest articol, vom arunca o privire la câteva dintre modalitățile prin care vă puteți actualiza cadrul pentru 2019 și cum să fiți pregătit pentru 2020. Pentru a-mi îmbunătăți cadrul, mă concentrez întotdeauna pe „punctele dure”. Acestea sunt zonele care sunt complexe de configurat sau cauzează cele mai multe eșecuri. Am identificat trei domenii principale pe care am vrut să le simplific sau să le îmbunătățesc:

  1. Grila cu seleniu
  2. Așteaptă
  3. Chrome DevTools

Selenium Grid este notoriu dificil de configurat și poate eșua fără avertisment. Am vrut să văd ce s-a îmbunătățit, dacă este ceva, aici. De asemenea, am vrut să investighez dacă au fost adăugate noi waits la API-ul Selenium pentru a îmbunătăți stabilitatea testelor pe care le-am creat. În cele din urmă, am vrut să văd dacă pot începe să interacționez cu Chrome DevTools prin Selenium, care au devenit o parte esențială a setului de instrumente al oricărui tester.

Sfat #1: Dockerizați-vă grila de seleniu

Selenium Grid este notoriu greu de configurat, instabil și greu de implementat, sau de control al versiunilor, pe o conductă CI. O modalitate mult mai ușoară, stabilă și de întreținut este să utilizați imaginile Selenium Docker prefabricate.

Notă: Singurul dezavantaj al acestei metode este că IE (Internet Explorer) nu este acceptat, deoarece nu este încă posibilă containerizarea sistemului de operare Windows.

Se instalează

Pentru a începe să rulați, mai întâi trebuie să aveți instalate Docker și Docker Compose pe computer. Dacă rulați Windows 10 sau un Mac, atunci ambele vor fi instalate prin Docker Desktop.

Pornirea rețelei dvs

Depozitul oficial Selenium de pe Docker Hub conține imagini Docker prefabricate pentru Selenium Hub și Firefox și Chrome Nodes.

Cel mai simplu mod de a le utiliza într-o grilă Selenium locală este să construiți un fișier Docker Compose în directorul rădăcină al proiectului dumneavoastră. Denumiți fișierul docker-compose.yml pentru a simplifica lucrurile.

Am inclus mai jos un exemplu care creează următoarea Grilă:

  • Un singur hub de seleniu
  • Un nod Chrome
  • Un nod Firefox
 #docker-compose.yml version: "3" services: selenium-hub: image: selenium/hub:3.141.59-neon container_name: selenium-hub ports: - "4444:4444" chrome: image: selenium/node-chrome:3.141.59-neon volumes: - /dev/shm:/dev/shm depends_on: - selenium-hub environment: - HUB_HOST=selenium-hub - HUB_PORT=4444 firefox: image: selenium/node-firefox:3.141.59-neon volumes: - /dev/shm:/dev/shm depends_on: - selenium-hub environment: - HUB_HOST=selenium-hub - HUB_PORT=4444

Fișierul Docker Compose descrie configurarea Grid-ului. Pentru mai multe informații despre crearea fișierelor Docker Compose, consultați documentația oficială.

Pentru a porni Grid-ul, pur și simplu utilizați orice fereastră de terminal (o fereastră powershell sau cmd în Windows) pentru a rula următoarea comandă din directorul rădăcină al proiectului dvs.:

 docker-compose up

Conectarea la rețea

Vă puteți conecta la Grid Selenium exact în același mod ca în mod normal, deoarece Hub-ul ascultă pe portul 4444 al mașinii dvs. locale. Iată un exemplu în care am configurat driverul nostru pentru a folosi nodul nostru Chrome.

 // Driver.java protected static RemoteWebDriver browser; DesiredCapabilities cap = new DesiredCapabilities(); ChromeOptions chromeOptions = new ChromeOptions(); cap.setCapability(ChromeOptions.CAPABILITY, chromeOptions); cap.setBrowserName("chrome"); driver = new RemoteWebDriver(cap);

Puteți utiliza apoi biblioteca TestNG pentru a vă rula testele pe mai multe noduri în paralel, ca de obicei.

Este demn de remarcat faptul că este posibil să existe mai multe browsere care rulează pe fiecare nod. Cu toate acestea, acest lucru este descurajat, iar utilizarea unui browser per nod este considerată cea mai bună practică pentru performanțe optime.

Sfaturi și trucuri suplimentare

Dacă doriți să vedeți ce se întâmplă în browser pentru a vă putea depana testele, atunci merită să aveți o versiune de debug a fișierului dvs. docker-compose.yml care să descarce nodurile browserului de debug . Acestea conțin un server VNC, astfel încât să puteți urmări browserul în timp ce testul rulează.

De asemenea, este posibil să rulați browserele fără cap pentru a crește viteza (modul obișnuit), iar Selenium oferă, de asemenea, versiuni de base ale imaginilor, astfel încât să vă puteți construi propriile imagini dacă aveți nevoie de software suplimentar instalat.

Pentru a crea o versiune stabilă a Grid-ului pentru conducta dvs. CI, este, de asemenea, posibil să vă implementați Grid pe Kubernetes sau Swarm. Acest lucru asigură că orice Docker este restaurat sau înlocuit rapid dacă eșuează.

Sfat #2: așteptări inteligente

După cum știe orice inginer de automatizare a testelor, waits sunt cruciale pentru stabilitatea cadrului dvs. de automatizare a testelor. De asemenea, vă pot accelera testul prin redarea oricăror sleeps sau pauses redundante și depășind problemele lente de rețea și între browsere. Mai jos sunt câteva sfaturi pentru a vă face waits și mai rezistente.

Tutorial de testare a automatizării Java nr. 2: Operatori logici în așteptare: Fii specific cu așteptările tale

Clasa ExpectedConditions a crescut de-a lungul timpului și acum cuprinde aproape toate situațiile imaginabile. Deși ExpectedConditions.presenceOfElementLocated(locator) este adesea suficient, cea mai bună practică este să utilizați metodele din clasa ExpectedCondition pentru a acoperi fiecare acțiune a utilizatorului prin încorporarea acestora în clasa Actions.java . Acest lucru vă va proteja testele împotriva majorității problemelor legate de browsere sau de site-uri lente.

De exemplu , dacă clic pe un link are ca rezultat deschiderea unei noi file, atunci utilizați ExpectedConditions.numberOfWindowsToBe(2) . Acest lucru vă va asigura că fila este acolo înainte de a încerca să treceți la ea.

De asemenea, puteți folosi o wait pentru a vă asigura că capturați toate elementele prezente pe pagină atunci când utilizați findElements . Acest lucru poate fi util mai ales dacă o pagină de search are nevoie de timp pentru a returna rezultatele. De exemplu, această linie:

 List<WebElement> results = driver.findElements(locators.RESULTS);

Poate avea ca rezultat o matrice List goală dacă rezultatele căutării nu s-au încărcat încă. În schimb, este mai bine să utilizați numberOfElementsToBeMoreThan așteptată pentru a aștepta ca rezultatele să fie mai mari decât zero. De exemplu:

 WebElement searchButton = driver.findElement(locators.SEARCH_BUTTON); searchButton.click(); new WebDriverWait(driver, 30) .until(ExpectedConditions .numberOfElementsToBeMoreThan(locators.RESULTS, 0)); List<WebElement> results = driver.findElements(locators.RESULTS); results.get(0).click();

Acum, comanda ta findElements va rula numai după ce rezultatele căutării au fost returnate.

Această wait este utilă și pentru a găsi un singur element atunci când aveți de-a face cu un front end care nu se joacă bine cu Selenium (de exemplu, site-urile Angular). Crearea unei astfel de metode vă va proteja testele, făcându-le mult mai stabile.

 protected static WebElement waitForElement(By locator){ try { new WebDriverWait(browser, 30) .until(ExpectedConditions .numberOfElementsToBeMoreThan(locator, 0)); } catch (TimeoutException e){ e.printStackTrace(); Assert.fail("Timeout: The element couldn't be found in " + WAIT + " seconds!"); } catch (Exception e){ e.printStackTrace(); Assert.fail("Something went wrong!"); } return browser.findElement(locator); }

Este chiar posibil să așteptați ca elementele să nu mai fie vizibile. Acest lucru este util mai ales dacă așteptați ca o fereastră pop-up să dispară după ce ați făcut clic pe butonul OK sau Save înainte de a continua cu testul.

 WebElement okButton = driver.findElement(locators.OK_BUTTON); okButton.click(); new WebDriverWait(driver, 30) .until( ExpectedConditions .invisibilityOfElementLocated(locators.POPUP_TITLE) );

Toate metodele descrise mai sus și multe altele sunt enumerate în documentația oficială. Merită să petreceți zece minute citind toate posibilitățile și îmbunătățind stabilitatea cadrului dvs.

Tutorial de testare a automatizării Java nr. 2: Operatori logici în așteptare

O modalitate bună de a construi rezistență în waits dvs. este utilizarea operatorilor logici. De exemplu, dacă doriți să verificați dacă un element a fost localizat ȘI dacă se poate face clic pe acesta, veți folosi următorul cod (vă rugăm să rețineți că aceste exemple returnează o valoare booleană):

 wait.until(ExpectedConditions.and( ExpectedConditions.presenceOfElementLocated(locator), ExpectedConditions.elementToBeClickable(locator) ) );

Operatorul OR ar fi potrivit dacă nu ați fi sigur dacă titlul paginii s-ar putea schimba sau nu. Apoi puteți include o verificare a adresei URL dacă prima condiție eșuează, pentru a confirma că sunteți cu siguranță pe pagina potrivită.

 wait.until(ExpectedConditions.or( ExpectedConditions.titleIs(expectedTitle), ExpectedConditions.urlToBe(expectedUrl) ) );

Sau dacă doriți să vă asigurați că o casetă de selectare nu mai este activată după ce o acțiune este efectuată pe pagină, atunci operatorul NOT este adecvat.

 wait.until(ExpectedConditions.not( ExpectedConditions.elementToBeClickable(locator) ) );

Utilizarea operatorilor vă poate face waits mai rezistente și poate duce la teste care sunt mai puțin fragile.

Sfat #3: Chrome DevTools: Simularea condițiilor de rețea

Rularea aplicației dvs. web pe localhost sau într-o rețea locală poate da o impresie falsă cu privire la performanța acesteia atunci când rulați în sălbăticie. Capacitatea de a accelera diferite viteze de încărcare și descărcare vă va oferi o reprezentare mai bună a modului în care aplicația dvs. va rula pe internet, în cazul în care expirările pot duce la eșecul acțiunilor. Putem începe să simulăm acest lucru folosind puterea DevTools de la Chrome.

Următorul cod va deschide pagina de pornire Toptal folosind diferite viteze de descărcare și încărcare. În primul rând, ne vom stoca vitezele într-un furnizor de date TestNG folosind următorul cod:

 import org.testng.annotations.DataProvider; public class ExcelDataProvider { @DataProvider(name = "networkConditions") public static Object[][] networkConditions() throws Exception { return new Object[][] { // Upload Speed, Dowload Speed in kb/s and latency in ms. { 5000 , 5000, 5 }, { 10000, 7000, 5 }, { 15000, 9000, 5 }, { 20000, 10000, 5 }, { 0, 0 }, }; } }

Notă: limitarea de încărcare și descărcare este în kb/s , iar latența este în ms .

Apoi, putem folosi aceste date pentru a ne rula testul în diferite condiții de rețea. În cadrul testului, CommandExecutor va executa comanda în sesiunea curentă a browserului. Acest lucru, la rândul său, va activa setările necesare în funcționalitatea Instrumente pentru dezvoltatori din Chrome pentru a simula rețeaua noastră lentă. Codul din instrucțiunea if poate fi inclus într-o metodă @BeforeClass atunci când rulează o suită de teste.

 import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.openqa.selenium.remote.Command; import org.openqa.selenium.remote.CommandExecutor; import org.openqa.selenium.remote.Response; public class TestClass { // load our data provider @Test(dataProvider = "networkConditions") public void test(int download, int upload, int latency) throws IOException { // only run if the network is throttled if (download > 0 && upload > 0) { CommandExecutor executor = driver.getCommandExecutor(); // create a hashmap of the required network conditions Map map = new HashMap(); // you can even test 'offline' behaviour map.put("offline", false); map.put("latency", latency); map.put("download_throughput", downloadThroughput); map.put("upload_throughput", uploadThroughput); // execute our code Response response = executor.execute( new Command(driver.getSessionId(), "setNetworkConditions", ImmutableMap.of("network_conditions", ImmutableMap.copyOf(map)))); } // Open the website driver.get("https://www.toptal.com/"); // You can then check that elements are loaded etc. // Don't forget to use waits! } }
Înrudit: Construiți cu încredere: un ghid pentru testele JUnit

Sfat bonus: Cum să vă gestionați cookie-urile

Cookie-urile de browser pot provoca comportamente diferite în aplicația dvs., în funcție de dacă au fost sau nu salvate dintr-o sesiune anterioară (de exemplu, aplicația s-ar putea încărca cu un utilizator deja autentificat). Este o practică bună să ștergeți cookie-urile înainte de fiecare test pentru a vă asigura că nu cauzează probleme.

Codul de mai jos vă permite să ștergeți toate modulele cookie:

 driver.manage().deleteAllCookies();

De asemenea, puteți șterge un cookie după nume:

 driver.manage().deleteCookieNamed("CookieName");

Sau obțineți conținutul unui cookie:

 String myCookie = driver.manage().getCookieNamed("CookieName").getValue();

Sau obțineți toate cookie-urile:

 List<Cookie> cookies = driver.manage().getCookies();

Testarea automatizării în 2020: Privind spre viitor

Selenium 4 va fi lansat în următoarele câteva luni. Este încă în curs de dezvoltare, dar deoarece o versiune alfa a fost deja lansată, merită să aruncați o privire la ce îmbunătățiri va oferi.

Notă: puteți urmări progresul lor uitându-vă la foaia de parcurs.

Standardizare W3C WebDriver

Selenium nu va mai trebui să comunice cu browserul prin protocolul JSON wire; în schimb, testele automate vor comunica direct cu browserul. Acest lucru ar trebui să abordeze faimoasa natură fulgerătoare a testelor cu seleniu, inclusiv protecția împotriva actualizărilor de browser. Sperăm că și viteza de testare va crește.

O grilă de seleniu mai simplă

Grila Selenium va fi mai stabilă și mai ușor de configurat și gestionat în Selenium 4. Utilizatorii nu vor mai trebui să configureze și să pornească hub-uri și noduri separat, deoarece grila va acționa ca un nod și un hub combinat. În plus, va exista un suport mai bun pentru Docker, testarea paralelă va fi inclusă în mod nativ și va oferi o interfață de utilizare mai informativă. Urmărirea solicitărilor cu Hooks vă va ajuta, de asemenea, să vă depanați grila.

Documentație

Documentația Selenium va primi o revizuire foarte necesară, nefiind actualizată de la lansarea Selenium 2.0.

Modificări ale API-ului

Suportul pentru browserele Opera și PhantomJS va fi eliminat. Rularea fără cap poate fi efectuată cu Chrome sau Firefox, iar Opera este construită pe Chromium și, prin urmare, testarea Chromium este considerată suficientă pentru acest browser.

WebElement.getSize() și WebElement.getLocation() sunt acum înlocuite cu o singură metodă WebElement.getRect() . Cu toate acestea, deoarece acestea sunt adesea folosite pentru a crea capturi de ecran ale unui singur element, merită să știți că va exista și o comandă API pentru a captura o captură de ecran a unui element în Selenium 4.

Pentru WebDriver Window , metodele getPosition și getSize vor fi înlocuite cu metoda getRect , iar metodele setPosition și setSize vor fi înlocuite cu metoda setRect . vor fi disponibile metode fullscreen și minimize , astfel încât aceste acțiuni pot fi efectuate în cadrul testului dvs.

Alte modificări notabile:

  • Clasa Options pentru fiecare browser va extinde acum clasa Capabilities .
  • O driver.switchTo().parentFrame() a fost adăugată pentru a facilita navigarea în cadre.
  • vor fi incluse localizatoare nice care operează la un nivel superior celor actuale. Vor fi o subclasă a lui By .
  • Va exista o implementare a API-ului DevTools , permițând utilizatorilor să profite de funcțiile oferite prin utilizarea Protocolului de depanare Chrome (și echivalente pe alte browsere). Acestea includ:
    • Capturi de ecran completă (inclusiv elemente offscreen).
    • Jurnalele de streaming.
    • Se așteaptă evenimentele de mutație pe pagină.
  • Multe metode și clase depreciate vor fi, de asemenea, șterse.

Notă: Puteți obține o versiune Alpha a Selenium 4 din depozitul Maven. Este foarte recomandat să încercați acest lucru în cadrul actualului dvs. (în mod ideal, pe o ramură sandbox), așa că sunteți pregătit pentru schimbare.

Concluzie

În acest articol, am acoperit câteva domenii în care mi-am îmbunătățit cadrul de automatizare a testelor în bine. Acum este mai stabil și mai utilizabil decât înainte, ceea ce va avea un impact pozitiv asupra tuturor celor implicați în ciclul de viață de livrare a software-ului.

Efectuarea modificărilor pe care le-am subliniat mai sus este un început bun, totuși, vă recomand să vă revizuiți întregul cadru pentru „puncte dure”, deoarece pot exista îmbunătățiri pe care nu le-am acoperit. De exemplu, utilizați WebDriver Manager pentru a vă gestiona driverele sau le actualizați în continuare manual?

De asemenea, aș recomanda să stabiliți o dată pentru a face acest lucru cel puțin o dată pe an, deși în mod ideal ar fi o dată la șase luni. În articol, am inclus modificările care vin în Selenium 4.0. Vă rugăm să revizuiți singur versiunile alpha ale Selenium. Schimbările vor fi dramatice și va trebui să fii pregătit. Sper că ați găsit acest lucru util. Dacă descoperiți metode sau tehnici noi în timp ce faceți un pic de curățare de primăvară pe cadrul dvs., vă rugăm să le împărtășiți altor cititori ai acestui blog, adăugându-le la secțiunea de comentarii de mai jos.

De asemenea, dacă doriți să aruncați o privire asupra testelor automate în Selenium și a modului în care puteți utiliza modelele de obiecte de pagină pentru a scrie rutine de testare care pot fi întreținute și reutilizabile, consultați Automatizarea în Selenium: modelul de obiecte de pagină și fabrica de pagini .

Înrudit: Limbajul Dart: Când Java și C# nu sunt suficient de clare