Sveobuhvatan vodič za Cypress, moćan radni okvir za end-to-end testiranje, koji pokriva instalaciju, pisanje testova, ispravljanje pogrešaka, CI/CD integraciju i najbolje prakse.
Cypress: Vrhunski vodič za end-to-end testiranje web aplikacija
U današnjem svijetu web razvoja koji se brzo mijenja, osiguravanje kvalitete i pouzdanosti web aplikacija od presudne je važnosti. End-to-End (E2E) testiranje igra ključnu ulogu u provjeri da sve komponente aplikacije besprijekorno rade zajedno iz korisničke perspektive. Cypress se pojavio kao vodeći radni okvir za E2E testiranje, nudeći iskustvo prilagođeno developerima, moćne značajke i izvrsne performanse. Ovaj sveobuhvatni vodič provest će vas kroz sve što trebate znati kako biste započeli s Cypressom i učinkovito testirali svoje web aplikacije.
Što je Cypress?
Cypress je alat za testiranje front-enda nove generacije, izrađen za moderni web. Za razliku od tradicionalnih radnih okvira za testiranje koji pokreću testove u pregledniku, Cypress radi izravno u pregledniku, dajući vam neusporedivu kontrolu i vidljivost ponašanja vaše aplikacije. Dizajniran je da bude brz, pouzdan i jednostavan za korištenje, što ga čini popularnim izborom među developerima i QA inženjerima diljem svijeta. Cypress je napisan u JavaScriptu i izvršava se unutar preglednika, što ga čini vrlo učinkovitim i nudi neusporediv pristup unutarnjim dijelovima aplikacije.
Ključne prednosti korištenja Cypressa
- Prilagođen developerima: Cypress pruža čist i intuitivan API, što olakšava pisanje i ispravljanje pogrešaka u testovima.
- Putovanje kroz vrijeme: Cypress snima snimke stanja vaše aplikacije tijekom svake testne naredbe, omogućujući vam da se vratite u prošlost i vidite što se točno dogodilo u bilo kojem trenutku.
- Ponovno učitavanje u stvarnom vremenu: Cypress se automatski ponovno učitava kada napravite promjene u svojim testovima, pružajući trenutne povratne informacije.
- Automatsko čekanje: Cypress automatski čeka da elementi postanu vidljivi ili interaktivni prije izvođenja radnji, eliminirajući potrebu za eksplicitnim čekanjem.
- Kontrola mreže: Cypress vam omogućuje da "stubate" mrežne zahtjeve i odgovore, što vam omogućuje simulaciju različitih scenarija i testiranje rukovanja pogreškama u vašoj aplikaciji.
- Mogućnost ispravljanja pogrešaka: Cypress pruža izvrsne alate za ispravljanje pogrešaka, uključujući moćan debugger i detaljne poruke o pogreškama.
- Testiranje na više preglednika: Cypress podržava više preglednika, uključujući Chrome, Firefox, Edge i Electron.
- Headless testiranje: Pokrenite testove u "headless" načinu rada za brže izvršavanje u CI/CD okruženjima.
- Ugrađene provjere (assertions): Cypress pruža bogat skup ugrađenih provjera za potvrđivanje očekivanog ponašanja vaše aplikacije.
Instalacija i postavljanje
Početak rada s Cypressom je jednostavan. Evo kako ga instalirati:
- Preduvjeti: Provjerite imate li Node.js i npm (Node Package Manager) instalirane na vašem sustavu. Možete ih preuzeti s službene web stranice Node.js.
- Instalirajte Cypress: Otvorite svoj terminal ili naredbeni redak, idite u direktorij vašeg projekta i pokrenite sljedeću naredbu:
- Otvorite Cypress: Nakon što je instalacija dovršena, možete otvoriti Cypress Test Runner pokretanjem:
npm install cypress --save-dev
npx cypress open
Ova naredba će pokrenuti Cypress Test Runner, koji pruža grafičko sučelje za pokretanje i ispravljanje pogrešaka u vašim testovima.
Pisanje vašeg prvog Cypress testa
Kreirajmo jednostavan test kako bismo provjerili da se početna stranica web stranice ispravno učitava. Stvorite novu datoteku pod nazivom `example.cy.js` u `cypress/e2e` direktoriju vašeg projekta.
// cypress/e2e/example.cy.js
describe('Moj prvi test', () => {
it('Posjećuje 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')
})
})
Raščlanimo ovaj test:
- `describe()`: Definira skup testova, što je zbirka povezanih testova.
- `it()`: Definira pojedinačni testni slučaj unutar skupa testova.
- `cy.visit()`: Odlazi na navedeni URL.
- `cy.contains()`: Pronalazi element koji sadrži navedeni tekst.
- `.click()`: Klika na odabrani element.
- `cy.url()`: Dohvaća trenutni URL stranice.
- `.should()`: Postavlja provjeru (assertion) o stanju aplikacije.
- `cy.get()`: Odabire element pomoću CSS selektora.
- `.type()`: Unosi tekst u odabrani element.
- `.should('have.value', 'fake@email.com')`: Provjerava je li vrijednost elementa jednaka 'fake@email.com'.
Pokrenite ovaj test u Cypress Test Runneru da ga vidite na djelu. Trebali biste vidjeti kako preglednik odlazi na web stranicu Cypress Kitchen Sink, klika na poveznicu "type" i provjerava URL.
Cypress naredbe
Cypress pruža širok raspon naredbi za interakciju s vašom aplikacijom. Evo nekih od najčešće korištenih naredbi:
- `cy.visit(url)`: Odlazi na navedeni URL.
- `cy.get(selector)`: Odabire element pomoću CSS selektora.
- `cy.contains(content)`: Odabire element koji sadrži navedeni tekst.
- `cy.click()`: Klika na odabrani element.
- `cy.type(text)`: Unosi tekst u odabrani element.
- `cy.clear()`: Briše sadržaj input ili textarea elementa.
- `cy.submit()`: Šalje obrazac.
- `cy.check()`: Označava checkbox ili radio gumb.
- `cy.uncheck()`: Poništava oznaku checkboxa.
- `cy.select(value)`: Odabire opciju iz padajućeg izbornika.
- `cy.scrollTo(position)`: Pomiče stranicu na navedeni položaj.
- `cy.trigger(event)`: Pokreće DOM događaj na odabranom elementu.
- `cy.request(url, options)`: Šalje HTTP zahtjev na navedeni URL.
- `cy.intercept(route, handler)`: Presreće HTTP zahtjeve koji odgovaraju navedenoj ruti.
- `cy.wait(time)`: Čeka navedeno vrijeme.
- `cy.reload()`: Ponovno učitava trenutnu stranicu.
- `cy.go(direction)`: Odlazi na prethodnu ili sljedeću stranicu u povijesti preglednika.
- `cy.url()`: Dohvaća trenutni URL stranice.
- `cy.title()`: Dohvaća naslov stranice.
- `cy.window()`: Dohvaća window objekt.
- `cy.document()`: Dohvaća document objekt.
- `cy.viewport(width, height)`: Postavlja veličinu prikaza (viewport).
Ovo je samo nekoliko od mnogih naredbi dostupnih u Cypressu. Pogledajte Cypress dokumentaciju za potpuni popis naredbi i njihovih opcija.
Provjere (Assertions) u Cypressu
Provjere se koriste za potvrđivanje očekivanog ponašanja vaše aplikacije. Cypress pruža bogat skup ugrađenih provjera koje možete koristiti za provjeru stanja elemenata, URL-a, naslova i još mnogo toga. Provjere se nadovezuju na Cypress naredbe pomoću metode `.should()`.
Evo nekoliko uobičajenih primjera provjera:
- `.should('be.visible')`: Provjerava je li element vidljiv.
- `.should('not.be.visible')`: Provjerava je li element nevidljiv.
- `.should('be.enabled')`: Provjerava je li element omogućen.
- `.should('be.disabled')`: Provjerava je li element onemogućen.
- `.should('have.text', 'očekivani tekst')`: Provjerava ima li element navedeni tekst.
- `.should('contain', 'očekivani tekst')`: Provjerava sadrži li element navedeni tekst.
- `.should('have.value', 'očekivana vrijednost')`: Provjerava ima li element navedenu vrijednost.
- `.should('have.class', 'očekivana klasa')`: Provjerava ima li element navedenu klasu.
- `.should('have.attr', 'ime atributa', 'očekivana vrijednost')`: Provjerava ima li element navedeni atribut i vrijednost.
- `.should('have.css', 'css svojstvo', 'očekivana vrijednost')`: Provjerava ima li element navedeno CSS svojstvo i vrijednost.
- `.should('have.length', očekivana duljina)`: Provjerava ima li element navedenu duljinu (npr. broj elemenata u listi).
Također možete stvoriti prilagođene provjere koje odgovaraju vašim specifičnim potrebama.
Najbolje prakse za pisanje Cypress testova
Slijeđenje najboljih praksi može vam pomoći da pišete Cypress testove koji su lakši za održavanje, pouzdaniji i učinkovitiji. Evo nekoliko preporuka:
- Pišite jasne i sažete testove: Svaki test trebao bi se usredotočiti na određenu funkcionalnost ili scenarij. Izbjegavajte pisanje previše složenih testova koje je teško razumjeti i održavati.
- Koristite smislena imena za testove: Dajte svojim testovima opisna imena koja jasno ukazuju na ono što testiraju.
- Izbjegavajte tvrdo kodiranje vrijednosti: Koristite varijable ili konfiguracijske datoteke za pohranu vrijednosti koje se mogu mijenjati tijekom vremena.
- Koristite prilagođene naredbe: Stvorite prilagođene naredbe kako biste saželi višekratnu logiku i učinili svoje testove čitljivijima.
- Izolirajte testove: Svaki test trebao bi biti neovisan o drugim testovima. Izbjegavajte oslanjanje na stanje aplikacije iz prethodnih testova.
- Očistite nakon testova: Vratite stanje aplikacije na početno nakon svakog testa kako biste osigurali da sljedeći testovi započinju s čistog stanja.
- Koristite data atribute: Koristite data atribute (npr. `data-testid`) za odabir elemenata u svojim testovima. Data atributi se rjeđe mijenjaju od CSS klasa ili ID-ova, što vaše testove čini otpornijima na promjene u korisničkom sučelju.
- Izbjegavajte eksplicitna čekanja: Cypress automatski čeka da elementi postanu vidljivi ili interaktivni. Izbjegavajte korištenje eksplicitnih čekanja (npr. `cy.wait()`) osim ako je to apsolutno neophodno.
- Testirajte korisničke tokove: Usredotočite se na testiranje korisničkih tokova umjesto pojedinačnih komponenti. To će vam pomoći da osigurate da vaša aplikacija ispravno radi iz korisničke perspektive.
- Redovito pokrećite testove: Integrirajte Cypress testove u svoj CI/CD proces i redovito ih pokrećite kako biste rano otkrili pogreške u razvojnom procesu.
Napredne Cypress tehnike
Stubbing i Mocking
Cypress vam omogućuje da "stubate" mrežne zahtjeve i odgovore, što vam omogućuje simulaciju različitih scenarija i testiranje rukovanja pogreškama u vašoj aplikaciji. Ovo je posebno korisno za testiranje značajki koje se oslanjaju na vanjske API-je ili usluge.
Da biste "stubali" mrežni zahtjev, možete koristiti naredbu `cy.intercept()`. Na primjer, kod ispod "stuba" GET zahtjev na `/api/users` i vraća lažni odgovor:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
]
}).as('getUsers')
Zatim možete čekati presretnuti zahtjev pomoću `cy.wait('@getUsers')` i provjeriti da vaša aplikacija ispravno obrađuje lažni odgovor.
Rad s Local Storageom i kolačićima (Cookies)
Cypress pruža naredbe za interakciju s lokalnom pohranom i kolačićima. Možete koristiti ove naredbe za postavljanje, dohvaćanje i brisanje lokalne pohrane i kolačića u svojim testovima.
Da biste postavili stavku u lokalnoj pohrani, možete koristiti naredbu `cy.window()` za pristup window objektu, a zatim koristiti metodu `localStorage.setItem()`. Na primjer:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
Da biste dohvatili stavku iz lokalne pohrane, možete koristiti naredbu `cy.window()`, a zatim koristiti metodu `localStorage.getItem()`. Na primjer:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
Da biste postavili kolačić, možete koristiti naredbu `cy.setCookie()`. Na primjer:
cy.setCookie('myCookie', 'myCookieValue')
Da biste dohvatili kolačić, možete koristiti naredbu `cy.getCookie()`. Na primjer:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Rukovanje prijenosom datoteka
Cypress pruža dodatak pod nazivom `cypress-file-upload` koji pojednostavljuje prijenos datoteka u vašim testovima. Da biste instalirali dodatak, pokrenite sljedeću naredbu:
npm install -D cypress-file-upload
Zatim dodajte sljedeći redak u svoju `cypress/support/commands.js` datoteku:
import 'cypress-file-upload';
Zatim možete koristiti naredbu `cy.uploadFile()` za prijenos datoteke. Na primjer:
cy.get('input[type="file"]').attachFile('example.txt')
Rad s IFrameovima
Testiranje IFrameova može biti komplicirano, ali Cypress pruža način za interakciju s njima. Možete koristiti naredbu `cy.frameLoaded()` da pričekate da se IFrame učita, a zatim koristiti naredbu `cy.iframe()` da biste dobili document objekt IFramea.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
Cypress i kontinuirana integracija/kontinuirana isporuka (CI/CD)
Integracija Cypressa u vaš CI/CD proces ključna je za osiguravanje kvalitete vaše aplikacije. Cypress testove možete pokrenuti u "headless" načinu rada u vašem CI/CD okruženju. Evo kako:
- Instalirajte Cypress: Osigurajte da je Cypress instaliran kao ovisnost u vašem projektu.
- Konfigurirajte CI/CD: Konfigurirajte svoj CI/CD proces za pokretanje Cypress testova nakon svakog builda.
- Pokrenite Cypress u "headless" načinu: Koristite naredbu `cypress run` za pokretanje Cypress testova u "headless" načinu.
Primjer CI/CD konfiguracije (koristeći GitHub Actions):
name: Cypress Testovi
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: Instaliraj ovisnosti
run: npm install
- name: Pokreni Cypress
uses: cypress-io/github-action@v5
with:
start: npm start
wait-on: 'http://localhost:3000'
Ova konfiguracija će pokrenuti Cypress testove svaki put kada se kod pošalje na `main` granu ili se stvori pull request prema `main` grani. Akcija `cypress-io/github-action` pojednostavljuje proces pokretanja Cypress testova u GitHub Actions.
Ispravljanje pogrešaka (Debugging) u Cypress testovima
Cypress pruža izvrsne alate za ispravljanje pogrešaka koji vam pomažu identificirati i popraviti probleme u vašim testovima. Evo nekoliko savjeta za ispravljanje pogrešaka u Cypress testovima:
- Koristite Cypress Test Runner: Cypress Test Runner pruža vizualno sučelje za pokretanje i ispravljanje pogrešaka u vašim testovima. Možete prolaziti kroz svoje testove naredbu po naredbu, pregledavati stanje aplikacije i vidjeti detaljne poruke o pogreškama.
- Koristite naredbu `cy.pause()`: Naredba `cy.pause()` zaustavlja izvršavanje vašeg testa i omogućuje vam da pregledate stanje aplikacije u developerskim alatima preglednika.
- Koristite naredbu `cy.debug()`: Naredba `cy.debug()` ispisuje odabrani element u konzolu, omogućujući vam da pregledate njegova svojstva i atribute.
- Koristite developerske alate preglednika: Developerski alati preglednika pružaju obilje informacija o vašoj aplikaciji, uključujući DOM, mrežne zahtjeve i zapise u konzoli.
- Pažljivo čitajte poruke o pogreškama: Cypress pruža detaljne poruke o pogreškama koje vam mogu pomoći da identificirate uzrok pogreške. Obratite pozornost na poruku o pogrešci i stack trace.
Cypress u usporedbi s drugim radnim okvirima za testiranje
Iako je Cypress moćan radni okvir za end-to-end testiranje, važno je razumjeti kako se uspoređuje s drugim popularnim opcijama. Evo kratkog pregleda:
- Selenium: Selenium je široko korišten radni okvir za automatizirano testiranje. Iako je fleksibilan i podržava više jezika, može biti složen za postavljanje i održavanje. Cypress nudi jednostavnije iskustvo prilagođeno developerima, posebno za aplikacije temeljene na JavaScriptu.
- Puppeteer: Puppeteer je Node biblioteka koja pruža API visoke razine za upravljanje headless Chromeom ili Chromiumom. Izvrstan je za prikupljanje podataka i automatizaciju zadataka u pregledniku, ali može zahtijevati više ručne konfiguracije u usporedbi s Cypressom za end-to-end testiranje.
- Playwright: Playwright je još jedan radni okvir za automatizaciju na više preglednika koji je razvio Microsoft. Dijeli sličnosti s Puppeteerom, ali nudi širu podršku za preglednike. Cypress ima jedinstveni debugger s "putovanjem kroz vrijeme" i integriranije iskustvo testiranja.
Izbor radnog okvira ovisi o specifičnim potrebama i zahtjevima vašeg projekta. Cypress je izvrstan izbor za moderne web aplikacije koje zahtijevaju brzo, pouzdano i developerima prilagođeno end-to-end testiranje.
Primjeri iz stvarnog svijeta korištenja Cypressa
Istražimo nekoliko primjera iz stvarnog svijeta o tome kako se Cypress može koristiti za testiranje različitih vrsta web aplikacija:
Testiranje e-commerce aplikacije
Možete koristiti Cypress za testiranje različitih korisničkih tokova u e-commerce aplikaciji, kao što su:
- Pretraživanje proizvoda
- Dodavanje proizvoda u košaricu
- Plaćanje i slanje narudžbe
- Upravljanje postavkama računa
Evo primjera Cypress testa koji provjerava može li korisnik uspješno dodati proizvod u svoju košaricu:
it('Dodaje proizvod u košaricu', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Testiranje aplikacije za društvene mreže
Možete koristiti Cypress za testiranje interakcija korisnika u aplikaciji za društvene mreže, kao što su:
- Stvaranje nove objave
- Lajkanje objave
- Komentiranje objave
- Praćenje drugih korisnika
Evo primjera Cypress testa koji provjerava može li korisnik uspješno stvoriti novu objavu:
it('Stvara novu objavu', () => {
cy.visit('/profile')
cy.get('#new-post-textarea').type('Pozdrav, svijete!')
cy.get('#submit-post-button').click()
cy.get('.post').first().should('contain', 'Pozdrav, svijete!')
})
Testiranje bankarske aplikacije
Za bankarske aplikacije, Cypress se može koristiti za testiranje ključnih funkcionalnosti kao što su:
- Sigurna prijava
- Provjera stanja računa
- Prijenos sredstava
- Upravljanje primateljima
Test za provjeru prijenosa sredstava mogao bi izgledati ovako (s odgovarajućim "stubbingom" radi sigurnosti):
it('Uspješno prenosi sredstva', () => {
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')
})
Zaključak
Cypress je moćan i svestran radni okvir za end-to-end testiranje koji vam može pomoći osigurati kvalitetu i pouzdanost vaših web aplikacija. Njegov developerima prilagođen API, moćne značajke i izvrsne performanse čine ga popularnim izborom među developerima i QA inženjerima diljem svijeta. Slijedeći najbolje prakse navedene u ovom vodiču, možete pisati učinkovite Cypress testove koji će vam pomoći da rano otkrijete pogreške u razvojnom procesu i isporučite visokokvalitetni softver svojim korisnicima.
Kako se web aplikacije nastavljaju razvijati, važnost end-to-end testiranja samo će rasti. Prihvaćanje Cypressa i njegova integracija u vaš razvojni tijek rada osnažit će vas da gradite robusnija, pouzdanija i korisnicima prilagođena web iskustva.