ruffainn
ruffainn

Reputation: 101

How to have different assertion for a single test running multiple times

While testing to log in using 4 different users, I need to use 4 different assertions and each assertation should only be associated with its particular user.

Example.

In the below test I am getting an error as Cypress is looking for an error1 message for user 1 When the test runs with the first user.

it('Login with multiple users', () => {
        cy.readFile('cypress/fixtures/userdata.json').then((users) => {
          users.forEach((user) => {
            cy.visit('/')
            cy.get('[data-test="username"]').type(user.username)
            cy.get('[data-test="password"]').type(user.password)
            cy.get('[data-test="login-button"]').click()
            cy.url('https://www.saucedemo.com/inventory.html')
            cy.get('[data-test="error"]').should('have.text', user.error1)
            cy.get('[data-test="error"]').should('have.text', user.error2)
            cy.get('[data-test="error"]').should('have.text', user.error3)
            
          })
        })
      })

Upvotes: 0

Views: 69

Answers (1)

Alapan Das
Alapan Das

Reputation: 18624

In your JSON you can add an extra field errorMessage and url.

[
  {
    "id": "standard User",
    "username": "standard_user",
    "password": "secret_sauce",
    "url": "https://www.saucedemo.com/inventory.html"
  },
  {
    "id": "locked out user",
    "username": "locked_out_user",
    "password": "secret_sauce",
    "errorMessage": "error 2"
  },
  {
    "id": "Problem user",
    "username": "problem_user",
    "password": "secret_sauce",
    "errorMessage": "error 3"
  },
  {
    "id": "perfromance glitch user",
    "username": "performance_glitch_user",
    "password": "secret_sauce",
    "errorMessage": "error 4"
  },
  {
    "id": "Invalid User",
    "username": "perform",
    "password": "secret12",
    "errorMessage": "error 5"
  }
]

You test should be like this:

it('Login with multiple users', () => {
  cy.readFile('users.json').then((users) => {
    users.forEach((user) => {
      cy.visit('/')
      cy.get('[data-test="username"]').type(user.username)
      cy.get('[data-test="password"]').type(user.password)
      cy.get('[data-test="login-button"]').click()
      if (user.username == 'standard_user') {
        cy.url().should('eq', user.url)
      } else {
        cy.get('[data-test="error"]').should('have.text', user.errorMessage)
      }
    })
  })
})

Upvotes: 2

Related Questions