<style>.lazy{display:none}</style>Генерация случайного пользователя в тестах Cypress

Генерация случайного пользователя в тестах Cypress

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

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

БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале "Библиотека тестировщика"

Содержание

Использование хука

Можно поместить хук before() или beforeEach() в файл support/index.js следующим образом:

const { internet } = require('faker');
const email = internet.exampleEmail()
const password = internet.password()

beforeEach(() => {
  cy
    .request('POST', '/signup', { email, password })
    .then(({ body }) => {
    cy
      .setCookie('trello_token', body.accessToken);
  });
});

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

Регистрация перед каждым тестом может создать достаточно большой объем данных. С другой стороны, это помогает нашим тестам быть отделенными друг от друга. Обычно это хорошо, но для большинства тестов создание нового пользователя может оказаться излишним.

Кстати, синтаксис фигурных скобок в приведенном выше коде известен как деструктуризация. Это синтаксис JavaScript, и вы можете ознакомиться со статьей о том, как его использовать в Cypress.

Создание скрипта

Суть данного подхода в том, что перед запуском теста с помощью cypress run запускается скрипт, который создает тестового пользователя и записывает его в файл. Затем этот файл используется в тесте для входа в систему:

const axios = require('axios')
const { internet } = require('faker');
const email = internet.exampleEmail()
const password = internet.password()
const fs = require('fs')

const signupUser = async () => {

  const user = await axios
    .post('http://localhost:3000/signup', { email, password })
      
  fs.writeFileSync("./cypress/data.json", JSON.stringify(user.data))

}

signupUser()

Лучше запускать это как отдельный скрипт, хранящийся в вашем файле package.json:

"scripts": {
    "start": "cd trelloapp && npm start",
    "cy:run": "cypress run",
    "createUser": "node signupUser.js"
  }

Когда у вас есть такой скрипт, вы можете запустить его с помощью npm run createUser, а затем запустить свои тесты с помощью npm run cy:run. В тесте ниже происходит чтение файла и установка cookie авторизации из него:

cy
  .readFile('./cypress/data.json')
  .then(({ accessToken }) => {
  cy
    .setCookie('trello_token', accessToken);
}); 

При выборе этого подхода важно включить data.json в файл .gitignore. Особенно – если созданный вами пользователь будет использоваться многократно для последующих тестов.

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

У этого решения есть и другие недостатки. Так, если вы забудете запустить скрипт, то ваши тесты не пройдут. Как вариант, вы можете запустить этот скрипт как плагин и разрешить его во время настройки Cypress.

Написание плагина

Теперь перепишем наш скрипт signupUser так, чтобы он возвращал данные ответа и мог быть импортирован как модуль:

const signupUser = async () => {

  const user = await axios
    .post('http://localhost:3000/signup', { email, password })
      
  return user.data

}

module.exports = signupUser

Теперь мы можем импортировать этот модуль в наш файл plugins/index.js и использовать его при настройке:

const signupUser = require('../../signupUser.js')

module.exports = async (on, config) => {

  config.env = await signupUser()

  return config;

}

Cypress будет ждать, пока выполнится наша функция signupUser(), а затем сохранит данные, возвращаемые этой функцией, в объект config. Наши данные генерируются во время выполнения теста и доступны только во время работы Cypress. Если вы запускаете тесты параллельно, например, на 10 машинах, то этот скрипт будет вызван 10 раз. Благодаря этому сгенерированные пользователи не будут мешать друг другу.

Перевод статьи «Generating a random user in Cypress test».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *