Komplexní průvodce pro Cypress, výkonný framework pro end-to-end testování, pokrývající instalaci, psaní testů, ladění, CI/CD integraci a osvědčené postupy.
Cypress: Nejlepší průvodce pro end-to-end testování webových aplikací
V dnešním rychle se vyvíjejícím prostředí webového vývoje je zajištění kvality a spolehlivosti webových aplikací nanejvýš důležité. End-to-End (E2E) testování hraje klíčovou roli při ověřování, že všechny komponenty aplikace bezproblémově spolupracují z pohledu uživatele. Cypress se ukázal jako přední E2E testovací framework, který nabízí vývojářsky přívětivé prostředí, výkonné funkce a vynikající výkon. Tento komplexní průvodce vás provede vším, co potřebujete vědět, abyste mohli začít s Cypress a efektivně testovat své webové aplikace.
Co je Cypress?
Cypress je testovací nástroj front-endu nové generace, vytvořený pro moderní web. Na rozdíl od tradičních testovacích frameworků, které spouštějí testy v prohlížeči, Cypress pracuje přímo v prohlížeči, což vám dává bezkonkurenční kontrolu a viditelnost nad chováním vaší aplikace. Je navržen tak, aby byl rychlý, spolehlivý a snadno použitelný, což z něj činí oblíbenou volbu mezi vývojáři a QA inženýry po celém světě. Cypress je napsán v JavaScriptu a spouští se v prohlížeči, díky čemuž je velmi výkonný a nabízí bezkonkurenční přístup k interním mechanismům aplikace.
Klíčové výhody používání Cypress
- Vývojářsky přívětivý: Cypress poskytuje čisté a intuitivní API, což usnadňuje psaní a ladění testů.
- Cestování časem: Cypress pořizuje snímky stavu vaší aplikace během každého testovacího příkazu, což vám umožňuje vrátit se v čase a přesně vidět, co se v daném okamžiku stalo.
- Překládání v reálném čase: Cypress se automaticky znovu načte, když provedete změny v testech, a poskytuje okamžitou zpětnou vazbu.
- Automatické čekání: Cypress automaticky čeká, až se prvky stanou viditelnými nebo interaktivními, než provede akce, čímž eliminuje potřebu explicitního čekání.
- Řízení sítě: Cypress vám umožňuje stubovat síťové požadavky a odpovědi, což vám umožní simulovat různé scénáře a testovat zpracování chyb ve vaší aplikaci.
- Laditelnost: Cypress poskytuje vynikající nástroje pro ladění, včetně výkonného debuggeru a podrobných chybových zpráv.
- Testování napříč prohlížeči: Cypress podporuje více prohlížečů, včetně Chrome, Firefox, Edge a Electron.
- Bezhlavé testování: Spouštějte testy v bezhlavém režimu pro rychlejší provádění v prostředích CI/CD.
- Vestavěné aserce: Cypress poskytuje bohatou sadu vestavěných asercí pro ověření očekávaného chování vaší aplikace.
Instalace a nastavení
Začít s Cypress je jednoduché. Zde je postup instalace:
- Předpoklady: Ujistěte se, že máte na svém systému nainstalované Node.js a npm (Node Package Manager). Můžete si je stáhnout z oficiálních webových stránek Node.js.
- Instalace Cypress: Otevřete terminál nebo příkazový řádek, přejděte do adresáře projektu a spusťte následující příkaz:
- Otevření Cypress: Po dokončení instalace můžete otevřít Cypress Test Runner spuštěním:
npm install cypress --save-dev
npx cypress open
Tento příkaz spustí Cypress Test Runner, který poskytuje grafické rozhraní pro spouštění a ladění testů.
Psaní vašeho prvního Cypress testu
Pojďme vytvořit jednoduchý test pro ověření, zda se domovská stránka webu načítá správně. Vytvořte nový soubor s názvem `example.cy.js` v adresáři `cypress/e2e` vašeho projektu.
// cypress/e2e/example.cy.js
describe('Můj první test', () => {
it('Navštíví 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')
})
})
Pojďme si tento test rozebrat:
- `describe()`: Definuje testovací sadu, což je kolekce souvisejících testů.
- `it()`: Definuje jednotlivý testovací případ v rámci testovací sady.
- `cy.visit()`: Přejde na zadanou adresu URL.
- `cy.contains()`: Najde prvek obsahující zadaný text.
- `.click()`: Klikne na vybraný prvek.
- `cy.url()`: Získá aktuální adresu URL stránky.
- `.should()`: Vytvoří tvrzení o stavu aplikace.
- `cy.get()`: Vybere prvek pomocí CSS selektoru.
- `.type()`: Zapíše text do vybraného prvku.
- `.should('have.value', 'fake@email.com')`: Tvrdí, že hodnota prvku se rovná 'fake@email.com'.
Spusťte tento test v Cypress Test Runner, abyste ho viděli v akci. Měli byste vidět, jak prohlížeč přejde na web Cypress Kitchen Sink, klikne na odkaz „type“ a ověří adresu URL.
Příkazy Cypress
Cypress poskytuje širokou škálu příkazů pro interakci s vaší aplikací. Zde jsou některé z nejčastěji používaných příkazů:
- `cy.visit(url)`: Přejde na zadanou adresu URL.
- `cy.get(selector)`: Vybere prvek pomocí CSS selektoru.
- `cy.contains(content)`: Vybere prvek obsahující zadaný text.
- `cy.click()`: Klikne na vybraný prvek.
- `cy.type(text)`: Zapíše text do vybraného prvku.
- `cy.clear()`: Vymaže obsah vstupního prvku nebo prvku textarea.
- `cy.submit()`: Odešle formulář.
- `cy.check()`: Zaškrtne zaškrtávací políčko nebo přepínač.
- `cy.uncheck()`: Zruší zaškrtnutí zaškrtávacího políčka.
- `cy.select(value)`: Vybere možnost z rozevíracího seznamu.
- `cy.scrollTo(position)`: Posune stránku na zadanou pozici.
- `cy.trigger(event)`: Spustí událost DOM na vybraném prvku.
- `cy.request(url, options)`: Odešle požadavek HTTP na zadanou adresu URL.
- `cy.intercept(route, handler)`: Zachytí požadavky HTTP odpovídající zadané trase.
- `cy.wait(time)`: Čeká zadaný časový interval.
- `cy.reload()`: Znovu načte aktuální stránku.
- `cy.go(direction)`: Přejde na předchozí nebo následující stránku v historii prohlížeče.
- `cy.url()`: Získá aktuální adresu URL stránky.
- `cy.title()`: Získá název stránky.
- `cy.window()`: Získá objekt okna.
- `cy.document()`: Získá objekt dokumentu.
- `cy.viewport(width, height)`: Nastaví velikost výřezu.
Toto je jen několik z mnoha příkazů dostupných v Cypress. Úplný seznam příkazů a jejich možností naleznete v dokumentaci Cypress.
Aserce v Cypress
Aserce se používají k ověření očekávaného chování vaší aplikace. Cypress poskytuje bohatou sadu vestavěných asercí, které můžete použít ke kontrole stavu prvků, adresy URL, názvu a dalších. Aserce se řetězí za příkazy Cypress pomocí metody `.should()`.
Zde jsou některé běžné příklady asercí:
- `.should('be.visible')`: Tvrdí, že prvek je viditelný.
- `.should('not.be.visible')`: Tvrdí, že prvek není viditelný.
- `.should('be.enabled')`: Tvrdí, že prvek je povolen.
- `.should('be.disabled')`: Tvrdí, že prvek je zakázán.
- `.should('have.text', 'očekávaný text')`: Tvrdí, že prvek má zadaný text.
- `.should('contain', 'očekávaný text')`: Tvrdí, že prvek obsahuje zadaný text.
- `.should('have.value', 'očekávaná hodnota')`: Tvrdí, že prvek má zadanou hodnotu.
- `.should('have.class', 'očekávaná třída')`: Tvrdí, že prvek má zadanou třídu.
- `.should('have.attr', 'název atributu', 'očekávaná hodnota')`: Tvrdí, že prvek má zadaný atribut a hodnotu.
- `.should('have.css', 'vlastnost CSS', 'očekávaná hodnota')`: Tvrdí, že prvek má zadanou vlastnost CSS a hodnotu.
- `.should('have.length', očekávaná délka)`: Tvrdí, že prvek má zadanou délku (např. počet prvků v seznamu).
Osvědčené postupy pro psaní Cypress testů
Dodržování osvědčených postupů vám může pomoci psát lépe udržovatelné, spolehlivé a efektivní Cypress testy. Zde je několik doporučení:
- Pište jasné a stručné testy: Každý test by se měl zaměřit na specifickou funkci nebo scénář. Vyhněte se psaní příliš složitých testů, které je obtížné pochopit a udržovat.
- Používejte smysluplné názvy testů: Dejte svým testům popisné názvy, které jasně označují, co testují.
- Vyhněte se pevně zakódovaným hodnotám: Používejte proměnné nebo konfigurační soubory k ukládání hodnot, které se mohou časem měnit.
- Používejte vlastní příkazy: Vytvořte vlastní příkazy pro zapouzdření opakovaně použitelné logiky a zvýšení čitelnosti vašich testů.
- Izolujte testy: Každý test by měl být nezávislý na ostatních testech. Vyhněte se spoléhání na stav aplikace z předchozích testů.
- Po testech proveďte úklid: Po každém testu resetujte stav aplikace, abyste zajistili, že následující testy začnou s čistým štítem.
- Používejte datové atributy: Používejte datové atributy (např. `data-testid`) k výběru prvků ve vašich testech. Je méně pravděpodobné, že se datové atributy změní než třídy CSS nebo ID, díky čemuž jsou vaše testy odolnější vůči změnám v uživatelském rozhraní.
- Vyhněte se explicitnímu čekání: Cypress automaticky čeká, až se prvky stanou viditelnými nebo interaktivními. Vyhněte se používání explicitního čekání (např. `cy.wait()`), pokud to není naprosto nezbytné.
- Testujte uživatelské toky: Zaměřte se na testování uživatelských toků spíše než na jednotlivé komponenty. To vám pomůže zajistit, že vaše aplikace funguje správně z pohledu uživatele.
- Spouštějte testy pravidelně: Integrujte Cypress testy do svého CI/CD kanálu a spouštějte je pravidelně, abyste zachytili chyby v rané fázi vývoje.
Pokročilé techniky Cypress
Stubbing a Mocking
Cypress vám umožňuje stubovat síťové požadavky a odpovědi, což vám umožní simulovat různé scénáře a testovat zpracování chyb ve vaší aplikaci. To je zvláště užitečné pro testování funkcí, které se spoléhají na externí rozhraní API nebo služby.
Chcete-li stubovat síťový požadavek, můžete použít příkaz `cy.intercept()`. Například následující kód stubuje požadavek GET na `/api/users` a vrací falešnou odpověď:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
]
}).as('getUsers')
Poté můžete počkat na zachycený požadavek pomocí `cy.wait('@getUsers')` a ověřit, že vaše aplikace zpracovává falešnou odpověď správně.
Práce s lokálním úložištěm a soubory cookie
Cypress poskytuje příkazy pro interakci s lokálním úložištěm a soubory cookie. Tyto příkazy můžete použít k nastavení, získání a vymazání lokálního úložiště a souborů cookie ve vašich testech.
Chcete-li nastavit položku lokálního úložiště, můžete použít příkaz `cy.window()` pro přístup k objektu okna a poté použít metodu `localStorage.setItem()`. Například:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
Chcete-li získat položku lokálního úložiště, můžete použít příkaz `cy.window()` a poté použít metodu `localStorage.getItem()`. Například:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
Chcete-li nastavit soubor cookie, můžete použít příkaz `cy.setCookie()`. Například:
cy.setCookie('myCookie', 'myCookieValue')
Chcete-li získat soubor cookie, můžete použít příkaz `cy.getCookie()`. Například:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Zpracování nahrávání souborů
Cypress poskytuje plugin s názvem `cypress-file-upload`, který zjednodušuje nahrávání souborů ve vašich testech. Chcete-li nainstalovat plugin, spusťte následující příkaz:
npm install -D cypress-file-upload
Poté přidejte následující řádek do souboru `cypress/support/commands.js`:
import 'cypress-file-upload';
Poté můžete použít příkaz `cy.uploadFile()` k nahrání souboru. Například:
cy.get('input[type="file"]').attachFile('example.txt')
Práce s IFrames
Testování IFrame může být složité, ale Cypress poskytuje způsob, jak s nimi pracovat. Můžete použít příkaz `cy.frameLoaded()` k čekání na načtení IFrame a poté použít příkaz `cy.iframe()` k získání objektu dokumentu IFrame.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
Cypress a Continuous Integration/Continuous Deployment (CI/CD)
Integrace Cypress do vašeho CI/CD kanálu je nezbytná pro zajištění kvality vaší aplikace. Cypress testy můžete spouštět v bezhlavém režimu ve vašem CI/CD prostředí. Zde je postup:
- Instalace Cypress: Ujistěte se, že je Cypress nainstalován jako závislost ve vašem projektu.
- Konfigurace CI/CD: Nakonfigurujte svůj CI/CD kanál tak, aby spouštěl Cypress testy po každém sestavení.
- Spouštění Cypress bezhlavě: Použijte příkaz `cypress run` ke spuštění Cypress testů v bezhlavém režimu.
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'
Tato konfigurace spustí Cypress testy, kdykoli je kód odeslán do větve `main` nebo je vytvořena žádost o přijetí změn proti větvi `main`. Akce `cypress-io/github-action` zjednodušuje proces spouštění Cypress testů v GitHub Actions.
Ladění Cypress testů
Cypress poskytuje vynikající nástroje pro ladění, které vám pomohou identifikovat a opravit problémy ve vašich testech. Zde je několik tipů pro ladění Cypress testů:
- Používejte Cypress Test Runner: Cypress Test Runner poskytuje vizuální rozhraní pro spouštění a ladění vašich testů. Můžete procházet testy jeden příkaz po druhém, kontrolovat stav aplikace a zobrazovat podrobné chybové zprávy.
- Použijte příkaz `cy.pause()`: Příkaz `cy.pause()` pozastaví provádění testu a umožní vám zkontrolovat stav aplikace v nástrojích pro vývojáře prohlížeče.
- Použijte příkaz `cy.debug()`: Příkaz `cy.debug()` vytiskne vybraný prvek do konzole, což vám umožní zkontrolovat jeho vlastnosti a atributy.
- Používejte nástroje pro vývojáře prohlížeče: Nástroje pro vývojáře prohlížeče poskytují velké množství informací o vaší aplikaci, včetně DOM, síťových požadavků a protokolů konzole.
- Čtěte chybové zprávy pečlivě: Cypress poskytuje podrobné chybové zprávy, které vám mohou pomoci identifikovat příčinu chyby. Věnujte pozornost chybové zprávě a trasování zásobníku.
Cypress vs. jiné testovací frameworky
Zatímco Cypress je výkonný end-to-end testovací framework, je důležité pochopit, jak se srovnává s jinými oblíbenými možnostmi. Zde je stručný přehled:
- Selenium: Selenium je široce používaný framework pro automatizaci testování. I když je flexibilní a podporuje více jazyků, může být složité jej nastavit a udržovat. Cypress nabízí jednodušší a vývojářsky přívětivější prostředí, zejména pro aplikace založené na JavaScriptu.
- Puppeteer: Puppeteer je knihovna Node, která poskytuje API vysoké úrovně pro ovládání bezhlavého Chrome nebo Chromium. Je vynikající pro scraping a automatizaci úloh prohlížeče, ale může vyžadovat více ruční konfigurace ve srovnání s Cypress pro end-to-end testování.
- Playwright: Playwright je další framework pro automatizaci napříč prohlížeči vyvinutý společností Microsoft. Sdílí podobnosti s Puppeteer, ale nabízí širší podporu prohlížečů. Cypress má jedinečný debugger pro cestování časem a integrovanější testovací prostředí.
Volba frameworku závisí na specifických potřebách a požadavcích vašeho projektu. Cypress je vynikající volbou pro moderní webové aplikace, které vyžadují rychlé, spolehlivé a vývojářsky přívětivé end-to-end testování.
Příklady použití Cypress v reálném světě
Pojďme prozkoumat několik příkladů z reálného světa, jak lze Cypress použít k testování různých typů webových aplikací:Testování aplikace pro elektronické obchodování
Cypress můžete použít k testování různých uživatelských toků v aplikaci pro elektronické obchodování, jako jsou:
- Vyhledávání produktů
- Přidávání produktů do košíku
- Dokončení nákupu a zadání objednávky
- Správa nastavení účtu
Zde je příklad Cypress testu, který ověřuje, že uživatel může úspěšně přidat produkt do košíku:
it('Přidá produkt do košíku', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Testování aplikace sociálních médií
Cypress můžete použít k testování interakcí uživatelů v aplikaci sociálních médií, jako jsou:
- Vytvoření nového příspěvku
- Označení příspěvku jako „Líbí se mi“
- Komentování příspěvku
- Sledování ostatních uživatelů
Zde je příklad Cypress testu, který ověřuje, že uživatel může úspěšně vytvořit nový příspěvek:
it('Vytvoří nový příspěvek', () => {
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!')
})
Testování bankovní aplikace
Pro bankovní aplikace lze Cypress použít k testování kritických funkcí, jako jsou:
- Bezpečné přihlášení
- Kontrola zůstatků na účtech
- Převod prostředků
- Správa příjemců
Test pro ověření převodu finančních prostředků by mohl vypadat takto (s příslušným stubbingem pro zabezpečení):
it('Úspěšně převede prostředky', () => {
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ávěr
Cypress je výkonný a všestranný end-to-end testovací framework, který vám může pomoci zajistit kvalitu a spolehlivost vašich webových aplikací. Jeho vývojářsky přívětivé API, výkonné funkce a vynikající výkon z něj činí oblíbenou volbu mezi vývojáři a QA inženýry po celém světě. Dodržováním osvědčených postupů uvedených v této příručce můžete psát efektivní Cypress testy, které vám pomohou zachytit chyby v rané fázi vývoje a dodávat uživatelům vysoce kvalitní software.
S tím, jak se webové aplikace neustále vyvíjejí, bude význam end-to-end testování jen narůstat. Přijetí Cypress a jeho integrace do vašeho vývojového pracovního postupu vám umožní vytvářet robustnější, spolehlivější a uživatelsky přívětivější webové zážitky.