Zum starten der Demo muss folgendes ausgeführt werden:
In Terminal 1:
cd nextjs-frontend
npm install
npm run build
npm run start
In Terminal 2:
cd nextjs-frontend
npm run cypress
https://docs.cypress.io/guides/overview/why-cypress
- Testen mit verschiedenen Viewports möglich
- Zugriff auf Local-Storage, Service-Worker, usw.
https://docs.cypress.io/guides/references/trade-offs
Dauerhafte Trade-Offs
Temporäre Trade-Offs
https://docs.cypress.io/guides/references/roadmap#Upcoming-features
Status | Feature | Released |
---|---|---|
Alpha | Component Testing | v7.0.0 |
Experimental | Cypress Studio | v6.3.0 |
Experimental | Session API | v8.2.0 |
in progress | WebKit Support | - |
in progress | Visit multiple superdomains | - |
in progress | Iframe Support | - |
Cypress deaktiviert störende Funktionen im Auto-Test: https://docs.cypress.io/guides/guides/launching-browsers#Disabled-Barriers
kann bei Bedarf über Kommandozeilen-Parameter angepasst werden!
Real-World Beispiel:
Der Cypress-Dashboard bietet u.a.:
der Free-Tier ist auf 3 User und 500 Test-Ergebnisse/Monat limitiert!
Zusätzlich käufliche Premium-Features:
https://cypress.io/pricing/
https://docs.cypress.io/guides/component-testing/introduction
import * as React from "react";
import { mount } from "@cypress/react";
import Button from "./Button";
it("Button", () => {
mount(<Button>Test button</Button>);
cy.get("button").contains("Test button").click();
});
Komponenten können isoliert getestet werden
Vergleichbar mit Jest-Komponententests in Storybook
Aktuell verfügbar für React/Next und Vue über Webpack (Vite ist noch experimentell)
https://docs.cypress.io/guides/tooling/visual-testing
// Beispiel: https://github.com/meinaart/cypress-plugin-snapshots
it('completes todo', () => {
cy.visit('/');
cy.get('.new-todo').type('write tests{enter}');
cy.contains('.todo-list li', 'write tests');
.find('.toggle')
.check()
.should('have.class', 'completed');
// capture screenshot and compare to the baseline image
cy.get('.todoapp').toMatchImageSnapshot({
imageConfig: {
threshold: 0.001,
},
})
})
Github-Action verfügbar: https://github.com/marketplace/actions/cypress-io
Gitlab: https://docs.cypress.io/guides/continuous-integration/gitlab-ci#Basic-Setup
Jenkins: Testbench CS nutzt das Docker-Image in der Pipeline mit Reports im jUnit-Format
https://docs.cypress.io/guides/tooling/code-coverage#Introduction
Code Coverage kann mit Istanbul angezeigt werden.
https://istanbul.js.org/
Über das nyc-Modul (https://github.com/istanbuljs/nyc) dem Kommandzeilen-Interface von Istanbul
Über Code-Transiplierung mittels dem Babel-Plugin-Istanbul (https://github.com/istanbuljs/babel-plugin-istanbul)
Für .lcov coverage-Files gibt es IDE-Plugins (z.B. Coverage-Gutters)
Coverage kann auch in CI integriert werden, z.B. auf GitHub: https://www.cypress.io/blog/2019/10/22/show-code-coverage-on-gitlab-ci/
https://docs.cypress.io/guides/tooling/reporters
Default-Reporter ist der spec-Reporter der Informationen auf STDOUT ausgibt
jeder Mocha-Reporter (https://mochajs.org/#reporters) kann verwendet werden, da Cypress auf Mocha basiert
der TeamCity und jUnit-Reporter (wird bei TestbenchCS im Jenkins verwendet) sind bereits in Cypress integriert und müssen nicht extra installiert werden
Es können eigene Reporter erstellt werden oder Community-Reporter per NPM installiert werden, z.B.
HTML-Reports mittels Mochawesome: http://antontelesh.github.io/testing/2019/02/04/mochawesome-merge.html
Ein Beispiel für einen Custom-Reporter existiert für die TestbenchCS: https://github.com/testbench-cs-imbus/tbcs-api-cypress-parser
https://docs.cypress.io/guides/references/best-practices
https://www.youtube.com/watch?v=5XQOK0v_YRE
Die wichtigsten Best-Practices…
.only
beim Test setzen. Wird Test wiederholt grün ->cy.get('.list li').should('have.length', 2).find('label').should('contain', 'todo B')
https://docs.cypress.io/guides/tooling/plugins-guide
https://docs.cypress.io/plugins/directory
Es ist möglich Cypress auch mit eigenen Plugins zu erweitern :-)
https://docs.cypress.io/guides/overview/key-differences
Protractor mittlerweile deprecated: https://blog.angular.io/angular-v12-is-now-available-32ed51fbfd49
Für Migrations-Projekte: https://docs.cypress.io/guides/migrating-to-cypress/protractor#Introduction
flowchart BT
subgraph Selenium
a1(Test Code)-->a2(Selenium WebDriver)-->a3(Browser)-->a4(Application)
end
subgraph Cypress
b1(Test Code)-->b2(Cypress Framework)
subgraph Browser
b2-->b3(Universal)-->b4(Application)
end
end
Cypress: läuft im run-loop der Applikation
Selenium: Sendet commands über Treiber an Browser
Gilt analog für W3C WebDriverAPI-basierte Tools wie WebdriverIO und NightwatchJS
Details siehe: https://www.browserstack.com/guide/cypress-vs-webdriverio
Cypress | Puppeteer | Playwright | TestCafe | |
---|---|---|---|---|
Webseite | https://cypress.io | https://pptr.dev | https://playwright.dev | https://testcafe.io |
Anforderungen | Node.js 12+ | Node 10.18.1+ | Node.js 12+ | Node.js 10+ |
Browser | Chromium, Edge, Firefox | Chromium | Chrome/ium, Edge, Firefox, WebKit | Chromium, Edge, Firefox, Safari, IE11+, Chrome-/Safari-Mobile |
Cross-Browser Testing | nein | nur für unterstütze Browser | ja | ja |
Multi-Tab Testing | nur indirekt | ja | ja | ja |
direkter DOM-Zugriff | ja | ja | ja | ja |
Docker-Images | ja | siehe Troubleshooting/Docker | ja | ja |
Test Recorder | Cypress Studio in alpha | ab Chrome 92: in DevTools | Playwright codegen | kostenpflichtiger Visual Test Recorder |
Component Testing | ja | nein | nein | nein |
Visual Testing | ja | ja | ja | ja |
Parallele Tests | unterstützt je Browser | ja | ja | ja |
Test Retries | ja | ja | ja | ja |
Automatic Wait | ja | nein | ja | ja |
Network Interception | ja | ja | ja | ja |
Time Travel Debugger | ja | nein | Trace Viewer + VS-Code-Debugging | nein |
Dashboard | ja | nein | nein | in Alpha Test |
Sprache | JavaScript/TypeScript | JavaScript/Typescript | JavaScript/Typescript, Python, Java, .NET | JavaScript/Typescript |
Lösungen mit Puppeteer, Playwright, TestCafe, WebDriver oder Appium lassen sich gut mit Codecept kombinieren: https://codecept.io
Cypress hat eine sehr gute Dokumenation
leicht zu lernen
schnell eingerichtet (auch Pipeline)
viele Plugins verfügbar
Cypress ist sehr Developer-freundlich -> Gut für Shift-Left!
Cypress hat eine andere Zielgruppe als z.B. Selenium -> Lässt sich auch gut zusammen verwenden!