Cypress Tips

Grep commands

Configs

# only runs filtered tests, not running all tests then filter what to run
--env.grepFilterSpecs=true

# completely omits test when test is filtered by grep, default is pending
--env.grepOmitFiltered=true

# 둘다 적용시
--env.'grepFilterSpecs=true,grepOmitFiltered=true'

Tag tests

cypress/npm/grep at develop

describe('block with config tag', { tags: ['@smoke', '@fast'] }, () => {})
# @smoke tag가 있는 테스트만
--env.grepTags=@smoke
# @smoke tag가 없는 테스트만
--env.grepTags=-@smoke
# @smoke, @fast 둘 다 있는 테스트만(and)
--env.grepTags=@smoke+@fast
# @smoke, @fast 둘 중 하나라도 있는 테스트만(or)
--env.grepTags='@smoke @fast'

# tag 없는 테스트들
--env.grepUntagged=true

Fixtures

fixture | Cypress project root에서 root/cypress/fixtures/* 을 읽어오기에 해당 폴더에 원하는 파일을 넣어 DDT 염두에 둘 수도 있습니다

// root/cypress/fixtures/auth.json
{
  "WRONG_ID": "user@user.com",
  "WRONG_PW": "userpassword"
}

// root/e2e/test.cy.ts
cy.fixture('auth.json').then((auth) => {
  getInputByPlaceholer('email').type(auth.WRONG_ID);
  getInputByPlaceholer('password').type(auth.WRONG_PW);
});

Config

Configuration | Cypress

Testing Downloads

const downloadsFolder = Cypress.**config**('downloadsFolder');

it(
  'As an admin, I should be able to download registration list',
  () => {
    getButtonByName('download waitlist csv').first().click();

    cy.log(`Downloaded at: ${downloadsFolder}/waitlist.csv`);

    cy.readFile(`${downloadsFolder}/waitlist.csv`, {
      timeout: 15_000,
    }).should('not.be.null');
  }
);

Graphql

Working with GraphQL | Cypress 데이터가 있어야 렌더링되는 컴포넌트를 테스트 할 때 사용됩니다.

/**
 * Utility to match GraphQL mutation based on the operation name
 */
export const hasOperationName = (
  req: CyHttpMessages.IncomingHttpRequest,
  operationName: string
) => {
  const { body } = req
  return (
    Object.prototype.hasOwnProperty.call(body, 'operationName') &&
    body.operationName === operationName
  )
}

/**
 * Alias query if operationName matches
 * @example cy.wait('@gqlWaitlistConnectionQuery');
 */
export const aliasQuery = (req: CyHttpMessages.IncomingHttpRequest, operationName: string) => {
  if (hasOperationName(req, operationName)) {
    req.alias = `gql${operationName}Query`
  }
}

// graphql의 data를 기다리는 예시
cy.intercept('https://apiToFetch.com', (req) => {
  aliasQuery(req, 'PseImageRepositories')
  aliasQuery(req, 'UserProfile')
})

cy.wait('@gql<apiToFetch>Query').its('response.body.data')

Stub

stub | Cypress Documentation jest.mockFn 과 유사한 기능을 수행합니다. 아래 예시는 cypress는 window.confirm이나 alert를 기본으로는 모두 accept하기에 stub을 이용해서 이를 dismiss하고 call이 되었는지 테스트합니다.

const stub = cy.stub().returns(false)

cy.on('window:confirm', stub)
cy.get('[data-testid=tag-wrapper] > svg')
  .last()
  .click()
  .then(() => {
    expect(stub.getCall(0))
  })