天天看点

Cypress web自动化34-cy.exec()执行系统命令

前言

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')
}      
Cypress web自动化34-cy.exec()执行系统命令

单击exec命令日志中的命令时,控制台将输出以下内容:

继续阅读