Skip to main content
Cypress应用

exec

执行系统命令。

caution
反模式

不要尝试通过 cy.exec() 启动 web 服务器。

阅读关于最佳实践的内容。

语法

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

用法

正确用法

cy.exec('npm run build')

参数

command (String)

从项目根目录(包含 Cypress 配置文件的目录)执行的系统命令。

options (Object)

传入选项对象以改变 cy.exec() 的默认行为。

选项默认值描述
logtrue命令日志 中显示命令
env{}执行命令前设置的环境变量对象(例如 {USERNAME: 'johndoe'})。将与现有系统环境变量合并
failOnNonZeroExittrue如果命令以非零代码退出是否失败
timeoutexecTimeout等待 cy.exec() 解析的超时时间 超时

生成结果 了解主题管理

cy.exec() 返回一个包含以下属性的对象:

  • code
  • stdout
  • stderr

示例

命令

cy.exec() 提供了执行任意系统命令的逃生舱口,因此你可以在 Cypress 范围之外执行测试所需的操作。这适用于:

  • 运行构建脚本
  • 初始化测试数据库
  • 启动进程
  • 终止进程

运行构建命令

cy.exec('npm run build').then((result) => {
// 返回 'result' 对象
// {
// code: 0,
// stdout: "文件构建成功",
// stderr: ""
// }
})

初始化数据库并断言成功

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

运行任意脚本并断言输出

cy.exec('npm run my-script')
.its('stdout')
.should('contain', '脚本运行完成')

写入文件以从响应体创建 fixture

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() 完成,因此长时间运行的命令会显著减慢测试周期。

// 如果脚本执行超过 20 秒将失败
cy.exec('npm run build', { timeout: 20000 })

选择在非零退出时不失败并断言 code 和 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.config() 重置超时

你可以通过 Cypress.config() 设置 execTimeout 的新值来更改剩余测试的 cy.exec() 超时时间。

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')
})

// 测试

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

规则

要求 了解命令链

  • cy.exec() 需要链式调用 cy
  • cy.exec() 需要执行的系统命令最终退出。
  • cy.exec() 要求当 failOnNonZeroExittrue 时退出代码为 0

断言 了解断言

  • cy.exec() 只会运行一次你链式调用的断言,不会 重试

超时设置 了解超时机制

  • cy.exec() 可能会因等待系统命令退出而超时。

命令日志

列出 package.json 文件的内容

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

上述命令将在命令日志中显示为:

Command Log exec

当点击命令日志中的 exec 命令时,控制台输出如下:

console.log exec

另请参阅