前言
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 | true | 如果命令以非零代碼退出是否失敗 |
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)
})
options 選項
設置 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命令日志中的命令時,控制台將輸出以下內容:
cy.exec() 能執行系統命令,所以當然也是可以執行python的命令行指令的,如在cmd里面執行
python xx.py