Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/noriste/frontend-testing-on-steroids
Front-end Testing on Steroids - companion repo
https://github.com/noriste/frontend-testing-on-steroids
cypress-io testing-javascript
Last synced: 2 months ago
JSON representation
Front-end Testing on Steroids - companion repo
- Host: GitHub
- URL: https://github.com/noriste/frontend-testing-on-steroids
- Owner: NoriSte
- Created: 2020-04-20T05:45:35.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2021-05-12T06:48:20.000Z (over 3 years ago)
- Last Synced: 2024-10-11T20:11:18.790Z (3 months ago)
- Topics: cypress-io, testing-javascript
- Language: JavaScript
- Homepage: https://slides.com/noriste/frontend-testing-on-steroids
- Size: 401 KB
- Stars: 4
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Front-end Testing on Steroids
Why testing a front-end application is so hard? What are the main challenges you need to face? Why do the tests fail without a clear reason?
This talk is about good testing best practices and the tool that is become the de-facto standard of UI Testing: Cypress.Please note: this is the spoken version of my ["Some UI testing problems and the Cypress way"](https://dev.to/noriste/some-ui-testing-problems-and-the-cypress-way-1167) article.
## Talk walkthrough
### 1 - Cypress works in the browser
There is not an orchestrating Bash script and an orchestrated browser, the tests work directly in the browser.
Topics:
- the Cypress Test List UI: allows easy test selection
- the Cypress Test Runner UI: allows understanding what happens in the app and in Cypress
- everything works in the browser: you do not need to go back and forth from the Bash to the browser
- everything is logged inside the browser' console: you do not need to aggregate logs anymore
- easier command understanding: less tools means more trivial understanding and debuggingExamples:
- logging from the test
- logging from the app
- accessing document.window' properties from the test
- rich assertion results are logged too### 2 - Everything is async in UI testing
Everything is asynchronous by definition in browserland
Topics:
- there are not sync/async differences, everything is async by definition
- automatic waitingExamples:
- retrieving and interacting with an element
- asserting about an element visibility### 3 - Debugging
Debugging is typically hard in E2E testing. Cypress comes to the rescue with a lot of first-class utilities.
Topics:
- tests can be paused and resumed later
- the Cypress Test Runner allows time-travelling: you can analyze the DOM at every test step
- tests have not timeouts, commands have: if something goes wrong, you discover it as soon as possible, without waiting for the while test timeout
- DOM-related errors: when interacting with an element is not possible, Cypress tells you the reason why
- automatic screenshot and videos: in case of failures, watching a video is easier than reading the logExamples:
- pausing a test programmatically
- time travelling in action
- DOM-related errors with a fixed div all over the contents
- checking failure video### 4 - UI Integration Tests
E2E Testing is not so important due to its complexity. With full network stubbing, testing only the front-end application is easy and profitable.
Topics:
- full network stubbing
- network error simulationExamples:
- stubbing the wrong request: how a malformed stub could be detected with Cypress
- stubbing the right request
- happy path testing
- edge case testing### Productivity
Cypress can be used not only as a development tool but as even as the main development browser.
Topics:
- automating manual interactions while developing
- debugging with Chrome devtools
- installing the React and Redux devtools### Bonus point
To leverage Cypress' full potential and have stable and useful tests there are a lot of UI Testing best practices.
Topics:
- retrieving elements by their contents: consuming the app the same way the user does is really important in order to have user-centered tests
- AJAX request and response assertions: asserting about AJAX requests alleviates test failure debugging
- clock management: long duration tasks could be fastly tested by controlling browser clock
- running E2E tests just for the happy path: running a limited number of E2E tests saves you a lot of timeExamples:
- full UI Integration tests
- full E2E tests---
## About this repository
- I bootstrapped this project with [create-react-app](https://facebook.github.io/create-react-app/docs/getting-started)
- it contains a super-simple authentication form
- it contains a fake server with artificial delays to simulate E2E testing slowness
- all the code is well commented, with a lot of links to the slide explanations
- I wrote the front-end app with a outside-in approach writing the acceptance test at the beginning.
I have not tested it manually at all!## How to play with it
There are four main commands:
- `npm run start`: starts the (super simple) front-end app and the (fake) back-end app
- `npm run cy:open`: opens the Cypress UI
- `npm test`: launches both the front-end and the back-end apps, and runs cypress in the non-visual
mode. Remember killing the manually launched apps since it uses the same ports## How to read it
- launch the front-end app and take a look at the `src/App.js` file
- launch both the back-end app and Cypress
- launch the `authentication.integration.test.js` in Cypress and watch it running
- open the `cypress/integration/authentication.integration.test.js` and explore it
- then, move to the `cypress/integration/authentication.e2e.test.js`
- in the end: run the `npm test` command## UI Testing Best Practices book
Do not forge to add a star to my (work in progress) [UI Testing Best
Practices](https://github.com/NoriSte/ui-testing-best-practices) book on GitHub 😊