Spec-Zone.ru › Cypress

exec

Выполнить системную команду.

Антипаттерн

Не пытайтесь запустить веб-сервер из cy.exec().

Подробнее о лучших практиках здесь.

Синтаксис

cy.exec(command)
cy.exec(command, options)

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

Правильное использование

cy.exec('npm run build')

Аргументы

command (Строка)

Системная команда, которая должна быть выполнена из корневой директории проекта (каталог, содержащий файл конфигурации cypress.json по умолчанию).

options (Объект)

Передайте объект options, чтобы изменить поведение cy.exec() по умолчанию.

Опция Значение по умолчанию Описание
log true Отображает команду в Журнале команд
env {} Объект переменных среды, которые должны быть установлены перед выполнением команды (например, {USERNAME: 'johndoe'}). Будет объединён с существующими системными переменными среды.
failOnNonZeroExit true Вызывать ошибку, если команда завершится с ненулевым кодом
timeout execTimeout Время ожидания cy.exec() для разрешения перед таймаутом

Возвращаемое значение

cy.exec() возвращает объект со следующими свойствами:

  • code
  • stdout
  • stderr

Примеры

Команда

cy.exec() предоставляет возможность запуска произвольных системных команд, чтобы выполнить действия, необходимые для вашего теста за пределами Cypress. Это полезно для:

  • Запуска скриптов сборки
  • Заполнения вашей тестовой базы данных
  • Запуска процессов
  • Остановки процессов

Запуск команды сборки

cy.exec('npm run build').then((result) => {
  // yields the 'result' object
  // {
  //   code: 0,
  //   stdout: "Files successfully built",
  //   stderr: ""
  // }
})

Заполнение базы данных и проверка её успешного заполнения

cy.exec('rake db:seed').its('code').should('eq', 0)

Запуск произвольного скрипта и проверка его вывода

cy.exec('npm run my-script')
  .its('stdout')
  .should('contain', 'Done running the script')

Запись в файл для создания фикстуры из тела ответа

cy.intercept('POST', '/comments').as('postComment')
cy.get('.add-comment').click()
cy.wait('@postComment').then(({ response }) => {
  cy.exec(
    `echo ${JSON.stringify(response.body)} >cypress/fixtures/comment.json`
  )
  cy.fixture('comment.json').should('deep.eq', response.body)
})

Опции

Изменение таймаута

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

Cypress не продолжит выполнение других команд, пока cy.exec() не завершится, поэтому длительно работающая команда значительно замедлит цикл ваших тестов.

// will fail if script takes longer than 20 seconds to finish
cy.exec('npm run build', { timeout: 20000 })

Отказ от вывода ошибки при ненулевом коде выхода и проверка кода и stderr

cy.exec('man bear pig', { failOnNonZeroExit: false }).then((result) => {
  expect(result.code).to.eq(1)
  expect(result.stderr).to.contain('No manual entry for bear')
})

Указание переменных среды

cy.exec('echo $USERNAME', { env: { USERNAME: 'johndoe' } })
  .its('stdout')
  .should('contain', 'johndoe')

Примечания

Команды должны завершаться

Команды, которые не завершаются, не поддерживаются

cy.exec() не поддерживает команды, которые не завершаются, такие как:

  • Запуск rails server
  • Задача, выполняющая мониторинг
  • Любой процесс, который нужно прервать вручную для остановки

Команда должна завершиться в течение execTimeout, иначе Cypress завершит процесс команды и прервёт текущий тест.

Сброс таймаута через конфигурацию Cypress

Вы можете изменить таймаут cy.exec() для оставшихся тестов, установив новые значения для execTimeout в Cypress.config().

Cypress.config('execTimeout', 30000)
Cypress.config('execTimeout') // => 30000

Установить таймаут в конфигурации теста

Вы можете настроить таймаут cy.exec() в наборе или тесте, передав новое значение конфигурации в конфигурацию теста.

Это установит таймаут на всё время выполнения тестов, а затем вернёт его к значению по умолчанию execTimeout по завершении.

describe('has data available from database', { execTimeout: 90000 }, () => {
  before(() => {
    cy.exec('rake db:seed')
  })

  // tests

  after(() => {
    cy.exec('rake db:reset')
  })
})

Правила

Требования

  • cy.exec() требует привязки к cy .
  • cy.exec() требует, чтобы выполняемая системная команда в конечном итоге завершилась.
  • cy.exec() требует, чтобы код выхода был 0 , когда failOnNonZeroExit равен true .

Проверки

  • cy.exec() выполнит проверки только один раз и не будет повторён повторно .

Таймауты

  • cy.exec() может превысить время ожидания завершения системной команды.

Журнал команд

Вывод содержимого файла конфигурации cypress.json по умолчанию

if (Cypress.platform === 'win32') {
  cy.exec('print cypress.json').its('stderr').should('be.empty')
} else {
  cy.exec('cat cypress.json').its('stderr').should('be.empty')
}

Вышеприведённая команда отобразится в Журнале команд как:

Command Log exec

При нажатии на команду exec в журнале команд, консоль выводит следующее:

console.log exec

См. также

  • cy.readFile()
  • cy.request()
  • cy.task()
  • cy.writeFile()

© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/exec

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API