前言
cypress 提供了执行系统命令的方法 cy.exec() ,这方便在用例之前准备测试数据,和清理测试数据。
cy.exec()语法
执行系统命令语法
cy.exec(command)
cy.exec(command, options)
使用示例
cy.exec('npm run build')
command 字符串
从项目根目录(包含默认cypress.json配置文件的目录)执行的系统命令。
options 选项
传递选项对象以更改的默认行为cy.exec()。
options 选项参数说明
选项 | 默认 | 描述 |
---|---|---|
log | true | 在命令日志中显示命令 |
env | {} | 在命令执行之前要设置的环境变量的对象(例如{USERNAME: 'johndoe'})。将与现有系统环境变量合并 |
failOnNonZeroExit | 如果命令以非零代码退出是否失败 | |
timeout | execTimeout | 超时时间默认60秒 |
返回结果
cy.exec() 执行之后,结果返回以下属性的对象:
- code code为0 是成功
- stdout 执行系统命令行输出内容
- stderr 报错内容
cy.exec() 为运行任意系统命令提供了一个退出功能,因此您可以在cypress范围之外执行测试所需的操作。适用于以下场景:
- 运行构建脚本
- 操作测试数据库
- 启动过程
- 杀死进程
运行构建命令
cy.exec('npm run build').then((result) => {
// 生成result对象
// {
// 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')
写入文件以根据响应主体创建固定fixture
cy.server()
cy.route('POST', '/comments').as('postComment')
cy.get('.add-comment').click()
cy.wait('@postComment').then((xhr) => {
cy.exec(`echo ${JSON.stringify(xhr.responseBody)} >cypress/fixtures/comment.json`)
cy.fixture('comment.json').should('deep.eq', xhr.responseBody)
})
设置 timeout 超时时间
// 如果脚本任务20s没执行完成,那么就会失败
cy.exec('npm run build', { timeout: 20000 })
选择在非零退出时不失败,并在代码和stderr上声明
cy.exec('man bear pig', { failOnNonZeroExit: false }).then((obj) => {
expect(obj.code).to.eq(1)
expect(obj.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会杀死命令的进程并使当前测试失败。
- cy.exec() 只会运行您已链接一次的断言,并且不会重试。
- 不要用 cy.exec() 启动web服务
查看日志
列出默认 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命令日志中的命令时,控制台将输出以下内容: