Un ghid complet despre Cypress, puternicul framework de testare end-to-end, care acoperă instalarea, scrierea testelor, depanarea, integrarea CI/CD și cele mai bune practici.
Cypress: Ghidul Complet de Testare End-to-End pentru Aplicații Web
În peisajul actual al dezvoltării web, aflat în evoluție rapidă, asigurarea calității și fiabilității aplicațiilor web este primordială. Testarea End-to-End (E2E) joacă un rol crucial în verificarea faptului că toate componentele unei aplicații funcționează perfect împreună din perspectiva utilizatorului. Cypress s-a impus ca un framework de testare E2E de top, oferind o experiență prietenoasă pentru dezvoltatori, funcționalități puternice și performanțe excelente. Acest ghid complet vă va prezenta tot ce trebuie să știți pentru a începe cu Cypress și pentru a testa eficient aplicațiile dvs. web.
Ce este Cypress?
Cypress este un instrument de testare front-end de ultimă generație, construit pentru web-ul modern. Spre deosebire de framework-urile de testare tradiționale care rulează teste într-un browser, Cypress operează direct în browser, oferindu-vă control și vizibilitate fără precedent asupra comportamentului aplicației dvs. Este conceput pentru a fi rapid, fiabil și ușor de utilizat, ceea ce îl face o alegere populară în rândul dezvoltatorilor și inginerilor QA din întreaga lume. Cypress este scris în JavaScript și se execută în interiorul browserului, ceea ce îl face foarte performant și oferă acces de neegalat la elementele interne ale aplicației.
Beneficiile Cheie ale Utilizării Cypress
- Prietenoas pentru Dezvoltatori: Cypress oferă un API curat și intuitiv, facilitând scrierea și depanarea testelor.
- Călătorie în Timp: Cypress face instantanee ale stării aplicației dvs. în timpul fiecărei comenzi de test, permițându-vă să vă întoarceți în timp și să vedeți exact ce s-a întâmplat în orice moment.
- Reîncărcări în Timp Real: Cypress se reîncarcă automat atunci când faceți modificări la teste, oferind feedback instantaneu.
- Așteptare Automată: Cypress așteaptă automat ca elementele să devină vizibile sau interactive înainte de a efectua acțiuni, eliminând necesitatea așteptărilor explicite.
- Controlul Rețelei: Cypress vă permite să simulați cererile și răspunsurile de rețea, permițându-vă să simulați diferite scenarii și să testați gestionarea erorilor aplicației.
- Capacitate de Depanare: Cypress oferă instrumente excelente de depanare, inclusiv un depanator puternic și mesaje de eroare detaliate.
- Testare Cross-Browser: Cypress suportă mai multe browsere, inclusiv Chrome, Firefox, Edge și Electron.
- Testare Headless: Rulați teste în modul headless pentru o execuție mai rapidă în mediile CI/CD.
- Aserțiuni Integrate: Cypress oferă un set bogat de aserțiuni integrate pentru a verifica comportamentul așteptat al aplicației dvs.
Instalare și Configurare
Este simplu să începeți cu Cypress. Iată cum să îl instalați:
- Cerințe Preliminare: Asigurați-vă că aveți Node.js și npm (Node Package Manager) instalate pe sistemul dvs. Le puteți descărca de pe site-ul oficial Node.js.
- Instalați Cypress: Deschideți terminalul sau linia de comandă, navigați la directorul proiectului dvs. și rulați următoarea comandă:
- Deschideți Cypress: Odată ce instalarea este finalizată, puteți deschide Cypress Test Runner rulând:
npm install cypress --save-dev
npx cypress open
Această comandă va lansa Cypress Test Runner, care oferă o interfață grafică pentru rularea și depanarea testelor dvs.
Scrierea Primului Test Cypress
Să creăm un test simplu pentru a verifica dacă pagina principală a unui site web se încarcă corect. Creați un fișier nou numit `example.cy.js` în directorul `cypress/e2e` al proiectului dvs.
// cypress/e2e/example.cy.js
describe('Primul Meu Test', () => {
it('Vizitează Kitchen Sink', () => {
cy.visit('https://example.cypress.io')
cy.contains('type').click()
cy.url().should('include', '/commands/actions')
cy.get('.action-email')
.type('fake@email.com')
.should('have.value', 'fake@email.com')
})
})
Să analizăm acest test:
- `describe()`: definește o suită de teste, care este o colecție de teste înrudite.
- `it()`: definește un caz de test individual în cadrul suitei de teste.
- `cy.visit()`: navighează la URL-ul specificat.
- `cy.contains()`: găsește un element care conține textul specificat.
- `.click()`: dă clic pe elementul selectat.
- `cy.url()`: obține URL-ul curent al paginii.
- `.should()`: face o aserțiune despre starea aplicației.
- `cy.get()`: selectează un element folosind un selector CSS.
- `.type()`: introduce text în elementul selectat.
- `.should('have.value', 'fake@email.com')`: afirmă că valoarea elementului este egală cu 'fake@email.com'.
Rulați acest test în Cypress Test Runner pentru a-l vedea în acțiune. Ar trebui să vedeți browserul navigând la site-ul Cypress Kitchen Sink, dând clic pe linkul "type" și verificând URL-ul.
Comenzi Cypress
Cypress oferă o gamă largă de comenzi pentru a interacționa cu aplicația dvs. Iată câteva dintre cele mai utilizate comenzi:
- `cy.visit(url)`: Navighează la URL-ul specificat.
- `cy.get(selector)`: Selectează un element folosind un selector CSS.
- `cy.contains(content)`: Selectează un element care conține textul specificat.
- `cy.click()`: Dă clic pe elementul selectat.
- `cy.type(text)`: Introduce text în elementul selectat.
- `cy.clear()`: Golește conținutul unui element de tip input sau textarea.
- `cy.submit()`: Trimite un formular.
- `cy.check()`: Bifează o casetă de selectare sau un buton radio.
- `cy.uncheck()`: Debifează o casetă de selectare.
- `cy.select(value)`: Selectează o opțiune dintr-o listă derulantă.
- `cy.scrollTo(position)`: Derulează pagina la poziția specificată.
- `cy.trigger(event)`: Declanșează un eveniment DOM pe elementul selectat.
- `cy.request(url, options)`: Face o cerere HTTP la URL-ul specificat.
- `cy.intercept(route, handler)`: Interceptează cererile HTTP care corespund rutei specificate.
- `cy.wait(time)`: Așteaptă o perioadă specificată de timp.
- `cy.reload()`: Reîncarcă pagina curentă.
- `cy.go(direction)`: Navighează la pagina anterioară sau următoare din istoricul browserului.
- `cy.url()`: Obține URL-ul curent al paginii.
- `cy.title()`: Obține titlul paginii.
- `cy.window()`: Obține obiectul window.
- `cy.document()`: Obține obiectul document.
- `cy.viewport(width, height)`: Setează dimensiunea viewport-ului.
Acestea sunt doar câteva dintre multele comenzi disponibile în Cypress. Consultați documentația Cypress pentru o listă completă de comenzi și opțiunile acestora.
Aserțiuni în Cypress
Aserțiunile sunt folosite pentru a verifica comportamentul așteptat al aplicației dvs. Cypress oferă un set bogat de aserțiuni integrate pe care le puteți utiliza pentru a verifica starea elementelor, URL-ul, titlul și multe altele. Aserțiunile sunt înlănțuite după comenzile Cypress folosind metoda `.should()`.
Iată câteva exemple comune de aserțiuni:
- `.should('be.visible')`: Afirmă că un element este vizibil.
- `.should('not.be.visible')`: Afirmă că un element nu este vizibil.
- `.should('be.enabled')`: Afirmă că un element este activat.
- `.should('be.disabled')`: Afirmă că un element este dezactivat.
- `.should('have.text', 'expected text')`: Afirmă că un element are textul specificat.
- `.should('contain', 'expected text')`: Afirmă că un element conține textul specificat.
- `.should('have.value', 'expected value')`: Afirmă că un element are valoarea specificată.
- `.should('have.class', 'expected class')`: Afirmă că un element are clasa specificată.
- `.should('have.attr', 'attribute name', 'expected value')`: Afirmă că un element are atributul și valoarea specificate.
- `.should('have.css', 'css property', 'expected value')`: Afirmă că un element are proprietatea CSS și valoarea specificate.
- `.should('have.length', expected length)`: Afirmă că un element are lungimea specificată (de ex., numărul de elemente dintr-o listă).
Puteți, de asemenea, să creați aserțiuni personalizate pentru a se potrivi nevoilor dvs. specifice.
Cele Mai Bune Practici pentru Scrierea Testelor Cypress
Urmarea celor mai bune practici vă poate ajuta să scrieți teste Cypress mai ușor de întreținut, mai fiabile și mai eficiente. Iată câteva recomandări:
- Scrieți Teste Clare și Concise: Fiecare test ar trebui să se concentreze pe o funcționalitate sau un scenariu specific. Evitați scrierea de teste prea complexe, care sunt dificil de înțeles și de întreținut.
- Utilizați Nume de Teste Semnificative: Dați testelor dvs. nume descriptive care indică clar ce testează.
- Evitați Valorile Hardcodate: Utilizați variabile sau fișiere de configurare pentru a stoca valori care se pot schimba în timp.
- Utilizați Comenzi Personalizate: Creați comenzi personalizate pentru a încapsula logica reutilizabilă și pentru a face testele mai lizibile.
- Izolați Testele: Fiecare test ar trebui să fie independent de alte teste. Evitați să vă bazați pe starea aplicației din testele anterioare.
- Curățați După Teste: Resetați starea aplicației după fiecare test pentru a vă asigura că testele ulterioare pornesc de la o stare curată.
- Utilizați Atribute de Date: Utilizați atribute de date (de ex., `data-testid`) pentru a selecta elemente în testele dvs. Atributele de date sunt mai puțin susceptibile de a se schimba decât clasele CSS sau ID-urile, făcând testele mai rezistente la modificările din UI.
- Evitați Așteptările Explicite: Cypress așteaptă automat ca elementele să devină vizibile sau interactive. Evitați utilizarea așteptărilor explicite (de ex., `cy.wait()`) decât dacă este absolut necesar.
- Testați Fluxurile Utilizatorilor: Concentrați-vă pe testarea fluxurilor utilizatorilor, mai degrabă decât pe componente individuale. Acest lucru vă va ajuta să vă asigurați că aplicația funcționează corect din perspectiva utilizatorului.
- Rulați Testele în Mod Regulat: Integrați testele Cypress în pipeline-ul CI/CD și rulați-le regulat pentru a depista erorile devreme în procesul de dezvoltare.
Tehnici Avansate Cypress
Stubbing și Mocking
Cypress vă permite să simulați cererile și răspunsurile de rețea, permițându-vă să simulați diferite scenarii și să testați gestionarea erorilor aplicației. Acest lucru este deosebit de util pentru testarea funcționalităților care se bazează pe API-uri sau servicii externe.
Pentru a simula o cerere de rețea, puteți utiliza comanda `cy.intercept()`. De exemplu, codul de mai jos simulează o cerere GET către `/api/users` și returnează un răspuns mock:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
]
}).as('getUsers')
Puteți apoi aștepta cererea interceptată folosind `cy.wait('@getUsers')` și verifica dacă aplicația dvs. gestionează corect răspunsul mock.
Lucrul cu Local Storage și Cookies
Cypress oferă comenzi pentru a interacționa cu local storage și cookie-uri. Puteți utiliza aceste comenzi pentru a seta, obține și șterge local storage și cookie-uri în testele dvs.
Pentru a seta un element în local storage, puteți utiliza comanda `cy.window()` pentru a accesa obiectul window și apoi utilizați metoda `localStorage.setItem()`. De exemplu:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
Pentru a obține un element din local storage, puteți utiliza comanda `cy.window()` și apoi utilizați metoda `localStorage.getItem()`. De exemplu:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
Pentru a seta un cookie, puteți utiliza comanda `cy.setCookie()`. De exemplu:
cy.setCookie('myCookie', 'myCookieValue')
Pentru a obține un cookie, puteți utiliza comanda `cy.getCookie()`. De exemplu:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Gestionarea Încărcărilor de Fișiere
Cypress oferă un plugin numit `cypress-file-upload` care simplifică încărcarea fișierelor în testele dvs. Pentru a instala pluginul, rulați următoarea comandă:
npm install -D cypress-file-upload
Apoi, adăugați următoarea linie la fișierul dvs. `cypress/support/commands.js`:
import 'cypress-file-upload';
Puteți apoi utiliza comanda `cy.attachFile()` pentru a încărca un fișier. De exemplu:
cy.get('input[type="file"]').attachFile('example.txt')
Lucrul cu IFrames
Testarea IFrames poate fi dificilă, dar Cypress oferă o modalitate de a interacționa cu ele. Puteți utiliza comanda `cy.frameLoaded()` pentru a aștepta încărcarea unui IFrame și apoi utiliza comanda `cy.iframe()` pentru a obține obiectul document al IFrame-ului.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
Cypress și Integrare Continuă/Livrare Continuă (CI/CD)
Integrarea Cypress în pipeline-ul CI/CD este esențială pentru asigurarea calității aplicației dvs. Puteți rula teste Cypress în modul headless în mediul CI/CD. Iată cum:
- Instalați Cypress: Asigurați-vă că Cypress este instalat ca dependență în proiectul dvs.
- Configurați CI/CD: Configurați pipeline-ul CI/CD pentru a rula testele Cypress după fiecare build.
- Rulați Cypress Headlessly: Utilizați comanda `cypress run` pentru a rula testele Cypress în modul headless.
Exemplu de configurare CI/CD (folosind GitHub Actions):
name: Cypress Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Cypress run
uses: cypress-io/github-action@v5
with:
start: npm start
wait-on: 'http://localhost:3000'
Această configurație va rula testele Cypress ori de câte ori codul este împins în ramura `main` sau se creează un pull request către ramura `main`. Acțiunea `cypress-io/github-action` simplifică procesul de rulare a testelor Cypress în GitHub Actions.
Depanarea Testelor Cypress
Cypress oferă instrumente excelente de depanare pentru a vă ajuta să identificați și să remediați problemele din testele dvs. Iată câteva sfaturi pentru depanarea testelor Cypress:
- Utilizați Cypress Test Runner: Cypress Test Runner oferă o interfață vizuală pentru rularea și depanarea testelor. Puteți parcurge testele comandă cu comandă, inspecta starea aplicației și vizualiza mesaje de eroare detaliate.
- Utilizați Comanda `cy.pause()`: Comanda `cy.pause()` întrerupe execuția testului și vă permite să inspectați starea aplicației în instrumentele de dezvoltare ale browserului.
- Utilizați Comanda `cy.debug()`: Comanda `cy.debug()` afișează elementul selectat în consolă, permițându-vă să îi inspectați proprietățile și atributele.
- Utilizați Instrumentele de Dezvoltare ale Browserului: Instrumentele de dezvoltare ale browserului oferă o multitudine de informații despre aplicația dvs., inclusiv DOM-ul, cererile de rețea și logurile consolei.
- Citiți cu Atenție Mesajele de Eroare: Cypress oferă mesaje de eroare detaliate care vă pot ajuta să identificați cauza erorii. Acordați atenție mesajului de eroare și stack trace-ului.
Cypress vs. Alte Framework-uri de Testare
Deși Cypress este un puternic framework de testare end-to-end, este esențial să înțelegeți cum se compară cu alte opțiuni populare. Iată o scurtă prezentare generală:
- Selenium: Selenium este un framework de testare automată utilizat pe scară largă. Deși este flexibil și suportă mai multe limbaje, poate fi complex de configurat și întreținut. Cypress oferă o experiență mai simplă și mai prietenoasă pentru dezvoltatori, în special pentru aplicațiile bazate pe JavaScript.
- Puppeteer: Puppeteer este o bibliotecă Node care oferă un API de nivel înalt pentru controlul Chrome sau Chromium în modul headless. Este excelent pentru scraping și automatizarea sarcinilor din browser, dar poate necesita mai multă configurare manuală în comparație cu Cypress pentru testarea end-to-end.
- Playwright: Playwright este un alt framework de automatizare cross-browser dezvoltat de Microsoft. Împărtășește similitudini cu Puppeteer, dar oferă un suport mai larg pentru browsere. Cypress are un depanator unic de tip time-traveling și o experiență de testare mai integrată.
Alegerea framework-ului depinde de nevoile și cerințele specifice ale proiectului dvs. Cypress este o alegere excelentă pentru aplicațiile web moderne care necesită testare end-to-end rapidă, fiabilă și prietenoasă pentru dezvoltatori.
Exemple Reale de Cypress în Acțiune
Să explorăm câteva exemple din lumea reală despre cum poate fi utilizat Cypress pentru a testa diferite tipuri de aplicații web:
Testarea unei Aplicații de E-commerce
Puteți utiliza Cypress pentru a testa diverse fluxuri de utilizatori într-o aplicație de e-commerce, cum ar fi:
- Căutarea de produse
- Adăugarea produselor în coș
- Finalizarea comenzii și plasarea unei comenzi
- Gestionarea setărilor contului
Iată un exemplu de test Cypress care verifică dacă un utilizator poate adăuga cu succes un produs în coș:
it('Adaugă un produs în coș', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Testarea unei Aplicații de Social Media
Puteți utiliza Cypress pentru a testa interacțiunile utilizatorilor într-o aplicație de social media, cum ar fi:
- Crearea unei postări noi
- Aprecierea unei postări
- Comentarea la o postare
- Urmărirea altor utilizatori
Iată un exemplu de test Cypress care verifică dacă un utilizator poate crea cu succes o postare nouă:
it('Creează o postare nouă', () => {
cy.visit('/profile')
cy.get('#new-post-textarea').type('Hello, world!')
cy.get('#submit-post-button').click()
cy.get('.post').first().should('contain', 'Hello, world!')
})
Testarea unei Aplicații Bancare
Pentru aplicațiile bancare, Cypress poate fi utilizat pentru a testa funcționalități critice, cum ar fi:
- Autentificarea securizată
- Verificarea soldurilor conturilor
- Transferul de fonduri
- Gestionarea beneficiarilor
Un test pentru a verifica un transfer de fonduri ar putea arăta astfel (cu stubbing corespunzător pentru securitate):
it('Transferă fonduri cu succes', () => {
cy.visit('/transfer')
cy.get('#recipient-account').type('1234567890')
cy.get('#amount').type('100')
cy.intercept('POST', '/api/transfer', { statusCode: 200, body: { success: true } }).as('transfer')
cy.get('#transfer-button').click()
cy.wait('@transfer')
cy.get('.success-message').should('be.visible')
})
Concluzie
Cypress este un framework de testare end-to-end puternic și versatil, care vă poate ajuta să asigurați calitatea și fiabilitatea aplicațiilor dvs. web. API-ul său prietenos pentru dezvoltatori, funcționalitățile puternice și performanța excelentă îl fac o alegere populară în rândul dezvoltatorilor și inginerilor QA din întreaga lume. Urmând cele mai bune practici prezentate în acest ghid, puteți scrie teste Cypress eficiente care vă vor ajuta să depistați erorile devreme în procesul de dezvoltare și să livrați software de înaltă calitate utilizatorilor dvs.
Pe măsură ce aplicațiile web continuă să evolueze, importanța testării end-to-end va crește. Adoptarea Cypress și integrarea acestuia în fluxul de lucru de dezvoltare vă vor permite să construiți experiențe web mai robuste, fiabile și prietenoase cu utilizatorul.