系列內容
- web自動化測試框架-01 搭建基礎架構並執行一個樣例
- web自動化測試框架-02 快速開發用例文件指令碼
- web自動化測試框架-03 介紹標籤,背景,場景,場景大綱
- web自動化系列教程- 04 Hooks與TimeOut介紹
- web自動化測試框架-05 建立資料驅動的測試用例,Doc String與Data Table
- web自動化測試框架-06 如何快速編寫自動化指令碼
備註:配合免費視訊教程,獲取更佳的學習效果!課程連結: ke.qq.com/course/2815…
在上一講的內容裡,我們講解了設計場景時不同型別場景的區別。今天我們來介紹一下Cucumber程式碼執行部分。
主要內容
- hooks 介紹
- 自定義hooks
- 跳過執行設定
- TimeOut介紹
- 自定義TimeOut
- 禁用TimeOut
配合免費視訊教程,獲取更佳的學習效果!點此 課程連結
Hooks 介紹
Hooks(鉤子) 用於在每個場景執行之前和之後的操作,例如,Web自動化測試中場景執行之前一般我們會開啟瀏覽器並最大化視窗,場景執行之後做截圖操作,這些我們都可以定義在hooks中。
Cucumber中的hook提供瞭如下四個方法:
- BeforeAll
- Before
- After
- AfterAll
BeforeAll
在所有場景執行之前的操作,例如開啟瀏覽器並最大化最大化視窗。每個BeforeAll函式只會執行一次。
const {BeforeAll} = require('cucumber')BeforeAll(async function(){
await driver.manage().window().maximize()
})
複製程式碼
Before
每個場景執行之前的操作,例如執行操作之前清空瀏覽器cookie
const {Before} = require('cucumber')Before(async function () {
await driver.manage().deleteAllCookies()
})
複製程式碼
After
每個場景執行之後的操作,例如執行操作後進行截圖
const {After} = require('cucumber')After(async function () {
//After Scenario Hook
//capture screenshot after each scenario
let screenshot = await driver.takeScreenshot();
this.attach(screenshot, 'image/png');
});
複製程式碼
AfterAll
執行完所有的場景之後的操作,例如執行完畢後關閉瀏覽器例項
const {AfterAll} = require('cucumber')AfterAll(function () {
//perform some shared teardown
return driver.quit();
})
複製程式碼
自定義Hooks
我們在feature檔案中可以為不同的功能或場景設定標籤(tag),hook函式可以設定應用在哪些tag上,例如下面的例子:
var {After, Before} = require('cucumber');
Before(function () {
// This hook will be executed before all scenarios
});
Before({tags: "@foo"}, function () {
// This hook will be executed before scenarios tagged with @foo
});
Before({tags: "@foo and @bar"}, function () {
// This hook will be executed before scenarios tagged with @foo and @bar
});
Before({tags: "@foo or @bar"}, function () {
// This hook will be executed before scenarios tagged with @foo or @bar
});
// You can use the following shorthand when only specifying tags
Before("@foo", function () {
// This hook will be executed before scenarios tagged with @foo
});
複製程式碼
跳過執行設定
如果某些場景需要跳過執行,直接在hooks中返回 skipped 即可。用法如下:
Before(function() {
// perform some runtime check to decide whether to skip the proceeding scenario
return 'skipped'
});
複製程式碼
TimeOut介紹
Node.js中很多操作是非同步的,為了解決非同步中忘了呼叫回撥,或其它錯誤如不小心寫了一個死迴圈,在Cucumber中通過設定超時時間來避免這種情況發生,預設的超時時間為5秒。通過呼叫 setDefaultTimeout
方法更改預設全域性超時時間。
var {setDefaultTimeout} = require('cucumber');
setDefaultTimeout(60 * 1000);
複製程式碼
自定義TimeOut
有時5秒的超時時間太短,有些瀏覽器操作如載入頁面超過這個時間,那麼可以為某些hook或步驟函式定義超時時間,如果不想做全域性設定,可以在為hook定義超時中新增tag過濾。
var {Before, Given} = require('cucumber');
Before({timeout: 60 * 1000}, function() {
// Does some slow browser/filesystem/network actions
});
Given(/^a slow step$/, {timeout: 60 * 1000}, function() {
// Does some slow browser/filesystem/network actions
});
複製程式碼
禁用超時時間
一般情況下不推薦大家使用
在某些特殊場景中可能需要禁用超時時間,就是無限等待執行完成。這可以通過設定 {timeout:-1}
實現。
var {Before, Given} = require('cucumber');
var Promise = require('bluebird');
Given('the operation completes within {n} minutes', {timeout: -1}, function(minutes) {
const milliseconds = (minutes + 1) * 60 * 1000
const message = `operation did not complete within ${minutes} minutes`
return Promise(this.verifyOperationComplete()).timeout(milliseconds, message);
});
複製程式碼
獲取更多資訊,可以關注公眾號,也可以加QQ群:707467292 進行node.js自動化相關技術交流。