Streng testing møter den virkelige verden med simulerte ende-til-ende brukertester.

Frontend-utvikling innebærer å bygge visuelt tiltalende, funksjonelle klientvendte apper. Men det er en hake; disse applikasjonene må sikre at brukerne får en sømløs opplevelse.

Selv om enhets- og integrasjonstester er avgjørende for å verifisere funksjonaliteten til en applikasjon, fanger de kanskje ikke helt opp typiske brukerinteraksjoner. For å virkelig simulere en brukers reise, må du kjøre ende-til-ende-tester som replikerer faktiske brukerinteraksjoner. Dette vil sikre at applikasjonen din fungerer som du har tenkt fra begynnelse til slutt.

Komme i gang med ende-til-ende-testing med Cypress

Hovedmålet med ende-til-ende-testing i front-end-applikasjoner er å verifisere resultater i stedet for implementeringsdetaljene til forretningslogikken.

Ta et påloggingsskjema som eksempel. Ideelt sett ville du teste om påloggingsskjermen dukker opp slik den skal og gjør det den er ment å gjøre. I hovedsak er de underliggende tekniske detaljene ikke viktige. Sluttmålet er ganske enkelt å tre inn i brukerens sko og evaluere hele opplevelsen.

Sypress er et flott rammeverk for automatiseringstesting som er kompatibelt med noen av de mest populære JavaScript-rammeverkene. Dens evne til å kjøre tester direkte i nettleseren og dens omfattende pakke med testfunksjoner gjør testingen sømløs og effektiv. Den støtter også ulike testmetoder, inkludert:

  • Enhetstester
  • Ende-til-ende-tester
  • Integrasjonstester

For å skrive ende-til-ende-tester for en React-applikasjon, bør du vurdere disse brukerhistoriene:

  • En bruker kan se et inndatafelt med en tilsvarende send-knapp.
  • En bruker kan skrive inn et søk i inntastingsfeltet.
  • Etter å ha klikket på send-knappen, skal en bruker se en liste over elementer som vises rett under inndatafeltet.

Ved å følge disse brukerhistoriene kan du bygge en enkel React-applikasjon som lar en bruker søke etter produkter. Appen vil hente produktdata fra DummyJSON API og gjengi det på siden.

Du kan finne dette prosjektets kode i sin GitHub oppbevaringssted

Sett opp et React-prosjekt

For å komme i gang, opprette et React-prosjekt ved hjelp av Vite eller bruk create-react-app kommando for å sette opp en grunnleggende React-applikasjon. Når installasjonsprosessen er fullført, fortsett og installer Cypress-pakken som en utviklingsavhengighet i prosjektet ditt:

npm install cypress --save-dev

Nå, oppdater din package.json fil ved å legge til dette skriptet:

"test": "npx cypress open"

Lag en funksjonell komponent

I src katalog, opprett en mappe og navngi den komponenter. Legg til en ny i denne mappen products.jsx fil, og ta med koden nedenfor.

import React, { useState, useEffect } from'react';
import"./style.component.css"

exportdefaultfunctionProducts(prop) {
const [products, setProducts] = useState([]);
const [error, setError] = useState(null);
const { searchInput } = prop;

return (

"product-catalogue">
{error? (

Product not found</p>
): (

"product-list">
{products.slice(0, 6).map((product) => (
"product" key={product.id}>

Title: {product.title}</h2>

Price: ${product.price}</p>
</div>
))}
</div>
)}
</div>
);
}

Innenfor den funksjonelle komponenten, definer en useEffect hook, som utfører en asynkron funksjon som henter produktdata basert på det oppgitte søket.

 useEffect(() => {
const fetchProducts = async () => {
if (searchInput) {
const apiUrl = `https://dummyjson.com/products/category/${searchInput}`;
try {
const response = await fetch(apiUrl);
if (!response.ok) {
thrownewError('Error fetching products');
}
const json = await response.json();
setProducts(json.products);
setError(null);
} catch (error) {
setError(error.message);
}
}
};
fetchProducts();
}, [searchInput]);

Oppdater App.jsx-filen

Oppdater nå App.jsx fil med følgende kode:

import React, { useState, useRef } from'react'
import'./App.css'
import Products from'./components/Products'

