天天看點

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指令日志中的指令時,控制台将輸出以下内容:

繼續閱讀