Komplexný sprievodca Cypressom, výkonným frameworkom pre end-to-end testovanie, pokrývajúci inštaláciu, písanie testov, ladenie, integráciu CI/CD a osvedčené postupy.
Cypress: Kompletný sprievodca End-to-End testovaním pre webové aplikácie
V dnešnom rýchlo sa vyvíjajúcom prostredí webového vývoja je zabezpečenie kvality a spoľahlivosti webových aplikácií prvoradé. End-to-End (E2E) testovanie hrá kľúčovú úlohu pri overovaní, či všetky komponenty aplikácie bezproblémovo spolupracujú z pohľadu používateľa. Cypress sa stal vedúcim E2E testovacím frameworkom, ktorý ponúka vývojársky prívetivé prostredie, výkonné funkcie a vynikajúci výkon. Tento komplexný sprievodca vás prevedie všetkým, čo potrebujete vedieť, aby ste mohli začať s Cypressom a efektívne testovať vaše webové aplikácie.
Čo je Cypress?
Cypress je nástroj na testovanie front-endu novej generácie, vytvorený pre moderný web. Na rozdiel od tradičných testovacích frameworkov, ktoré spúšťajú testy v prehliadači, Cypress pracuje priamo v prehliadači, čo vám dáva bezkonkurenčnú kontrolu a prehľad o správaní vašej aplikácie. Je navrhnutý tak, aby bol rýchly, spoľahlivý a ľahko použiteľný, čo z neho robí obľúbenú voľbu medzi vývojármi a QA inžiniermi po celom svete. Cypress je napísaný v JavaScripte a vykonáva sa v rámci prehliadača, čo ho robí veľmi výkonným a ponúka bezkonkurenčný prístup k interným častiam aplikácie.
Kľúčové výhody používania Cypressu
- Vývojársky prívetivý: Cypress poskytuje čisté a intuitívne API, ktoré uľahčuje písanie a ladenie testov.
- Cestovanie v čase: Cypress vytvára snímky stavu vašej aplikácie počas každého testovacieho príkazu, čo vám umožňuje vrátiť sa v čase a presne vidieť, čo sa v danom momente stalo.
- Opätovné načítanie v reálnom čase: Cypress sa automaticky znovu načíta, keď urobíte zmeny vo svojich testoch, čím poskytuje okamžitú spätnú väzbu.
- Automatické čakanie: Cypress automaticky čaká, kým sa prvky stanú viditeľnými alebo interaktívnymi, pred vykonaním akcií, čím sa eliminuje potreba explicitných čakaní.
- Kontrola siete: Cypress vám umožňuje nahradiť (stub) sieťové požiadavky a odpovede, čo vám umožňuje simulovať rôzne scenáre a testovať spracovanie chýb vašej aplikácie.
- Ladenie (Debuggability): Cypress poskytuje vynikajúce nástroje na ladenie, vrátane výkonného ladenia a podrobných chybových hlásení.
- Testovanie vo viacerých prehliadačoch: Cypress podporuje viacero prehliadačov vrátane Chrome, Firefox, Edge a Electron.
- Headless testovanie: Spúšťajte testy v headless režime pre rýchlejšie vykonávanie v prostrediach CI/CD.
- Vstavané kontrolné tvrdenia: Cypress poskytuje bohatú sadu vstavaných tvrdení (assertions) na overenie očakávaného správania vašej aplikácie.
Inštalácia a nastavenie
Začať s Cypressom je jednoduché. Takto ho nainštalujete:
- Predpoklady: Uistite sa, že máte vo svojom systéme nainštalovaný Node.js a npm (Node Package Manager). Môžete si ich stiahnuť z oficiálnej webovej stránky Node.js.
- Inštalácia Cypressu: Otvorte terminál alebo príkazový riadok, prejdite do adresára vášho projektu a spustite nasledujúci príkaz:
- Otvorenie Cypressu: Po dokončení inštalácie môžete otvoriť Cypress Test Runner spustením:
npm install cypress --save-dev
npx cypress open
Tento príkaz spustí Cypress Test Runner, ktorý poskytuje grafické rozhranie na spúšťanie a ladenie vašich testov.
Písanie vášho prvého testu v Cypresse
Vytvorme jednoduchý test na overenie, či sa domovská stránka webu načíta správne. Vytvorte nový súbor s názvom `example.cy.js` v adresári `cypress/e2e` vášho projektu.
// cypress/e2e/example.cy.js
describe('Môj prvý test', () => {
it('Navštívi 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')
})
})
Rozoberme si tento test:
- `describe()`: Definuje testovaciu sadu (test suite), čo je zbierka súvisiacich testov.
- `it()`: Definuje jednotlivý testovací prípad v rámci testovacej sady.
- `cy.visit()`: Prejde na zadanú URL adresu.
- `cy.contains()`: Nájde prvok obsahujúci zadaný text.
- `.click()`: Klikne na vybraný prvok.
- `cy.url()`: Získa aktuálnu URL stránky.
- `.should()`: Vytvorí kontrolné tvrdenie (assertion) o stave aplikácie.
- `cy.get()`: Vyberie prvok pomocou CSS selektora.
- `.type()`: Zapíše text do vybraného prvku.
- `.should('have.value', 'fake@email.com')`: Uisťuje sa, že hodnota prvku sa rovná 'fake@email.com'.
Spustite tento test v Cypress Test Runneri, aby ste ho videli v akcii. Mali by ste vidieť, ako prehliadač prejde na webovú stránku Cypress Kitchen Sink, klikne na odkaz „type“ a overí URL.
Príkazy v Cypresse
Cypress poskytuje širokú škálu príkazov na interakciu s vašou aplikáciou. Tu sú niektoré z najčastejšie používaných príkazov:
- `cy.visit(url)`: Prejde na zadanú URL adresu.
- `cy.get(selector)`: Vyberie prvok pomocou CSS selektora.
- `cy.contains(content)`: Vyberie prvok obsahujúci zadaný text.
- `cy.click()`: Klikne na vybraný prvok.
- `cy.type(text)`: Zapíše text do vybraného prvku.
- `cy.clear()`: Vymaže obsah vstupného poľa alebo textarea prvku.
- `cy.submit()`: Odošle formulár.
- `cy.check()`: Zaškrtne checkbox alebo radio button.
- `cy.uncheck()`: Odškrtne checkbox.
- `cy.select(value)`: Vyberie možnosť z rozbaľovacieho zoznamu.
- `cy.scrollTo(position)`: Posunie stránku na zadanú pozíciu.
- `cy.trigger(event)`: Spustí DOM udalosť na vybranom prvku.
- `cy.request(url, options)`: Urobí HTTP požiadavku na zadanú URL.
- `cy.intercept(route, handler)`: Zachytí HTTP požiadavky zodpovedajúce zadanej ceste.
- `cy.wait(time)`: Počká zadaný čas.
- `cy.reload()`: Znovu načíta aktuálnu stránku.
- `cy.go(direction)`: Prejde na predchádzajúcu alebo nasledujúcu stránku v histórii prehliadača.
- `cy.url()`: Získa aktuálnu URL stránky.
- `cy.title()`: Získa titulok stránky.
- `cy.window()`: Získa objekt okna (window).
- `cy.document()`: Získa objekt dokumentu (document).
- `cy.viewport(width, height)`: Nastaví veľkosť viewportu.
Toto je len niekoľko z mnohých príkazov dostupných v Cypresse. Pre kompletný zoznam príkazov a ich možností si pozrite dokumentáciu Cypressu.
Kontrolné tvrdenia (Assertions) v Cypresse
Kontrolné tvrdenia (assertions) sa používajú na overenie očakávaného správania vašej aplikácie. Cypress poskytuje bohatú sadu vstavaných tvrdení, ktoré môžete použiť na kontrolu stavu prvkov, URL, titulku a ďalších. Tvrdenia sa reťazia za príkazy Cypressu pomocou metódy `.should()`.
Tu sú niektoré bežné príklady tvrdení:
- `.should('be.visible')`: Uisťuje sa, že prvok je viditeľný.
- `.should('not.be.visible')`: Uisťuje sa, že prvok nie je viditeľný.
- `.should('be.enabled')`: Uisťuje sa, že prvok je povolený.
- `.should('be.disabled')`: Uisťuje sa, že prvok je zakázaný.
- `.should('have.text', 'očakávaný text')`: Uisťuje sa, že prvok má zadaný text.
- `.should('contain', 'očakávaný text')`: Uisťuje sa, že prvok obsahuje zadaný text.
- `.should('have.value', 'očakávaná hodnota')`: Uisťuje sa, že prvok má zadanú hodnotu.
- `.should('have.class', 'očakávaná trieda')`: Uisťuje sa, že prvok má zadanú triedu.
- `.should('have.attr', 'názov atribútu', 'očakávaná hodnota')`: Uisťuje sa, že prvok má zadaný atribút a hodnotu.
- `.should('have.css', 'vlastnosť css', 'očakávaná hodnota')`: Uisťuje sa, že prvok má zadanú CSS vlastnosť a hodnotu.
- `.should('have.length', očakávaná dĺžka)`: Uisťuje sa, že prvok má zadanú dĺžku (napr. počet prvkov v zozname).
Môžete si tiež vytvoriť vlastné tvrdenia, aby vyhovovali vašim špecifickým potrebám.
Osvedčené postupy pre písanie testov v Cypresse
Dodržiavanie osvedčených postupov vám môže pomôcť písať udržiavateľnejšie, spoľahlivejšie a efektívnejšie testy v Cypresse. Tu sú niektoré odporúčania:
- Píšte jasné a stručné testy: Každý test by sa mal zamerať na špecifickú funkcionalitu alebo scenár. Vyhnite sa písaniu príliš zložitých testov, ktoré sú ťažko zrozumiteľné a udržiavateľné.
- Používajte zmysluplné názvy testov: Dajte svojim testom popisné názvy, ktoré jasne naznačujú, čo testujú.
- Vyhnite sa pevne zakódovaným hodnotám: Používajte premenné alebo konfiguračné súbory na ukladanie hodnôt, ktoré sa môžu časom meniť.
- Používajte vlastné príkazy: Vytvorte si vlastné príkazy na zapuzdrenie opakovane použiteľnej logiky a zvýšenie čitateľnosti vašich testov.
- Izolujte testy: Každý test by mal byť nezávislý od ostatných testov. Vyhnite sa spoliehaniu na stav aplikácie z predchádzajúcich testov.
- Upratujte po testoch: Po každom teste resetujte stav aplikácie, aby ste zabezpečili, že nasledujúce testy začnú z čistého stavu.
- Používajte dátové atribúty: Používajte dátové atribúty (napr. `data-testid`) na výber prvkov vo vašich testoch. Dátové atribúty sa menia menej pravdepodobne ako CSS triedy alebo ID, čo robí vaše testy odolnejšími voči zmenám v UI.
- Vyhnite sa explicitnému čakaniu: Cypress automaticky čaká, kým sa prvky stanú viditeľnými alebo interaktívnymi. Vyhnite sa používaniu explicitného čakania (napr. `cy.wait()`), pokiaľ to nie je absolútne nevyhnutné.
- Testujte používateľské toky: Zamerajte sa na testovanie používateľských tokov namiesto jednotlivých komponentov. To vám pomôže zabezpečiť, že vaša aplikácia funguje správne z pohľadu používateľa.
- Spúšťajte testy pravidelne: Integrujte testy Cypressu do vášho CI/CD pipeline a spúšťajte ich pravidelne, aby ste odhalili chyby včas v procese vývoja.
Pokročilé techniky v Cypresse
Stubovanie a mockovanie
Cypress vám umožňuje nahradiť (stub) sieťové požiadavky a odpovede, čo vám umožňuje simulovať rôzne scenáre a testovať spracovanie chýb vašej aplikácie. To je obzvlášť užitočné pri testovaní funkcií, ktoré sa spoliehajú na externé API alebo služby.
Na nahradenie sieťovej požiadavky môžete použiť príkaz `cy.intercept()`. Napríklad, kód nižšie nahradí GET požiadavku na `/api/users` a vráti falošnú (mock) odpoveď:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
]
}).as('getUsers')
Potom môžete počkať na zachytenú požiadavku pomocou `cy.wait('@getUsers')` a overiť, či vaša aplikácia správne spracuje falošnú odpoveď.
Práca s Local Storage a cookies
Cypress poskytuje príkazy na interakciu s local storage a cookies. Tieto príkazy môžete použiť na nastavenie, získanie a vymazanie local storage a cookies vo vašich testoch.
Na nastavenie položky v local storage môžete použiť príkaz `cy.window()` na prístup k objektu okna a potom použiť metódu `localStorage.setItem()`. Napríklad:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
Na získanie položky z local storage môžete použiť príkaz `cy.window()` a potom použiť metódu `localStorage.getItem()`. Napríklad:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
Na nastavenie cookie môžete použiť príkaz `cy.setCookie()`. Napríklad:
cy.setCookie('myCookie', 'myCookieValue')
Na získanie cookie môžete použiť príkaz `cy.getCookie()`. Napríklad:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Spracovanie nahrávania súborov
Cypress poskytuje plugin s názvom `cypress-file-upload`, ktorý zjednodušuje nahrávanie súborov vo vašich testoch. Pre inštaláciu pluginu spustite nasledujúci príkaz:
npm install -D cypress-file-upload
Potom pridajte nasledujúci riadok do vášho súboru `cypress/support/commands.js`:
import 'cypress-file-upload';
Potom môžete použiť príkaz `cy.uploadFile()` na nahratie súboru. Napríklad:
cy.get('input[type="file"]').attachFile('example.txt')
Práca s IFrame
Testovanie IFrame môže byť zložité, ale Cypress poskytuje spôsob, ako s nimi interagovať. Môžete použiť príkaz `cy.frameLoaded()` na čakanie, kým sa IFrame načíta, a potom použiť príkaz `cy.iframe()` na získanie objektu dokumentu IFrame.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
Cypress a kontinuálna integrácia/kontinuálne nasadenie (CI/CD)
Integrácia Cypressu do vášho CI/CD pipeline je nevyhnutná na zabezpečenie kvality vašej aplikácie. Testy Cypressu môžete spúšťať v headless režime vo vašom CI/CD prostredí. Takto na to:
- Inštalácia Cypressu: Uistite sa, že Cypress je nainštalovaný ako závislosť vo vašom projekte.
- Konfigurácia CI/CD: Nakonfigurujte váš CI/CD pipeline tak, aby spúšťal testy Cypressu po každom builde.
- Spustenie Cypressu v headless režime: Použite príkaz `cypress run` na spustenie testov Cypressu v headless režime.
Príklad konfigurácie CI/CD (pomocou 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'
Táto konfigurácia spustí testy Cypressu vždy, keď je kód posunutý do `main` vetvy alebo je vytvorený pull request proti `main` vetve. Akcia `cypress-io/github-action` zjednodušuje proces spúšťania testov Cypressu v GitHub Actions.
Ladenie testov v Cypresse
Cypress poskytuje vynikajúce nástroje na ladenie, ktoré vám pomôžu identifikovať a opraviť problémy vo vašich testoch. Tu sú niektoré tipy na ladenie testov v Cypresse:
- Použite Cypress Test Runner: Cypress Test Runner poskytuje vizuálne rozhranie na spúšťanie a ladenie vašich testov. Môžete prechádzať testami príkaz po príkaze, kontrolovať stav aplikácie a prezerať podrobné chybové hlásenia.
- Použite príkaz `cy.pause()`: Príkaz `cy.pause()` pozastaví vykonávanie vášho testu a umožní vám skontrolovať stav aplikácie v nástrojoch pre vývojárov v prehliadači.
- Použite príkaz `cy.debug()`: Príkaz `cy.debug()` vypíše vybraný prvok do konzoly, čo vám umožní skontrolovať jeho vlastnosti a atribúty.
- Použite nástroje pre vývojárov v prehliadači: Nástroje pre vývojárov v prehliadači poskytujú množstvo informácií o vašej aplikácii, vrátane DOM, sieťových požiadaviek a záznamov v konzole.
- Čítajte chybové hlásenia pozorne: Cypress poskytuje podrobné chybové hlásenia, ktoré vám môžu pomôcť identifikovať príčinu chyby. Venujte pozornosť chybovému hláseniu a zásobníku volaní (stack trace).
Cypress vs. iné testovacie frameworky
Hoci je Cypress výkonný end-to-end testovací framework, je dôležité pochopiť, ako sa porovnáva s inými populárnymi možnosťami. Tu je stručný prehľad:
- Selenium: Selenium je široko používaný automatizačný testovací framework. Hoci je flexibilný a podporuje viacero jazykov, jeho nastavenie a údržba môžu byť zložité. Cypress ponúka jednoduchší a vývojársky prívetivejší zážitok, najmä pre aplikácie založené na JavaScripte.
- Puppeteer: Puppeteer je Node knižnica, ktorá poskytuje API na vysokej úrovni na ovládanie headless Chrome alebo Chromium. Je vynikajúca na scraping a automatizáciu úloh v prehliadači, ale môže vyžadovať viac manuálnej konfigurácie v porovnaní s Cypressom pre end-to-end testovanie.
- Playwright: Playwright je ďalší multi-prehliadačový automatizačný framework vyvinutý spoločnosťou Microsoft. Má podobnosti s Puppeteerom, ale ponúka širšiu podporu prehliadačov. Cypress má unikátny debugger s cestovaním v čase a integrovanejší testovací zážitok.
Voľba frameworku závisí od špecifických potrieb a požiadaviek vášho projektu. Cypress je vynikajúcou voľbou pre moderné webové aplikácie, ktoré vyžadujú rýchle, spoľahlivé a vývojársky prívetivé end-to-end testovanie.
Príklady z reálneho sveta použitia Cypressu
Pozrime sa na niekoľko príkladov z reálneho sveta, ako sa dá Cypress použiť na testovanie rôznych typov webových aplikácií:
Testovanie e-commerce aplikácie
Môžete použiť Cypress na testovanie rôznych používateľských tokov v e-commerce aplikácii, ako napríklad:
- Vyhľadávanie produktov
- Pridávanie produktov do košíka
- Pokladňa a zadanie objednávky
- Správa nastavení účtu
Tu je príklad testu v Cypresse, ktorý overuje, či si používateľ môže úspešne pridať produkt do košíka:
it('Pridá produkt do košíka', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Testovanie aplikácie sociálnych médií
Môžete použiť Cypress na testovanie interakcií používateľov v aplikácii sociálnych médií, ako napríklad:
- Vytvorenie nového príspevku
- Lajkovanie príspevku
- Komentovanie príspevku
- Sledovanie iných používateľov
Tu je príklad testu v Cypresse, ktorý overuje, či používateľ môže úspešne vytvoriť nový príspevok:
it('Vytvorí nový príspevok', () => {
cy.visit('/profile')
cy.get('#new-post-textarea').type('Ahoj, svet!')
cy.get('#submit-post-button').click()
cy.get('.post').first().should('contain', 'Ahoj, svet!')
})
Testovanie bankovej aplikácie
Pre bankové aplikácie sa Cypress môže použiť na testovanie kritických funkcionalít, ako napríklad:
- Bezpečné prihlásenie
- Kontrola zostatkov na účte
- Prevod finančných prostriedkov
- Správa príjemcov
Test na overenie prevodu finančných prostriedkov by mohol vyzerať takto (s vhodným stubovaním pre bezpečnosť):
it('Úspešne prevedie finančné prostriedky', () => {
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')
})
Záver
Cypress je výkonný a všestranný end-to-end testovací framework, ktorý vám môže pomôcť zabezpečiť kvalitu a spoľahlivosť vašich webových aplikácií. Jeho vývojársky prívetivé API, výkonné funkcie a vynikajúci výkon z neho robia obľúbenú voľbu medzi vývojármi a QA inžiniermi po celom svete. Dodržiavaním osvedčených postupov uvedených v tejto príručke môžete písať efektívne testy v Cypresse, ktoré vám pomôžu odhaliť chyby včas v procese vývoja a dodávať používateľom vysokokvalitný softvér.
Ako sa webové aplikácie naďalej vyvíjajú, dôležitosť end-to-end testovania bude len narastať. Osvojenie si Cypressu a jeho integrácia do vášho vývojového pracovného postupu vám umožní vytvárať robustnejšie, spoľahlivejšie a používateľsky prívetivejšie webové zážitky.