[[oktatas:web:javascript:javascript_teszt|< JavaScript teszt]]
====== Cypress ======
* **Szerző:** Sallai András
* Copyright (c) 2024, Sallai András
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== A Cypress =====
A Cypress egy frontend teszt automatizáló eszköz.
Webhely
* https://www.cypress.io/ (2024)
===== Telepítés =====
Telepítés a projektbe:
npm install cypress --save-dev
Ellenőrzés:
npx cypress version
===== Teszt készítése =====
Ez a lépés legyárt egy konfigurációs fájlt és eyg cypress könyvtárat is, ami szükséges a futtatáshoz.
npx cypress open
{{:oktatas:web:javascript:javascript_teszt:cypress_gui_main.png?400|}}
A Cypress a teszteket alapértelmezetten a **cypress/e2e/** könyvtárban fogja keresi.
===== Csak futtatás =====
npx cypress run
Futtatás fejjel:
npx cypress run --headed --no-exit
===== Háromszög területszámítás tesztelése =====
describe('Háromszög számoló', () => {
beforeEach(function() {
cy.visit('http://localhost:3000')
})
it('Bemenet 30 és 35-re, 525', () => {
cy.get('#base').invoke('val', 30)
cy.get('#height').invoke('val', 35)
cy.get('#calcButton').click()
.then( () => {
cy.get('#area').should('have.value', '525')
})
})
})
Szerepel-e az oldalon:
it('Alap szerepel az oldalon', () => {
cy.contains('Alap')
})
it('Magasság szerepel az oldalon', () => {
cy.contains('Magasság')
})
it('Terület szerepel az oldalon', () => {
cy.contains('Terület')
})
it('Van button', () => {
cy.get('button')
})
===== Minimalista teszt =====
Minimalista alatt, most azt értem, hogy nem használjuk a Cypress GUI felületét az "npx cypress open" paranccsal. Helyette magunk hozunk létre egy minimális konfigurációs fájlt.
Szükségünk van egy konfigurációs fájlra. Legyen a neve cypress.config.cjs, tartalma:
const path = require('path');
const { defineConfig } = require('cypress');
module.exports = defineConfig({
// for e2e testing
e2e: {
supportFile: false,
specPattern: path.resolve(__dirname, 'test/**/*.cy.js'),
}
});
A beállításnak megfelelően a teszt számára hozzunk létre egy test könyvtárat a projekt gyökérkönyvtárában, majd abban például egy app.cy.js tesztfájlt. A teszt tartalma:
describe('Az első teszt', () => {
it('A Valami szót tartalmazza?', () => {
cy.visit('http://localhost:3000');
cy.contains('h1', 'Valami');
});
});
A példában feltételezzük, hogy a tesztelendő weblap a localhost:3000 címen érhető el.
A fenti példában látjuk, hogy kikapcsoltuk a supportFile lehetőséget. Ellenkező esetben meg kell adni hol van ez a fájl. Például:
supportFile: path.resolve(__dirname, 'cypress/support/e2e.js')
De akkor azt is létre kell hozni.
==== Eredmény ====
A futtatás lehetséges eredménye:
npx cypress run
DevTools listening on ws://127.0.0.1:39173/devtools/browser/bcb3ddff-e68e-41a2-ab16-71f397e47b93
====================================================================================================
(Run Starting)
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 13.13.1 │
│ Browser: Electron 118 (headless) │
│ Node Version: v18.19.0 (/usr/bin/node) │
│ Specs: 1 found (app.cy.js) │
│ Searched: test/**/*.cy.js │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
Running: app.cy.js (1 of 1)
Az első teszt
✓ URL megtekintése (582ms)
1 passing (2s)
(Results)
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Tests: 1 │
│ Passing: 1 │
│ Failing: 0 │
│ Pending: 0 │
│ Skipped: 0 │
│ Screenshots: 0 │
│ Video: false │
│ Duration: 2 seconds │
│ Spec Ran: app.cy.js │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
====================================================================================================
(Run Finished)
Spec Tests Passing Failing Pending Skipped
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ ✔ app.cy.js 00:02 1 1 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
✔ All specs passed! 00:02 1 1 - - -
==== Alap URL ====
const path = require('path');
const { defineConfig } = require('cypress');
module.exports = defineConfig({
// for e2e testing
e2e: {
supportFile: false,
specPattern: path.resolve(__dirname, 'test/**/*.cy.js'),
baseUrl: 'http://localhost:3000'
}
});
A tesztben ekkor elég ennyi:
describe('Az első teszt', () => {
it('A Valami szót tartalmazza?', () => {
cy.visit('/');
cy.contains('h1', 'Valami');
});
});
==== Támogatási fájlok ====
Az e2e.js fájlban a tesztek plusz utasításokat adhatunk. Például legyen egy egyszerű naplózás ami futó böngészőben jelenik meg:
// cypress/support/e2e.js
beforeEach(() => {
cy.log('This runs before each test');
});
afterEach(() => {
cy.log('This runs after each test');
});
A támogató fájlokat meg kell jelölni a konfigurációs fájlban. Például:
const path = require('path');
const { defineConfig } = require('cypress');
module.exports = defineConfig({
// for e2e testing
e2e: {
supportFile: path.resolve(__dirname, 'cypress/support/e2e.js'),
specPattern: path.resolve(__dirname, 'test/**/*.cy.js'),
baseUrl: 'http://localhost:3000'
}
});
===== Kereső tesztelése =====
describe('A szit.hu webolda tesztje', () => {
beforeEach(() => {
cy.visit('/');
});
it('A programozás szóra van-e cpp a találatok között?', () => {
cy.get('input[name=q]').type('programozás');
cy.get('button[type=submit][title=Keresés]').click();
cy.get('body').should('be.visible');
cy.contains('a', 'cpp');
});
});
===== Háromszög területszámítás újra =====
Ebben a példában az invoke() függvények helyett a type() függvényeket használjuk.
A weboldal:
Háromszög
Háromszög területszámítás
JavaScript kód:
import { calcArea } from "./triangle.js";
function handleSubmit(event) {
event.preventDefault();
const base = parseFloat(document.getElementById('base').value);
const height = parseFloat(document.getElementById('height').value);
const area = calcArea(base, height);
document.getElementById('result').value = area;
}
document.getElementById('triangleForm')
.addEventListener('submit', handleSubmit);
A konfigurációs fájl:
const path = require('path');
const { defineConfig } = require('cypress');
module.exports = defineConfig({
// for e2e testing
e2e: {
supportFile: false,
specPattern: path.resolve(__dirname, 'test/**/*.cy.js'),
baseUrl: 'http://localhost:3000'
}
});
A teszt:
describe('Háromszög területszámítás', () => {
beforeEach(() => {
cy.visit('/');
});
it('alap: 100, magasság: 150 bemenetre terület: 7500', () => {
cy.get('#base').type('100');
cy.get('#height').type('150');
cy.get('button[type=submit]').click();
//megvárjuk amíg a body elem betöltődik:
cy.get('body').should('be.visible');
cy.get('#result').should('have.value', '7500');
});
it('alap: 30, magasság: 35 bemenetre terület: 525', () => {
cy.get('#base').type('30');
cy.get('#height').type('35');
cy.get('button[type=submit]').click();
//megvárjuk amíg a body elem betöltődik:
cy.get('body').should('be.visible');
cy.get('#result').should('have.value', '525');
});
});
===== Szelektálás =====
==== skip ====
describe.skip('My Test Suite', () => {
it('should do something', () => {
// Teszt kód
});
it('should do something else', () => {
// Teszt kód
});
});
describe('My Test Suite', () => {
it.skip('should do something', () => {
// Ez a teszt nem fog futni
});
it('should do something else', () => {
// Ez a teszt futni fog
});
});
==== only ====
describe.only('My Test Suite', () => {
it('should do something', () => {
// Fut
});
it('should do something else', () => {
// Fut
});
});
describe('My Test Suite', () => {
it.only('should do something', () => {
// Csak ez a teszt fog futni
});
it('should do something else', () => {
// Ez a teszt nem fog futni
});
});
===== Gyakorlat =====
Látogassuk meg a https://exapmple.cypress.io webhelyet, majd ellenőrizzük, hogy a h1 elemen belül szerepel-e a 'Sink' szót.
describe('Első teszt', () => {
it('Oldal ellenőrzése', () => {
cy.visit('https://example.cypress.io')
cy.contains('h1', 'Sink')
})
})
===== Lásd még =====
* https://playwright.dev/
* https://appium.io/