Co je End-To-End (E2E) testování?
Primárním cílem E2E Testing je otestovat aplikaci z pohledu uživatele. Aplikaci tedy považovat za černou skříňku – ignorovat vnitřní logiku a testovat pouze to, co vidí Uživatelé.
Nevýhody testování E2E
Chyba v E2E Test Suite znamená, že uživatel nemůže používat aplikaci tak, jak má. Problém je v tom, že nemůžeme přesně určit řádek kódu (LOC), který chybu způsobuje. Testování E2E tedy pomáhá při hledání významných chyb, ale nemůže pomoci při jejich ladění.
Na slavné testovací pyramidě lze vedle testů komponent a integrace nalézt testy E2E. Jako takové by nejprve měly být testy jednotky a integrace. Pomáhají včas zachytit chyby a ladit, čímž zvyšují tempo vývoje.
Výhody testování E2E
Testy E2E jsou napsány způsobem, který se podobá uživatelskému způsobu ovládání naší aplikace. Testy E2E jako takové poskytují naší Aplikaci velkou důvěru tím, že potvrzují, že klíčové funkce fungují tak, jak bylo zamýšleno z pohledu uživatele.
Kromě toho E2E testy v ideálním případě nespoléhají na detaily implementace, jako takové jsou robustnější a napsané způsobem, kdy je jejich oprava nebo aktualizace rychlá a snadná.
Praktický příklad
Nyní k té zábavné části:Kód!
Nejprve musíme nainstalovat Cypress
npm install cypress --save-dev
or
yarn add cypress --dev
Poté můžeme v kořenovém adresáři vytvořit jednoduchý konfigurační soubor cypress.json
{
// specify the baseUrl from which we
// serve our applications in the test environment
"baseUrl": "http://localhost:3000",
// depends on project: allows accessing shadow dom without calling .shadow()
"includeShadowDom": true,
// optional: only necessary cypress component testing
// not needed if all we do is e2e testing
"component": {
"testFiles": "**/*.spec.{js,ts,jsx,tsx}",
"componentFolder": "src"
},
}
pokud je náš projekt napsán strojopisem, možná budeme chtít přidat tsconfig do podadresáře cypress, který rozšiřuje náš hlavní tsconfig
cypress/tsconfig.json
{
"compilerOptions": { "types": ["cypress"] },
"extends": "../tsconfig.json",
"include": ["integration/*.ts", "support/*.ts", "../node_modules/cypress"]
}
Psaní testů
Poté, co jsme dokončili základní nastavení a instalaci, můžeme nyní začít psát testy.
describe("Sample Test Suite", () => {
beforeEach(() => {
// intercept outgoing HTTP Requests by defining the endpoint and mocked response
cy.intercept("GET", "/some_endpoint", {
statusCode: 200,
body: {"a":1},
});
});
it("sample test", () => {
// uses baseUrl defined in cypress.json configuration
cy.visit("/landing-page");
// access DOM Nodes via e.g. class, id, data-test-id
// & interact with DOM
cy.get('[data-test-id="add-button"]').click();
cy.get(".some_class").should("exist");
});
});
Ve výše uvedeném příkladu zachycujeme požadavky Http, které naše aplikace vytváří na koncovém bodu /some_endpoint. Proto zesměšňujeme backend a můžeme spouštět naše testy bez spuštění instance backendu.
Nyní můžeme spustit testy a zjistit, zda naše aplikace funguje tak, jak má. Za tímto účelem se můžeme rozhodnout jej spustit s uživatelským rozhraním a otevřít instanci chrome pro snazší ladění NEBO jej můžeme spustit bez hlavy, např. pro rychlý běh v CLI nebo jako integrovaný krok v našem CI Pipeline např. Jenkins, Azure Pipeline,...
Spusťte Cypress ve vývojářském prostředí
Chcete-li spustit Cypress pomocí uživatelského rozhraní a řízené instance Chrome, můžeme tento skript přidat do package.json
"cy:open": "node_modules/.bin/cypress open",
přidání tohoto nám umožňuje snadno spustit uživatelské rozhraní cypřiše v terminálu
npm run cy:open
Jenkinsova integrace
Abychom mohli Cypress integrovat do našeho Jenkins Pipeline, můžeme tyto skripty přidat do package.json
"cy:run": "node_modules/.bin/cypress run",
"ci:e2e": "start-server-and-test start http://localhost:3000 cy:run"
Kromě toho musíme pro toto řešení nainstalovat start-server-and-test
npm install --save-dev start-server-and-test
To zajistí, že náš server bude spuštěn předtím, než se pokusíme spustit naše testy E2E.
Nyní, když jsou všechny přípravy hotové, můžeme přidat krok do našeho Jenkinsfile.
sh script: 'cd frontend; npm run ci:e2e'
Nyní, když se spustí Jenkins Build, uvidíme novou fázi v našem potrubí, která zobrazí zprávu o našich testech E2E.
Další informace a odstraňování problémů:
V závislosti na použitém obrazu Dockeru možná budeme muset nainstalovat další závislosti specifické pro OS. K tomu můžeme přidat krok DockerFile
# Install cypress OS dependencies
RUN apt-get install -qy \
libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 \
libnss3 libxss1 libasound2 libxtst6 xauth xvfb procps