functionApp() {
const [searchInput, setSearchInput] = useState('')
const searchInputRef = useRef('');

const handleSubmit = (e) => {
setSearchInput(searchInputRef.current.value);
}

return (


Cypress Testing Library tutorial</h1>

exportdefault App

Gå videre og start utviklingsserveren.

npm run dev

Flott! Du bør kunne hente spesifikke produktdata fra dummy JSON API.

Sett opp testmiljøet

Kjør først testskriptkommandoen på terminalen din:

npm run test

Denne kommandoen vil utløse og åpne Cypress-klienten. Gå videre og klikk på E2E-testing knapp.

Klikk deretter Fortsette for å legge til Cypress-konfigurasjonsfiler.

Når denne prosessen er fullført, bør du se en ny Cypress-testkatalog i prosjektet ditt. I tillegg legger Cypress klient automatisk til filen cypress.config.js. Du kan oppdatere denne filen for å tilpasse ulike aspekter av testmiljøet, oppførselen og oppsettet ytterligere.

Skriv ende-til-ende-tester med Cypress

For å skrive din første test, må du velge nettleseren som testen skal kjøres i. Velg ditt foretrukne alternativ fra de tilgjengelige i Cypress-klienten.

Cypress vil lansere en forenklet versjon av nettleseren du har valgt, og skaper et kontrollert miljø for å kjøre tester.

Velg Opprett ny spesifikasjon alternativet for å lage testfilen.

Gå over til kodeeditoren din, åpne cypress/e2e/App.spec.cy.js fil, og oppdater innholdet i den filen med følgende kode.

describe('App Tests', () => {
beforeEach(() => {
cy.visit('http://127.0.0.1:5173/');
});

it('Renders input field and submit button', () => {
cy.get('#text').should('exist').should('be.visible');
cy.get('#btn').should('exist').should('be.visible').contains('Submit');
});

it('Enters a search query', () => {
const searchQuery = 'laptops';
cy.get('#text').type(searchQuery);
});
});

Går tilbake til brukerhistoriene som er fremhevet ovenfor, bekrefter denne spesifikke testpakken to aspekter:

  • At nettleseren viser et inndatafelt og en send-knapp på siden.
  • At bruken kan legge inn et søk.

Som andre JavaScript-testverktøy som Jest og Supertest, bruker Cypress en deklarativ syntaks og språk for å definere testtilfeller.

For å kjøre testen, gå tilbake til den forenklede nettleserversjonen administrert av Cypress og velg den spesifikke testfilen du ønsker å kjøre.

Cypress vil kjøre testene og vise resultatene i testlekeplassens venstre sidepanel.

Simulering av søknadsprosesser

For å sikre at du går gjennom og tester hele brukerreisen – i denne spesifikke brukssaken – må du bekrefte det applikasjonen kan ta brukerinndata, hente de nødvendige dataene og til slutt vise dataene i nettleseren side.

For klarhetens skyld kan du opprette en ny testfil for å romme en annen testsuite inne i e2e mappe. Alternativt kan du også velge å inkludere alle testpakkene som utforsker et bestemt testtilfelle i én testfil.

Gå videre og lag en ny Products.spec.cy.js fil i e2e mappe. Inne i denne filen, inkluderer følgende kode.

describe('Products Tests', () => {
it(' fetches and displays the data', () => {
const searchQuery = 'laptops';
cy.visit('http://127.0.0.1:5173');

cy.get('#text').type(searchQuery);
cy.get('#btn').contains('Submit').click();

cy.get('.product').should('have.length.greaterThan', 0);

cy.get('.product').first().should('contain', 'Title');
cy.get('.product').first().should('contain', 'Price: $');
});

});

Denne testpakken sjekker at når en bruker har sendt inn et bestemt søkeelement, henter og viser appen dataene på nettlesersiden.

Det gjør det ved å simulere prosessen med å legge inn søkeinndata, klikke på send-knappen og vente på produkter som skal lastes, og deretter bekrefte tilstedeværelsen av produktvarer, sammen med detaljer som tittel og pris. I hovedsak fanger og verifiserer den hele opplevelsen fra et brukerperspektiv.

Simulering av feil og svar

Du kan også simulere ulike feilscenarier og svar i Cypress-testene dine.

Lage en ny Error.spec.cy.js fil i e2e katalog og inkludere følgende kode.

describe('Error Handling Tests', () => {
it('Displays error message for incorrect search query', () => {

cy.intercept('GET', /https:\/\/dummyjson\.com\/products\/category\/.*/, {
statusCode: 404, // Not Found
body: 'Product not found'
}).as('fetchProducts');

cy.visit('http://127.0.0.1:5173');

const incorrectSearchQuery = 'rocket';
cy.get('#text').type(incorrectSearchQuery);
cy.get('#btn').click();

cy.wait('@fetchProducts');

cy.contains('Product not found').should('be.visible');
});
});

Denne testpakken sjekker at en feilmelding vises når en bruker skriver inn et feil søk.

For at testsaken skal bestå, bruker den Cypress' avskjære funksjon for å stoppe nettverket og simulere en nettverksforespørselsfeil. Den sjekker deretter at etter å ha skrevet inn et feil søk i inndatafeltet og startet henteprosessen, vises en feilmelding – Produktet ikke funnet – synlig på siden.

Dette resultatet indikerer at feilhåndteringsmekanismen fungerer som forventet.

Bruke Cypress i testdrevet utvikling

Testing er et grunnleggende utviklingskrav, men det kan også være en tidkrevende prosess. Å innlemme Cypress kan imidlertid gi den store tilfredsstillelsen ved å se testsakene dine kjøre sammen.

Cypress er et flott verktøy for å implementere testdrevet utvikling i applikasjoner – ikke bare gir det en omfattende pakke med testfunksjoner, men den støtter også ulike teststrategier. For å få mest mulig ut av Cypress, fortsett og utforske den offisielle dokumentasjonen for å oppdage mange flere testmuligheter.