Как сделать часть моего теста многоразовой, чтобы ее можно было использовать или вызывать в других будущих тестах с использованием Cypress Javascript? - PullRequest
0 голосов
/ 02 января 2019

Фон

Привет, я новичок в Cypress, и у меня есть следующий код, который позволяет указанному типу пользователя (из 4 всего) войти в систему.

Поскольку это один из основных тестов, вместо того, чтобы копировать и вставлять один и тот же код в каждый из моих новых тестов, я хотел бы сделать их повторно используемыми, чтобы в будущих тестах их можно было использовать или " позвонил снова.

Будет проще хранить эти тесты в отдельной папке и отдельных файлах, чтобы они могли обслуживаться самостоятельно, но при необходимости иметь возможность вызывать их в любых будущих файлах тестов, которые я создал.

Например, если у меня есть будущий тест, относящийся к учителю, я могу вызвать функцию, которая выполняет вход для учителя, и затем начать писать оставшуюся часть сценария, которая на самом деле имеет дело с тестом, без необходимости возиться с копированием и вставкой каждый раз.

Блок кода, выполняющий часть входа в систему, приведен ниже (и практически одинаков для всех других типов пользователей)

Я пытался исследовать, как создавать методы и функции, но не слишком уверен в структуре, которую я должен использовать, и посмотрел на документацию, но я немного озадачен.

describe('Create Homework', function() {
  it('Create New Assignment', function() {
  cy.visit('http://www.demoapp.com')
  cy.contains('Log in')

  // Check that the user has indeed landed on the login page
  cy.url().should('include','/login')

  // Make a school selection
  cy.get('#school-selector-search-box')
  .type('Bristol Free School')
  // Click the suggestion
  .get('.suggestions > .ember-view.suggestion:nth-of-type(1) > .suggested-school-name').click()

  // Enter a username at this step
  cy.get('#identification')
  .type('gdawson_4319c')
  .should ('have.value','gdawson_4319c')

  // Enter a password at this step
  cy.get('#password')
  .type('demo')
  .should ('have.value','demo')

  // Proceed to login to account
  cy.get('.actions > .btn').click()

  // Assert that Dashboard is visible
  cy.get('h1.main-header-title')
  cy.contains ('Dashboard')
   })
 })

Результат

Иметь возможность обернуть вышеупомянутый код во что-то (например, функцию), что сделало бы его многократно используемым, чтобы я мог использовать эти шаги в другом тесте без необходимости вручную копировать и вставлять его. Это означает, что я могу переместить их в отдельный файл и вызывать их только тогда, когда мне нужно выполнить эти шаги, что сэкономит мне время.

1 Ответ

0 голосов
/ 03 января 2019

Вы можете сделать это с помощью пользовательских команд .

Добавьте это в cypress/support/commands.js файл:

Cypress.Commands.add("login", (username, password) => {
  cy.visit('http://www.demoapp.com')
  cy.contains('Log in')

  // Check that the user has indeed landed on the login page
  cy.url().should('include','/login')

  // Make a school selection
  cy.get('#school-selector-search-box')
    .type('Bristol Free School')
    // Click the suggestion
    .get('.suggestions > .ember-view.suggestion:nth-of-type(1) > .suggested-school- 
   name').click()

  // Enter a username at this step
  cy.get('#identification')
    .type(username)
    .should ('have.value', username)

  // Enter a password at this step
  cy.get('#password')
    .type(password)
    .should ('have.value', password)

  // Proceed to login to account
  cy.get('.actions > .btn').click()

  // Assert that Dashboard is visible
  cy.get('h1.main-header-title')
  cy.contains ('Dashboard')
})

Затем вы можете вызвать его из своего теста следующим образом: обратите внимание, что я использовал beforeEach, который будет запускать логин перед каждым тестом без необходимости писать его несколько раз:

describe('Create Homework', function() {
  beforeEach(() => {
    cy.login('gdawson_4319c', 'demo');
  })

  it('Create New Assignment', function() {
    // Now only your test logic goes here
  })
})
...