web自動化系列教程- 04 Hooks與TimeOut介紹

趙陽陽發表於2018-05-30

系列內容

備註:配合免費視訊教程,獲取更佳的學習效果!課程連結: 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自動化相關技術交流。

web自動化系列教程- 04 Hooks與TimeOut介紹

相關文章