Nightwatch101 #14:Asynchronous Test Hooks

Nightwatch.js

所有的鉤子(Test Hooks)-before[Each] 與 after[Each] method 都可以執行非同步(asynchronous)的動作。如果要執行非同步的動作,就要傳入 callback 作為第二個參數,並在最後執行這個 callback。若不呼叫這個 callback 會導致逾時錯誤(timout error)。

如果忘記 Test Hooks 是什麼,可以點此複習。簡單來說,就是在跑測試前後,可能會需要做一些環境設定等前置作業、登入或登出等重覆性的工作,這些東西就寫在鉤子裡面。

♡(´∀`)人(´∀`)♡

本系列文章皆使用這個專案,可以拉下來玩玩;有什麼問題都可以提出 issue


範例如下, beforeEach / afterEach method 分別在 0.1 / 0.2 秒後執行 done 這個 callback。

範例程式碼。

module.exports = {
  beforeEach : function(browser, done) {
    console.log('Before each test case...');

    setTimeout(function() {
      done(); // 0.1 秒後執行 done 這個 callback
    }, 100);
  },
  afterEach : function(browser, done) {
    console.log('After each test case...');

    setTimeout(function() {
      done(); // 0.2 秒後執行 done 這個 callback
    }, 200);
  }
}

看完整範例

執行以下指令。

nightwatch test/e2e/class/testMainCategoryAsyncHooks.js

執行結果。

Asynchronous before[Each] and after[Each]

設定逾時錯誤的等待時間

預設會產生逾時錯誤(Timeout Error)的時間是 10 秒(單元測試則是 2 秒)。若需要修改這個等待時間,則可到 nightwatch.conf.jstest_settings 之 globals 設定 asyncHookTimeout 這個屬性(ms,千分之一秒)。

設定檔 nightwatch.conf.jsasyncHookTimeout: 10000 表示逾時的等待時間設為 10 秒(即 10000 ms)。

"test_settings" : {
  "default" : {
    "launch_url": "http://localhost",
    "globals": {
      "asyncHookTimeout": 10000
    }
  }
}

範例可參考這裡

客製化報錯

在 callback 中傳入 error 參數來丟出錯誤訊息,即可明確指出測試失敗的問題。

範例程式碼。

module.exports = {
  before: function(browser) {
    console.log('Setting up...');
  },
  after: function(browser) {
    console.log('Closing down...');
  },
  beforeEach: function(browser, done) {
    console.log('Before each test case...');

    setTimeout(function() {
      done(new Error('這是客製化報錯喔!'));
    }, 100);
  },
  afterEach: function(browser, done) {
    console.log('After each test case...');

    setTimeout(function() {
      done(new Error('這是客製化報錯喔!'));
    }, 200);
  },
  'Assert Ruten MainCategory Title 0008': browser => {
    // 省略...
  },
  'Assert Ruten MainCategory Title 0011': browser => {
    // 省略...
  }
}

看完整範例

執行以下指令。

nightwatch test/e2e/class/testMainCategoryAsyncHooks.js

執行結果。

明確地指出測試失敗的問題

下一篇來看 External Globals。


2018 鐵人賽網址


comments powered by Disqus