Try โ€‚โ€‰HackMD
tags: self-taught

Frontend testing with Cypress

I. What is frontend testing about

In short, front-end testing validates that what people see on the site and the features they use on it work as intended.
Source: https://css-tricks.com/front-end-testing-is-for-everyone/

Among all the tests, end-to-end testing and component testing are mostly about seeing how things are visually rendered and how user interaction works. Therefore, i'll focus on these 2 this time.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More โ†’

II. What is Cypress

Cypress is a javascript testing framework, it can test anything that run in a bowser. Some of the most apprciated features of Cypress are:

  • Time Travel: Cypress takes snapshots as your tests run. Hover over commands in the Command Log to see exactly what happened at each step.
  • Debuggability: Stop guessing why your tests are failing. Debug directly from familiar tools like Developer Tools. Our readable errors and stack traces make debugging lightning fast.
  • Automatic Waiting: Never add waits or sleeps to your tests. Cypress automatically waits for commands and assertions before moving on. No more async hell.
    Other features are listed here: https://docs.cypress.io/guides/overview/why-cypress#Features
    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More โ†’

III. How to implement

1/ Installation

npm install cypress --save-dev

Then, in your package.json, add script "e2e": "cypress open"
As soon as you run the script, a cypress welcome screen will appear with 2 options of testing for you to choose.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More โ†’

And, below folder structure will be created
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More โ†’

  • downloads: keep downloaded files during testing
  • fixtures: keep the data that will be re-used throughout the test
  • integration: keep all the tests
  • plugins: Plugins provide a way to support and extend the behavior of Cypress. If you want to write plugins, store them here.
  • support: where you write a custom command for cypress or overwrite existing ones.

2/ How to write test case

If you're familiar with other testing library, you won't feel lost with Cypress. Let's have a quick look on how to write a test case before heading to those 2 testing options.

1: describe a test

describe('My First Test', () => {})

2: write test case

describe('My First Test', () => {
  it('my test case #1', () => {}
})

3: use cypress command api to simulate the user actions and make assertions
https://docs.cypress.io/api/table-of-contents
https://docs.cypress.io/guides/references/assertions

3/ End-to-end testing

When you choose "E2E Testing", you'll be asked to choose the browser on which the test will run. After browser selection, you'll be taken to a dashboard. All the test specs that you have in "e2e" folder will appear here, select the test to run. Every step of a test case will be captured so we can go back to see if it got the right element or what caused the test to fail.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More โ†’

Here, i have an example of testing the login feature.
And as you can see, every step of the test case is able to be reviewed.

describe('mytest', () => {
  const email = 'abc@company.com';
  const password = '@123Abc';

  it('authorized', () => {
    cy.visit('http://localhost:3000/login');
    cy.get('input[name=email]').type(email);
    cy.get('input[name=password]').type(password);
    cy.get('button[name=login]').click();
    cy.get('div').contains('login success').should('exist');
  })
})

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More โ†’

Now, if you're awared of Puppeteer, a testing library from Google that allow you to record your interaction on Chrome and and turn that in to test code. What if i tell you that you can do the same thing with Cypress, and even have 2 approachs to do that ๐ŸŽ‰.

  • The first one is to get the record on Chrome and install an extra package to create the magic.
  • The other one is to enable the experimentalStudio mode in cypress config. I personally prefer this way because we dont have to install anything else.

With second approach, the test code will be added to your current test suite, like this:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More โ†’

4/ Component testing

For component testing, when the dashboard opens, it will scan your project and list out all components that you have.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More โ†’

After selection, a starter test file will be created in the same location with the selected component and you can start adding test cases as you wish.

IV. Conclusion

I have wrote about Puppeteer once as i found the record feature very apealing. But now, even Cypress has that feature, together with all the pros it has, i believe there's no reason to not try it on our next project.