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