Išsamus vadovas apie „Cypress“ – galingą „end-to-end“ testavimo karkasą, apimantis diegimą, testų rašymą, derinimą, CI/CD integraciją ir geriausias praktikas.
Cypress: Išsamus „End-to-End“ testavimo vadovas žiniatinklio programoms
Šiuolaikiniame sparčiai besivystančiame žiniatinklio kūrimo pasaulyje, žiniatinklio programų kokybės ir patikimumo užtikrinimas yra svarbiausias prioritetas. „End-to-End“ (E2E) testavimas atlieka lemiamą vaidmenį tikrinant, ar visi programos komponentai sklandžiai veikia kartu iš vartotojo perspektyvos. „Cypress“ tapo pirmaujančiu E2E testavimo karkasu, siūlančiu kūrėjams draugišką patirtį, galingas funkcijas ir puikų našumą. Šis išsamus vadovas padės jums susipažinti su viskuo, ko reikia norint pradėti dirbti su „Cypress“ ir efektyviai testuoti savo žiniatinklio programas.
Kas yra „Cypress“?
„Cypress“ yra naujos kartos „front-end“ testavimo įrankis, sukurtas šiuolaikiniam žiniatinkliui. Skirtingai nuo tradicinių testavimo karkasų, kurie paleidžia testus naršyklėje, „Cypress“ veikia tiesiogiai naršyklėje, suteikdama jums neprilygstamą kontrolę ir matomumą jūsų programos elgsenoje. Jis sukurtas būti greitas, patikimas ir lengvai naudojamas, todėl yra populiarus pasirinkimas tarp kūrėjų ir kokybės užtikrinimo (QA) inžinierių visame pasaulyje. „Cypress“ parašytas JavaScript kalba ir vykdomas naršyklėje, todėl yra labai našus ir suteikia neprilygstamą prieigą prie programos vidinių mechanizmų.
Pagrindiniai „Cypress“ naudojimo privalumai
- Draugiškas kūrėjams: „Cypress“ siūlo aiškią ir intuityvią API, todėl lengva rašyti ir derinti testus.
- Laiko kelionė: „Cypress“ fiksuoja jūsų programos būsenos momentines nuotraukas kiekvienos testo komandos metu, leisdama jums grįžti laiku atgal ir pamatyti, kas tiksliai nutiko bet kuriuo momentu.
- Perkrovimai realiuoju laiku: „Cypress“ automatiškai perkrauna testus, kai atliekate pakeitimus, suteikdama momentinį grįžtamąjį ryšį.
- Automatinis laukimas: „Cypress“ automatiškai laukia, kol elementai taps matomi arba sąveikūs prieš atliekant veiksmus, todėl nereikia aiškiai nurodytų laukimo komandų.
- Tinklo valdymas: „Cypress“ leidžia imituoti tinklo užklausas ir atsakymus, suteikdama galimybę simuliuoti skirtingus scenarijus ir testuoti jūsų programos klaidų tvarkymą.
- Derinimo galimybės: „Cypress“ siūlo puikius derinimo įrankius, įskaitant galingą derintuvą ir išsamius klaidų pranešimus.
- Tarpnaršyklinis testavimas: „Cypress“ palaiko kelias naršykles, įskaitant Chrome, Firefox, Edge ir Electron.
- Testavimas „headless“ režimu: Vykdykite testus „headless“ režimu greitesniam vykdymui CI/CD aplinkose.
- Integruoti tvirtinimai: „Cypress“ siūlo gausų integruotų tvirtinimų (assertions) rinkinį, skirtą patikrinti numatomą jūsų programos elgesį.
Diegimas ir sąranka
Pradėti dirbti su „Cypress“ yra paprasta. Štai kaip jį įdiegti:
- Būtinosios sąlygos: Įsitikinkite, kad jūsų sistemoje yra įdiegti Node.js ir npm (Node Package Manager). Juos galite atsisiųsti iš oficialios Node.js svetainės.
- Įdiekite „Cypress“: Atidarykite savo terminalą arba komandinę eilutę, pereikite į savo projekto katalogą ir paleiskite šią komandą:
- Atidarykite „Cypress“: Kai diegimas bus baigtas, galite atidaryti „Cypress Test Runner“ paleisdami:
npm install cypress --save-dev
npx cypress open
Ši komanda paleis „Cypress Test Runner“, kuris suteikia grafinę sąsają jūsų testų paleidimui ir derinimui.
Pirmojo „Cypress“ testo rašymas
Sukurkime paprastą testą, kuris patikrins, ar svetainės pagrindinis puslapis įkeliamas teisingai. Sukurkite naują failą pavadinimu `example.cy.js` savo projekto `cypress/e2e` kataloge.
// cypress/e2e/example.cy.js
describe('Mano pirmasis testas', () => {
it('Apsilanko „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')
})
})
Panagrinėkime šį testą:
- `describe()`: Apibrėžia testų rinkinį, kuris yra susijusių testų kolekcija.
- `it()`: Apibrėžia atskirą testavimo atvejį testų rinkinyje.
- `cy.visit()`: Nueina į nurodytą URL.
- `cy.contains()`: Randa elementą, kuriame yra nurodytas tekstas.
- `.click()`: Spusteli pasirinktą elementą.
- `cy.url()`: Gauna dabartinį puslapio URL.
- `.should()`: Atlieka tvirtinimą (assertion) apie programos būseną.
- `cy.get()`: Parenka elementą naudojant CSS selektorių.
- `.type()`: Įveda tekstą į pasirinktą elementą.
- `.should('have.value', 'fake@email.com')`: Patvirtina, kad elemento vertė yra lygi 'fake@email.com'.
Paleiskite šį testą „Cypress Test Runner“ ir pamatysite jį veikiantį. Turėtumėte pamatyti, kaip naršyklė nueina į „Cypress Kitchen Sink“ svetainę, spusteli nuorodą „type“ ir patikrina URL.
„Cypress“ komandos
„Cypress“ siūlo platų komandų spektrą sąveikai su jūsų programa. Štai keletas dažniausiai naudojamų komandų:
- `cy.visit(url)`: Nueina į nurodytą URL.
- `cy.get(selector)`: Parenka elementą naudojant CSS selektorių.
- `cy.contains(content)`: Parenka elementą, kuriame yra nurodytas tekstas.
- `cy.click()`: Spusteli pasirinktą elementą.
- `cy.type(text)`: Įveda tekstą į pasirinktą elementą.
- `cy.clear()`: Išvalo įvesties lauko ar teksto lauko turinį.
- `cy.submit()`: Pateikia formą.
- `cy.check()`: Pažymi žymimąjį langelį arba radijo mygtuką.
- `cy.uncheck()`: Atžymi žymimąjį langelį.
- `cy.select(value)`: Parenka parinktį iš išskleidžiamojo sąrašo.
- `cy.scrollTo(position)`: Slenka puslapį į nurodytą poziciją.
- `cy.trigger(event)`: Sukelia DOM įvykį pasirinktam elementui.
- `cy.request(url, options)`: Siunčia HTTP užklausą nurodytu URL.
- `cy.intercept(route, handler)`: Perima HTTP užklausas, atitinkančias nurodytą maršrutą.
- `cy.wait(time)`: Laukia nurodytą laiko tarpą.
- `cy.reload()`: Perkrauna dabartinį puslapį.
- `cy.go(direction)`: Eina į ankstesnį ar kitą puslapį naršyklės istorijoje.
- `cy.url()`: Gauna dabartinį puslapio URL.
- `cy.title()`: Gauna puslapio pavadinimą.
- `cy.window()`: Gauna lango (window) objektą.
- `cy.document()`: Gauna dokumento (document) objektą.
- `cy.viewport(width, height)`: Nustato peržiūros srities dydį.
Tai tik kelios iš daugybės „Cypress“ galimų komandų. Išsamų komandų ir jų parinkčių sąrašą rasite „Cypress“ dokumentacijoje.
Tvirtinimai (Assertions) „Cypress“
Tvirtinimai naudojami norint patikrinti numatomą jūsų programos elgesį. „Cypress“ siūlo gausų integruotų tvirtinimų rinkinį, kurį galite naudoti tikrindami elementų būseną, URL, pavadinimą ir kt. Tvirtinimai grandinami po „Cypress“ komandų naudojant `.should()` metodą.
Štai keletas įprastų tvirtinimų pavyzdžių:
- `.should('be.visible')`: Patvirtina, kad elementas yra matomas.
- `.should('not.be.visible')`: Patvirtina, kad elementas nėra matomas.
- `.should('be.enabled')`: Patvirtina, kad elementas yra įjungtas.
- `.should('be.disabled')`: Patvirtina, kad elementas yra išjungtas.
- `.should('have.text', 'laukiamas tekstas')`: Patvirtina, kad elementas turi nurodytą tekstą.
- `.should('contain', 'laukiamas tekstas')`: Patvirtina, kad elementas turi nurodytą tekstą.
- `.should('have.value', 'laukiama vertė')`: Patvirtina, kad elementas turi nurodytą vertę.
- `.should('have.class', 'laukiamą klasė')`: Patvirtina, kad elementas turi nurodytą klasę.
- `.should('have.attr', 'atributo pavadinimas', 'laukiamą vertė')`: Patvirtina, kad elementas turi nurodytą atributą ir vertę.
- `.should('have.css', 'css savybė', 'laukiamą vertė')`: Patvirtina, kad elementas turi nurodytą CSS savybę ir vertę.
- `.should('have.length', laukiamas ilgis)`: Patvirtina, kad elementas turi nurodytą ilgį (pvz., elementų skaičių sąraše).
Taip pat galite kurti pasirinktinius tvirtinimus, atitinkančius jūsų specifinius poreikius.
Geriausios praktikos rašant „Cypress“ testus
Geriausių praktikų laikymasis gali padėti jums rašyti lengviau prižiūrimus, patikimesnius ir efektyvesnius „Cypress“ testus. Štai keletas rekomendacijų:
- Rašykite aiškius ir glaustus testus: Kiekvienas testas turėtų būti sutelktas į konkrečią funkciją ar scenarijų. Venkite rašyti per daug sudėtingų testų, kuriuos sunku suprasti ir prižiūrėti.
- Naudokite prasmingus testų pavadinimus: Suteikite savo testams aprašomuosius pavadinimus, kurie aiškiai nurodo, ką jie testuoja.
- Venkite tiesioginio verčių kodavimo (Hardcoding): Naudokite kintamuosius arba konfigūracijos failus, kad saugotumėte vertes, kurios laikui bėgant gali keistis.
- Naudokite pasirinktines komandas: Kurkite pasirinktines komandas, kad apimtumėte pakartotinai naudojamą logiką ir padarytumėte savo testus skaitomesnius.
- Izoliuokite testus: Kiekvienas testas turėtų būti nepriklausomas nuo kitų testų. Venkite priklausomybės nuo programos būsenos, likusios po ankstesnių testų.
- Išvalykite po testų: Atstatykite programos būseną po kiekvieno testo, kad užtikrintumėte, jog vėlesni testai prasidėtų nuo švaraus lapo.
- Naudokite duomenų atributus: Naudokite duomenų atributus (pvz., `data-testid`), kad pasirinktumėte elementus savo testuose. Duomenų atributai mažiau linkę keistis nei CSS klasės ar ID, todėl jūsų testai tampa atsparesni vartotojo sąsajos (UI) pokyčiams.
- Venkite aiškiai nurodytų laukimo komandų: „Cypress“ automatiškai laukia, kol elementai taps matomi arba sąveikūs. Venkite naudoti aiškiai nurodytas laukimo komandas (pvz., `cy.wait()`), nebent tai yra absoliučiai būtina.
- Testuokite vartotojų srautus: Sutelkite dėmesį į vartotojų srautų, o ne atskirų komponentų testavimą. Tai padės užtikrinti, kad jūsų programa veikia teisingai iš vartotojo perspektyvos.
- Reguliariai paleiskite testus: Integruokite „Cypress“ testus į savo CI/CD procesą ir reguliariai juos paleiskite, kad anksti aptiktumėte klaidas kūrimo procese.
Pažangios „Cypress“ technikos
Stubbing (impersonavimas) ir Mocking (imitavimas)
„Cypress“ leidžia imituoti tinklo užklausas ir atsakymus, suteikdama galimybę simuliuoti skirtingus scenarijus ir testuoti jūsų programos klaidų tvarkymą. Tai ypač naudinga testuojant funkcijas, kurios priklauso nuo išorinių API ar paslaugų.
Norėdami imituoti tinklo užklausą, galite naudoti `cy.intercept()` komandą. Pavyzdžiui, žemiau esantis kodas imituoja GET užklausą į `/api/users` ir grąžina imituotą atsakymą:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'Jonas Jonaitis' },
{ id: 2, name: 'Jana Janaitė' }
]
}).as('getUsers')
Tada galite laukti perimtos užklausos naudodami `cy.wait('@getUsers')` ir patikrinti, ar jūsų programa teisingai apdoroja imituotą atsakymą.
Darbas su vietine saugykla (Local Storage) ir slapukais (Cookies)
„Cypress“ siūlo komandas sąveikai su vietine saugykla ir slapukais. Galite naudoti šias komandas, norėdami nustatyti, gauti ir išvalyti vietinę saugyklą bei slapukus savo testuose.
Norėdami nustatyti vietinės saugyklos elementą, galite naudoti `cy.window()` komandą, kad pasiektumėte lango objektą, o tada naudoti `localStorage.setItem()` metodą. Pavyzdžiui:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
Norėdami gauti vietinės saugyklos elementą, galite naudoti `cy.window()` komandą, o tada `localStorage.getItem()` metodą. Pavyzdžiui:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
Norėdami nustatyti slapuką, galite naudoti `cy.setCookie()` komandą. Pavyzdžiui:
cy.setCookie('myCookie', 'myCookieValue')
Norėdami gauti slapuką, galite naudoti `cy.getCookie()` komandą. Pavyzdžiui:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Failų įkėlimo valdymas
„Cypress“ siūlo įskiepį pavadinimu `cypress-file-upload`, kuris supaprastina failų įkėlimą jūsų testuose. Norėdami įdiegti įskiepį, paleiskite šią komandą:
npm install -D cypress-file-upload
Tada pridėkite šią eilutę į savo `cypress/support/commands.js` failą:
import 'cypress-file-upload';
Tada galite naudoti `cy.uploadFile()` komandą failui įkelti. Pavyzdžiui:
cy.get('input[type="file"]').attachFile('example.txt')
Darbas su IFrame'ais
Testuoti IFrame'us gali būti sudėtinga, bet „Cypress“ suteikia būdą su jais sąveikauti. Galite naudoti `cy.frameLoaded()` komandą, kad palauktumėte, kol IFrame'as bus įkeltas, o tada naudoti `cy.iframe()` komandą, kad gautumėte IFrame'o dokumento objektą.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
„Cypress“ ir nuolatinė integracija / nuolatinis diegimas (CI/CD)
„Cypress“ integravimas į jūsų CI/CD procesą yra būtinas norint užtikrinti jūsų programos kokybę. Galite paleisti „Cypress“ testus „headless“ režimu savo CI/CD aplinkoje. Štai kaip tai padaryti:
- Įdiekite „Cypress“: Įsitikinkite, kad „Cypress“ yra įdiegtas kaip priklausomybė jūsų projekte.
- Konfigūruokite CI/CD: Konfigūruokite savo CI/CD procesą, kad po kiekvieno kūrimo (build) būtų paleidžiami „Cypress“ testai.
- Paleiskite „Cypress“ „headless“ režimu: Naudokite `cypress run` komandą, kad paleistumėte „Cypress“ testus „headless“ režimu.
CI/CD konfigūracijos pavyzdys (naudojant 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'
Ši konfigūracija paleis „Cypress“ testus, kai kodas bus įkeltas į `main` šaką arba kai bus sukurta „pull request“ į `main` šaką. `cypress-io/github-action` veiksmas supaprastina „Cypress“ testų paleidimo procesą GitHub Actions.
„Cypress“ testų derinimas
„Cypress“ siūlo puikius derinimo įrankius, padedančius nustatyti ir ištaisyti problemas jūsų testuose. Štai keletas patarimų, kaip derinti „Cypress“ testus:
- Naudokite „Cypress Test Runner“: „Cypress Test Runner“ suteikia vizualinę sąsają jūsų testų paleidimui ir derinimui. Galite žingsniuoti per savo testus po vieną komandą, tikrinti programos būseną ir peržiūrėti išsamius klaidų pranešimus.
- Naudokite `cy.pause()` komandą: `cy.pause()` komanda sustabdo jūsų testo vykdymą ir leidžia jums patikrinti programos būseną naršyklės kūrėjo įrankiuose.
- Naudokite `cy.debug()` komandą: `cy.debug()` komanda atspausdina pasirinktą elementą konsolėje, leisdama jums patikrinti jo savybes ir atributus.
- Naudokite naršyklės kūrėjo įrankius: Naršyklės kūrėjo įrankiai suteikia gausybę informacijos apie jūsų programą, įskaitant DOM, tinklo užklausas ir konsolės žurnalus.
- Atidžiai skaitykite klaidų pranešimus: „Cypress“ pateikia išsamius klaidų pranešimus, kurie gali padėti nustatyti klaidos priežastį. Atkreipkite dėmesį į klaidos pranešimą ir iškvietimų dėklą (stack trace).
„Cypress“ palyginimas su kitais testavimo karkasais
Nors „Cypress“ yra galingas „end-to-end“ testavimo karkasas, svarbu suprasti, kaip jis lyginasi su kitomis populiariomis alternatyvomis. Štai trumpa apžvalga:
- Selenium: Selenium yra plačiai naudojamas automatizuoto testavimo karkasas. Nors jis lankstus ir palaiko kelias kalbas, jo sąranka ir priežiūra gali būti sudėtinga. „Cypress“ siūlo paprastesnę ir kūrėjams draugiškesnę patirtį, ypač JavaScript pagrindu veikiančioms programoms.
- Puppeteer: Puppeteer yra Node biblioteka, kuri suteikia aukšto lygio API, skirtą valdyti „headless“ Chrome arba Chromium. Ji puikiai tinka duomenų rinkimui (scraping) ir naršyklės užduočių automatizavimui, tačiau gali reikalauti daugiau rankinės konfigūracijos, palyginti su „Cypress“, atliekant „end-to-end“ testavimą.
- Playwright: Playwright yra dar vienas tarpnaršyklinis automatizavimo karkasas, kurį sukūrė „Microsoft“. Jis turi panašumų su Puppeteer, tačiau siūlo platesnį naršyklių palaikymą. „Cypress“ turi unikalų laiko kelionės derintuvą ir labiau integruotą testavimo patirtį.
Karkaso pasirinkimas priklauso nuo jūsų projekto specifinių poreikių ir reikalavimų. „Cypress“ yra puikus pasirinkimas šiuolaikinėms žiniatinklio programoms, kurioms reikalingas greitas, patikimas ir kūrėjams draugiškas „end-to-end“ testavimas.
Realaus pasaulio „Cypress“ taikymo pavyzdžiai
Panagrinėkime keletą realaus pasaulio pavyzdžių, kaip „Cypress“ gali būti naudojamas testuoti skirtingų tipų žiniatinklio programas:
Elektroninės prekybos programos testavimas
Galite naudoti „Cypress“ testuoti įvairius vartotojų srautus elektroninės prekybos programoje, tokius kaip:
- Produktų paieška
- Produktų įdėjimas į krepšelį
- Atsiskaitymas ir užsakymo pateikimas
- Paskyros nustatymų valdymas
Štai „Cypress“ testo pavyzdys, kuris patikrina, ar vartotojas gali sėkmingai įdėti produktą į savo krepšelį:
it('Įdeda produktą į krepšelį', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Socialinės medijos programos testavimas
Galite naudoti „Cypress“ testuoti vartotojų sąveikas socialinės medijos programoje, tokias kaip:
- Naujo įrašo kūrimas
- Įrašo „patikimas“ (like)
- Komentavimas po įrašu
- Kitų vartotojų sekimas
Štai „Cypress“ testo pavyzdys, kuris patikrina, ar vartotojas gali sėkmingai sukurti naują įrašą:
it('Sukuriamas naujas įrašas', () => {
cy.visit('/profile')
cy.get('#new-post-textarea').type('Sveikas, pasauli!')
cy.get('#submit-post-button').click()
cy.get('.post').first().should('contain', 'Sveikas, pasauli!')
})
Bankininkystės programos testavimas
Bankininkystės programoms „Cypress“ gali būti naudojamas testuoti kritines funkcijas, tokias kaip:
- Saugus prisijungimas
- Sąskaitų likučių tikrinimas
- Lėšų pervedimas
- Gavėjų valdymas
Testas, skirtas patikrinti lėšų pervedimą, galėtų atrodyti taip (su atitinkamu imitavimu saugumo sumetimais):
it('Sėkmingai perveda lėšas', () => {
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')
})
Išvados
„Cypress“ yra galingas ir universalus „end-to-end“ testavimo karkasas, kuris gali padėti užtikrinti jūsų žiniatinklio programų kokybę ir patikimumą. Jo kūrėjams draugiška API, galingos funkcijos ir puikus našumas daro jį populiariu pasirinkimu tarp kūrėjų ir QA inžinierių visame pasaulyje. Laikydamiesi šiame vadove aprašytų geriausių praktikų, galėsite rašyti efektyvius „Cypress“ testus, kurie padės anksti aptikti klaidas kūrimo procese ir pateikti aukštos kokybės programinę įrangą savo vartotojams.
Kadangi žiniatinklio programos ir toliau vystosi, „end-to-end“ testavimo svarba tik didės. Prisijaukinę „Cypress“ ir integruodami jį į savo kūrimo procesą, galėsite kurti tvirtesnes, patikimesnes ir vartotojui draugiškesnes žiniatinklio patirtis.