Celovit vodnik za Cypress, zmogljivo ogrodje za testiranje od konca do konca, ki pokriva namestitev, pisanje testov, odpravljanje napak, integracijo CI/CD in najboljše prakse.
Cypress: Najboljši vodnik za testiranje od konca do konca za spletne aplikacije
V današnjem hitro razvijajočem se okolju spletnega razvoja je zagotavljanje kakovosti in zanesljivosti spletnih aplikacij najpomembnejše. Testiranje od konca do konca (E2E) ima ključno vlogo pri preverjanju, ali vse komponente aplikacije nemoteno delujejo skupaj z uporabniškega vidika. Cypress se je pojavil kot vodilno ogrodje za testiranje E2E, ki ponuja razvijalcem prijazno izkušnjo, zmogljive funkcije in odlično učinkovitost. Ta celovit vodnik vas bo vodil skozi vse, kar morate vedeti, da začnete s Cypressom in učinkovito testirate svoje spletne aplikacije.
Kaj je Cypress?
Cypress je orodje za testiranje sprednjega dela naslednje generacije, zasnovano za sodobno splet. Za razliko od tradicionalnih ogrodij za testiranje, ki izvajajo teste v brskalniku, Cypress deluje neposredno v brskalniku, kar vam daje neprimerljiv nadzor in vpogled v obnašanje vaše aplikacije. Zasnovan je tako, da je hiter, zanesljiv in enostaven za uporabo, zaradi česar je priljubljena izbira med razvijalci in inženirji QA po vsem svetu. Cypress je napisan v JavaScriptu in se izvaja v brskalniku, zaradi česar je zelo zmogljiv in ponuja neprimerljiv dostop do notranjih delov aplikacije.
Ključne prednosti uporabe Cypressa
- Razvijalcem prijazno: Cypress ponuja čist in intuitiven API, ki olajša pisanje in odpravljanje napak v testih.
- Potovanje skozi čas: Cypress posname posnetke stanja vaše aplikacije med vsakim testnim ukazom, kar vam omogoča, da se vrnete v preteklost in natančno vidite, kaj se je zgodilo v katerem koli trenutku.
- Osveževanja v realnem času: Cypress se samodejno osveži, ko spremenite svoje teste, kar zagotavlja takojšnje povratne informacije.
- Samodejno čakanje: Cypress samodejno počaka, da elementi postanejo vidni ali interaktivni, preden izvede dejanja, kar odpravlja potrebo po izrecnih čakanjih.
- Nadzor omrežja: Cypress vam omogoča, da ustvarite nadomestne zahteve in odzive omrežja, kar vam omogoča, da simulirate različne scenarije in preizkusite obravnavo napak v vaši aplikaciji.
- Možnost odpravljanja napak: Cypress ponuja odlična orodja za odpravljanje napak, vključno z zmogljivim razhroščevalnikom in podrobnimi sporočili o napakah.
- Testiranje v različnih brskalnikih: Cypress podpira več brskalnikov, vključno s Chromom, Firefoxom, Edgom in Electronom.
- Testiranje brez glave: Izvajajte teste v načinu brez glave za hitrejše izvajanje v okoljih CI/CD.
- Vgrajene trditve: Cypress ponuja bogat nabor vgrajenih trditev za preverjanje pričakovanega obnašanja vaše aplikacije.
Namestitev in nastavitev
Začetek s Cypressom je preprost. Tukaj je, kako ga namestiti:
- Predpogoji: Prepričajte se, da imate v sistemu nameščena Node.js in npm (Node Package Manager). Prenesete jih lahko s spletnega mesta Node.js.
- Namestite Cypress: Odprite terminal ali ukazni poziv, pojdite v imenik svojega projekta in zaženite naslednji ukaz:
- Odprite Cypress: Ko je namestitev končana, lahko odprete Cypress Test Runner z zagonom:
npm install cypress --save-dev
npx cypress open
Ta ukaz bo zagnal Cypress Test Runner, ki ponuja grafični vmesnik za izvajanje in odpravljanje napak v vaših testih.
Pisanje vašega prvega Cypress testa
Ustvarimo preprost test za preverjanje, ali se domača stran spletnega mesta pravilno naloži. Ustvarite novo datoteko z imenom `example.cy.js` v imeniku `cypress/e2e` vašega projekta.
// cypress/e2e/example.cy.js
describe('Moj prvi test', () => {
it('Obišče Kuhinjsko korito', () => {
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')
})
})
Razčlenimo ta test:
- `describe()`: Določa testni paket, ki je zbirka povezanih testov.
- `it()`: Določa posamezni testni primer znotraj testnega paketa.
- `cy.visit()`: Pomakne se na določen URL.
- `cy.contains()`: Poišče element, ki vsebuje določeno besedilo.
- `.click()`: Klikne na izbrani element.
- `cy.url()`: Pridobi trenutni URL strani.
- `.should()`: Izvede trditev o stanju aplikacije.
- `cy.get()`: Izbere element z uporabo CSS selektorja.
- `.type()`: Vnese besedilo v izbrani element.
- `.should('have.value', 'fake@email.com')`: Zatrdil, da je vrednost elementa enaka 'fake@email.com'.
Zaženite ta test v Cypress Test Runnerju, da ga vidite v akciji. Videti bi morali, da se brskalnik pomakne na spletno mesto Cypress Kitchen Sink, klikne na povezavo »type« in preveri URL.
Cypress Ukazi
Cypress ponuja široko paleto ukazov za interakcijo z vašo aplikacijo. Tukaj je nekaj najpogosteje uporabljenih ukazov:
- `cy.visit(url)`: Pomakne se na določen URL.
- `cy.get(selector)`: Izbere element z uporabo CSS selektorja.
- `cy.contains(content)`: Izbere element, ki vsebuje določeno besedilo.
- `cy.click()`: Klikne na izbrani element.
- `cy.type(text)`: Vnese besedilo v izbrani element.
- `cy.clear()`: Počisti vsebino vnosa ali elementa textarea.
- `cy.submit()`: Pošlje obrazec.
- `cy.check()`: Označi potrditveno polje ali izbirni gumb.
- `cy.uncheck()`: Odznači potrditveno polje.
- `cy.select(value)`: Izbere možnost iz spustnega menija.
- `cy.scrollTo(position)`: Pomakne stran na določen položaj.
- `cy.trigger(event)`: Sproži DOM dogodek na izbranem elementu.
- `cy.request(url, options)`: Pošlje HTTP zahtevo na določen URL.
- `cy.intercept(route, handler)`: Prestrezanje HTTP zahtev, ki ustrezajo določeni poti.
- `cy.wait(time)`: Počaka določeno količino časa.
- `cy.reload()`: Znova naloži trenutno stran.
- `cy.go(direction)`: Pomakne se na prejšnjo ali naslednjo stran v zgodovini brskalnika.
- `cy.url()`: Pridobi trenutni URL strani.
- `cy.title()`: Pridobi naslov strani.
- `cy.window()`: Pridobi objekt okna.
- `cy.document()`: Pridobi objekt dokumenta.
- `cy.viewport(width, height)`: Nastavi velikost okna za prikaz.
To je le nekaj od mnogih ukazov, ki so na voljo v Cypressu. Za popoln seznam ukazov in njihovih možnosti glejte dokumentacijo Cypress.
Trditve v Cypressu
Trditve se uporabljajo za preverjanje pričakovanega obnašanja vaše aplikacije. Cypress ponuja bogat nabor vgrajenih trditev, ki jih lahko uporabite za preverjanje stanja elementov, URL-ja, naslova in še več. Trditve so verižno povezane za ukazi Cypress z uporabo metode `.should()`.
Tukaj je nekaj pogostih primerov trditev:
- `.should('be.visible')`: Zatrdil, da je element viden.
- `.should('not.be.visible')`: Zatrdil, da element ni viden.
- `.should('be.enabled')`: Zatrdil, da je element omogočen.
- `.should('be.disabled')`: Zatrdil, da je element onemogočen.
- `.should('have.text', 'pričakovano besedilo')`: Zatrdil, da ima element določeno besedilo.
- `.should('contain', 'pričakovano besedilo')`: Zatrdil, da element vsebuje določeno besedilo.
- `.should('have.value', 'pričakovana vrednost')`: Zatrdil, da ima element določeno vrednost.
- `.should('have.class', 'pričakovani razred')`: Zatrdil, da ima element določen razred.
- `.should('have.attr', 'ime atributa', 'pričakovana vrednost')`: Zatrdil, da ima element določen atribut in vrednost.
- `.should('have.css', 'css lastnost', 'pričakovana vrednost')`: Zatrdil, da ima element določeno CSS lastnost in vrednost.
- `.should('have.length', pričakovana dolžina)`: Zatrdil, da ima element določeno dolžino (npr. število elementov na seznamu).
Ustvarite lahko tudi trditve po meri, ki ustrezajo vašim posebnim potrebam.
Najboljše prakse za pisanje Cypress testov
Upoštevanje najboljših praks vam lahko pomaga pisati bolj vzdržljive, zanesljive in učinkovite Cypress teste. Tukaj je nekaj priporočil:
- Pišite jasne in jedrnate teste: Vsak test se mora osredotočiti na določeno funkcionalnost ali scenarij. Izogibajte se pisanju preveč zapletenih testov, ki jih je težko razumeti in vzdrževati.
- Uporabite pomembna imena testov: Dajte svojim testom opisna imena, ki jasno označujejo, kaj testirajo.
- Izogibajte se trdim kodirnim vrednostim: Uporabite spremenljivke ali konfiguracijske datoteke za shranjevanje vrednosti, ki se lahko sčasoma spremenijo.
- Uporabite ukaze po meri: Ustvarite ukaze po meri za zajemanje logike za večkratno uporabo in naredite svoje teste bolj berljive.
- Izolirajte teste: Vsak test mora biti neodvisen od drugih testov. Izogibajte se zanašanju na stanje aplikacije iz prejšnjih testov.
- Počistite po testih: Ponastavite stanje aplikacije po vsakem testu, da zagotovite, da se naslednji testi začnejo iz čiste tablice.
- Uporabite atribute podatkov: Uporabite atribute podatkov (npr. `data-testid`) za izbiro elementov v vaših testih. Verjetnost, da se bodo atributi podatkov spremenili, je manjša kot pri CSS razredih ali ID-jih, zaradi česar so vaši testi bolj odporni na spremembe v uporabniškem vmesniku.
- Izogibajte se izrecnemu čakanju: Cypress samodejno počaka, da elementi postanejo vidni ali interaktivni. Izogibajte se uporabi izrecnega čakanja (npr. `cy.wait()`), razen če je to nujno potrebno.
- Testirajte uporabniške tokove: Osredotočite se na testiranje uporabniških tokov namesto posameznih komponent. To vam bo pomagalo zagotoviti, da vaša aplikacija pravilno deluje z uporabniškega vidika.
- Redno izvajajte teste: Integrirajte Cypress teste v svoj CI/CD cevovod in jih redno izvajajte, da ujamete napake zgodaj v procesu razvoja.
Napredne tehnike Cypress
Nadomeščanje in posnemanje
Cypress vam omogoča, da ustvarite nadomestne zahteve in odzive omrežja, kar vam omogoča, da simulirate različne scenarije in preizkusite obravnavo napak v vaši aplikaciji. To je še posebej uporabno za testiranje funkcij, ki so odvisne od zunanjih API-jev ali storitev.
Če želite ustvariti nadomestno zahtevo omrežja, lahko uporabite ukaz `cy.intercept()`. Na primer, spodnja koda ustvari nadomestek za GET zahtevo na `/api/users` in vrne posnet odziv:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
]
}).as('getUsers')
Nato lahko počakate na prestreženo zahtevo z uporabo `cy.wait('@getUsers')` in preverite, ali vaša aplikacija pravilno obravnava posnet odziv.
Delo z lokalnim pomnilnikom in piškotki
Cypress ponuja ukaze za interakcijo z lokalnim pomnilnikom in piškotki. Te ukaze lahko uporabite za nastavitev, pridobivanje in brisanje lokalnega pomnilnika in piškotkov v svojih testih.
Če želite nastaviti element lokalnega pomnilnika, lahko uporabite ukaz `cy.window()` za dostop do objekta okna in nato uporabite metodo `localStorage.setItem()`. Na primer:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
Če želite pridobiti element lokalnega pomnilnika, lahko uporabite ukaz `cy.window()` in nato uporabite metodo `localStorage.getItem()`. Na primer:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
Če želite nastaviti piškotek, lahko uporabite ukaz `cy.setCookie()`. Na primer:
cy.setCookie('myCookie', 'myCookieValue')
Če želite pridobiti piškotek, lahko uporabite ukaz `cy.getCookie()`. Na primer:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Obravnavanje nalaganja datotek
Cypress ponuja vtičnik, imenovan `cypress-file-upload`, ki poenostavlja nalaganje datotek v vaših testih. Če želite namestiti vtičnik, zaženite naslednji ukaz:
npm install -D cypress-file-upload
Nato dodajte naslednjo vrstico v svojo datoteko `cypress/support/commands.js`:
import 'cypress-file-upload';
Nato lahko uporabite ukaz `cy.uploadFile()` za nalaganje datoteke. Na primer:
cy.get('input[type="file"]').attachFile('example.txt')
Delo z IFrami
Testiranje IFramov je lahko zapleteno, vendar Cypress ponuja način za interakcijo z njimi. Uporabite lahko ukaz `cy.frameLoaded()` za čakanje, da se IFrame naloži, nato pa uporabite ukaz `cy.iframe()` za pridobitev objekta dokumenta IFrame.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
Cypress in neprekinjena integracija/neprekinjeno uvajanje (CI/CD)
Integracija Cypressa v vaš CI/CD cevovod je bistvena za zagotavljanje kakovosti vaše aplikacije. Cypress teste lahko izvajate v načinu brez glave v vašem okolju CI/CD. Tukaj je, kako:
- Namestite Cypress: Prepričajte se, da je Cypress nameščen kot odvisnost v vašem projektu.
- Konfigurirajte CI/CD: Konfigurirajte svoj CI/CD cevovod za izvajanje Cypress testov po vsaki gradnji.
- Zaženite Cypress brez glave: Uporabite ukaz `cypress run` za izvajanje Cypress testov v načinu brez glave.
Primer konfiguracije CI/CD (z uporabo 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'
Ta konfiguracija bo zagnala Cypress teste, kadar koli se koda potisne v vejo `main` ali se ustvari zahteva za vlečenje proti veji `main`. Dejanje `cypress-io/github-action` poenostavlja postopek izvajanja Cypress testov v GitHub Actions.
Odpravljanje napak v Cypress testih
Cypress ponuja odlična orodja za odpravljanje napak, ki vam pomagajo prepoznati in odpraviti težave v vaših testih. Tukaj je nekaj nasvetov za odpravljanje napak v Cypress testih:
- Uporabite Cypress Test Runner: Cypress Test Runner ponuja vizualni vmesnik za izvajanje in odpravljanje napak v vaših testih. Prehajate lahko skozi svoje teste en ukaz naenkrat, pregledujete stanje aplikacije in si ogledujete podrobna sporočila o napakah.
- Uporabite ukaz `cy.pause()`: Ukaz `cy.pause()` začasno ustavi izvajanje vašega testa in vam omogoča, da pregledate stanje aplikacije v orodjih za razvijalce brskalnika.
- Uporabite ukaz `cy.debug()`: Ukaz `cy.debug()` izpiše izbrani element v konzolo, kar vam omogoča, da pregledate njegove lastnosti in atribute.
- Uporabite orodja za razvijalce brskalnika: Orodja za razvijalce brskalnika ponujajo bogastvo informacij o vaši aplikaciji, vključno z DOM, zahtevami omrežja in dnevniki konzole.
- Pozorno preberite sporočila o napakah: Cypress ponuja podrobna sporočila o napakah, ki vam lahko pomagajo prepoznati vzrok napake. Bodite pozorni na sporočilo o napaki in sled skladov.
Cypress v primerjavi z drugimi ogrodji za testiranje
Čeprav je Cypress zmogljivo ogrodje za testiranje od konca do konca, je bistveno razumeti, kako se primerja z drugimi priljubljenimi možnostmi. Tukaj je kratek pregled:
- Selenium: Selenium je široko uporabljeno ogrodje za avtomatizacijo testiranja. Čeprav je prilagodljiv in podpira več jezikov, je lahko zapleten za nastavitev in vzdrževanje. Cypress ponuja preprostejšo in razvijalcem prijaznejšo izkušnjo, zlasti za aplikacije, ki temeljijo na JavaScriptu.
- Puppeteer: Puppeteer je knjižnica Node, ki ponuja API visoke ravni za nadzor Chrome ali Chromium brez glave. Odličen je za strganje in avtomatizacijo opravil brskalnika, vendar lahko zahteva več ročne konfiguracije v primerjavi s Cypressom za testiranje od konca do konca.
- Playwright: Playwright je še eno ogrodje za avtomatizacijo brskalnikov, ki ga je razvil Microsoft. Ima podobnosti s Puppeteerjem, vendar ponuja širšo podporo za brskalnike. Cypress ima edinstven razhroščevalnik za potovanje skozi čas in bolj integrirano izkušnjo testiranja.
Izbira ogrodja je odvisna od specifičnih potreb in zahtev vašega projekta. Cypress je odlična izbira za sodobne spletne aplikacije, ki zahtevajo hitro, zanesljivo in razvijalcem prijazno testiranje od konca do konca.
Primeri Cypressa v praksi iz resničnega sveta
Raziščimo nekaj primerov iz resničnega sveta, kako se lahko Cypress uporablja za testiranje različnih vrst spletnih aplikacij:
Testiranje aplikacije za e-trgovino
Cypress lahko uporabite za testiranje različnih uporabniških tokov v aplikaciji za e-trgovino, kot so:
- Iskanje izdelkov
- Dodajanje izdelkov v košarico
- Odjava in oddaja naročila
- Upravljanje nastavitev računa
Tukaj je primer Cypress testa, ki preveri, ali lahko uporabnik uspešno doda izdelek v svojo košarico:
it('Doda izdelek v košarico', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Testiranje aplikacije za družbene medije
Cypress lahko uporabite za testiranje uporabniških interakcij v aplikaciji za družbene medije, kot so:
- Ustvarjanje nove objave
- Všečkanje objave
- Komentiranje objave
- Sledenje drugim uporabnikom
Tukaj je primer Cypress testa, ki preveri, ali lahko uporabnik uspešno ustvari novo objavo:
it('Ustvari novo objavo', () => {
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!')
})
Testiranje bančne aplikacije
Za bančne aplikacije se lahko Cypress uporablja za testiranje kritičnih funkcij, kot so:
- Varna prijava
- Preverjanje stanja na računu
- Prenos sredstev
- Upravljanje upravičencev
Test za preverjanje uspešnega prenosa sredstev bi lahko izgledal takole (z ustreznim nadomeščanjem za varnost):
it('Uspešno prenese 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ček
Cypress je zmogljivo in vsestransko ogrodje za testiranje od konca do konca, ki vam lahko pomaga zagotoviti kakovost in zanesljivost vaših spletnih aplikacij. Zaradi razvijalcem prijaznega API-ja, zmogljivih funkcij in odlične učinkovitosti je priljubljena izbira med razvijalci in inženirji QA po vsem svetu. Z upoštevanjem najboljših praks, opisanih v tem vodniku, lahko pišete učinkovite Cypress teste, ki vam bodo pomagali ujeti napake zgodaj v procesu razvoja in dostaviti visokokakovostno programsko opremo svojim uporabnikom.
Ker se spletne aplikacije še naprej razvijajo, se bo pomembnost testiranja od konca do konca samo še povečala. Sprejetje Cypressa in integracija v vaš razvojni potek dela vam bosta omogočila, da ustvarite robustnejše, zanesljivejše in uporabnikom prijaznejše spletne izkušnje.