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() возвращает объект со следующими свойствами:
codestdoutstderr
Примеры
Команда
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')
}
Вышеприведённая команда отобразится в Журнале команд как:
При нажатии на команду exec в журнале команд, консоль выводит следующее:
См. также
© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/exec