iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 4
0

Nightwatch.js

Nightwatch 提供了 Command-line Test Runner,用來跑各種類型的測試,例如:指定測試環境、依群組或標籤或個別檔案、循序或平行執行等。其設定檔的預設名稱是 nightwatch.json 或 nightwatch.conf.js,如果兩者都出現,會優先選擇 nightwatch.conf.js,設定檔位置在這個專案的根目錄底下。

設定檔的範例可參考這裡

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

說明

設定檔分為三個部分:基本設定、Selenium Server 相關設定和測試環境相關設定。

  • 基本設定
    • src_folders:測試程式碼的位置
    • output_folder:測試報告的位置
    • custom_commands_path:客製化指令的位置
    • custom_assertions_path:客製化斷言的位置
    • page_objects_path:Page Objects 的位置
    • globals_path:External Globals 的位置
    • live_output:是否即時顯示測試結果
    • test_workers:使用 Test Workers 的數量
    • test_runner:啟用哪一個 Test Runner,使用 nightwatch 或 mocha
  • Selenium Server 相關設定,位於 "selenium": {...}
    • server_path:Selenium Server 的位置,start_process 啟用時才需設定
    • port:Selenium 所佔用的埠號
    • start_process:是否自動管理 Selenium Process
    • start_session:是否自動啟用 Selenium Session
    • log_path:Log 的位置
    • cli_args:要傳入 Selenium Process 的 cli 參數,這裡可分別對各個瀏覽器驅動程式的選項做設定
  • 測試環境相關設定:環境和瀏覽器的相關設定("test_settings": {...},必填 default 環境),例如:分別為預設環境和 staging 環境等代入不同的設定值。
    • launch_url:載入的網址
    • selenium_host:Selenium Server 所用的 hostname / IP
    • selenium_port:Selenium Server 所用的埠號
    • request_timeout_options:對 Selenium Server 發出 HTTP Request 的 timeout 時間與重試次數
    • silent:是否顯示更多 Selenium 指令紀錄
    • output:是否關閉 terminal output
    • disable_colors:是否關閉 terminal output 的顏色顯示
    • screenshots:出錯時是否螢幕截圖
    • username:驗證時需要輸入的 username
    • access_key:驗證時需要輸入的 access_key
    • proxy:proxy
    • desiredCapabilities:新建立 Session 時傳入 Selenium Webdriver 的物件
    • globals:測試環境所代入的物件資料
    • exclude:要忽略的測試資料夾或測試程式
    • filter:載入測試時需要被使用的資料夾或資料檔案
    • log_screenshot_data:Log 中的螢幕截圖是否使用 Base64 圖檔
    • use_xpath:是否使用 Xpath 為預設的定位網頁元素方式
    • cli_args:用來覆寫在 Selenium Server 相關設定中所設定的 Selenium Process 的 cli 參數
    • end_session_on_fail:當測試程式的斷言失敗時自動結束 Session
    • skip_testcases_on_fail:當有 Test Case 錯誤出現時忽略後續的 Test Case
    • output_folder:覆寫基本設定的測試報告的位置
    • persist_globals:是否可覆寫 Test Globals
    • detailed_output:測試報告是否顯示詳細資料

以下特別說明測試環境相關的設定。

指定測試環境

Nightwatch Test Runner 可使用 --env 代入指定的測試環境。例如,在這裡有 default 和 staging 兩種環境,依照不同需求,我們可以分別測試任一環境或同時跑測試於這兩個環境。

// nightwatch.conf.js

{
  ...
  "test_settings": {
    "default": {
      "launch_url": "http://localhost",
      "globals": {
        "firstGlobalVar": "Hello World!",
        "secondGlobalVar": "This is me."
      }
    },
    "staging": {
      "launch_url": "http://staging.host",
      "globals": {
        "firstGlobalVar": "Hi ~"
      }
    }
  }
}

沒有指定環境,就是預設環境 default。

nightwatch

等同於

nightwatch --env default

指定環境 staging,將 --env 代入 staging 即可。

nightwatch --env staging

launch_url 屬性

若不同環境需代入不同的 URL,則可使用 launch_url 分別設定。例如:由於在上例中執行 nightwatch --env staging,所以 browser.launchUrl 會得到 http://staging.host。注意,若沒有指定執行環境,例如執行 nightwatch,則會使用 default 値 http://localhost

module.exports = {
  'Demo test': function (browser) {
    browser
      .url(browser.launchUrl) // "http://staging.host"
      // ...
      .end();
  }
};

Test Globals

Test Globals 是存放一些名-值對(Name-Value Pairs)的地方,用於代入測試程式中使用。與上面的 launch_url 屬性一樣,可根據環境設定不同的 Test Globals。因此,若執行 nightwatch --env staging

module.exports = {
  'Demo test': function (browser) {
    console.log(browser.globals);
  }
};

則 console 所得到的 Test Globals 是

{
  "firstGlobalVar": "Hi ~"
}

備註:每次執行測試程式(Test Suite)時,Test Globals 預設都會建立深拷貝(Deep Copy)的物件,也就是說不會更改初始設定値。所以,如果希望整個測試過程都使用同一個物件,那麼 persist_globals 就要設定為 true,來允許被改變。

範例

在這個範例-Nightwatch101 中,設定檔是 nightwatch.conf.js,其中包含基本設定、Selenium Server 設定和環境設定。我們也將一些 test_settings 的設定提出來放在外部檔案 globals.js 中,例如:Hooks、環境變數、客製化測試報告所用的 plugin 等,好處是設定檔會比較乾淨整齊,這些複雜的判斷運算就包給外部檔案吧。

以上部份在後面談到 Nightwatch Test Runner 時會有更詳細的說明,現在只要先把基本的東西設定好,可以跑測試就好了。


網誌版


上一篇
Nightwatch101 #3:環境建置
下一篇
Nightwatch101 #5:使用 CSS Selector 定位網頁元素
系列文
Nightwatch101:使用 Nightwatch 實現 End-to-End Testing30

尚未有邦友留言

立即登入留言