使用 NodeJS 測試 Web UI
本篇文章是關於一些用作測試 Web UI 的 NodeJS 工具。 它們包括:
Mocha
Mocha 是一個用於測試的 Javascript 框架。它有一個 BDD 風格的語法(BDD:行為驅動開發),並兼容 Asynchronous call 測試。它也支持不同的斷言庫,在我們的例子中,我們將使用 chai 來斷言。
Chai
Chai 是一個 NodeJS 的 BDD / TDD 斷言庫,適用於瀏覽器與其他不同的 Javascript 測試框架。
CasperJS
CasperJS 是用於構建導航場景的模組。它通常與 PhantomJS 一起使用,但實際上它也支援另一個 headless 瀏覽器 SlimerJS,SlimerJS 使用 Firefox 的渲染引擎 Gecko 。
PhantomJS
PhantomJS 是使用 WebKit 渲染引擎的 headless 瀏覽器,能夠在沒有介面的伺服器執行測試。
檢查 Google 搜尋器是否運作正常
假設我們想測試以下功能:
- 是否可以正常訪問 Google 的搜尋頁面?
- 搜尋功能能否成功返回結果?
對於第一個問題,我們可以簡單地向 Google URL 發出一個 HTTP 請求,看看它是否返回 HTTP 200 狀態碼,這可以通過 CasperJS 輕鬆完成。
第二個問題有點複雜。它可以拆解成以下步驟。
- 等待搜尋表單
- 填寫表格並提交
- 檢查結果集是否包含用作搜尋的關鍵詞
我們來看看代碼。
初始化一個新的 NodeJS 項目
npm init
安裝以下 NodeJS 模塊
npm install casperjs chai mocha phantomjs --save-dev # In addition to the above libraries, we also need the following extensions. npm install casper-chai mocha-casperjs --save-dev
編寫測試碼
建立 test/google-search.js
describe('Google Search', function() { // 在每個測試的腳本之前 before(function() { casper.start('https://www.google.com.hk/'); }); // *** Test 1 *** // 是否可以正常訪問 Google 的搜尋頁面? it('should have return HTTP 200', function() { expect(casper.currentHTTPStatus).to.equal(200); }); // *** Test 2 *** // 搜尋功能能否成功返回結果? it('should be able to search', function() { // 等待搜尋表單 casper.waitForSelector('form[action="/search"]', function() { 'form[action="/search"]'.should.be.inDOM; }); // 填寫表格並提交 casper.then(function() { this.fill('form[action="/search"]', { q: 'Boatswain' }, true); }); // 檢查結果集是否包含用作搜尋的關鍵詞 casper.waitForSelector('h3.r a', function() { 'h3.r a'.should.be.inDOM; expect('h3.r a').to.contain.text(/Boatswain/); }); }); });
添加一個 npm 腳本來執行測試
編輯 package.json 如下。
{ "name": "ui-test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "mocha-casperjs test/google-search.js" // <- Add the test script }, "author": "ykyuen", "license": "ISC", "devDependencies": { "casper-chai": "^0.3.0", "casperjs": "^1.1.4", "chai": "^4.1.2", "mocha": "^4.1.0", "mocha-casperjs": "^0.6.0", "phantomjs": "^2.1.7" } }
執行測試
npm test
測試結束後會顯示一個簡短的測試報告。
試試更改一下測試碼
// Check if the result set contains text "Boatswain" casper.waitForSelector('h3.r a', function() { 'h3.r a'.should.be.inDOM; expect('h3.r a').to.contain.text(/nosuchtext/); // <- edit here });
總結
此示例顯示如何在 NodeJS 中創建簡單的 Web UI 測試,並在命令列介面下執行測試。 它可以用於預備環境的冒煙測試。但請注意,CasperJS 並不適用於單元測試,而是用於 Web UI 測試。 另外,像 Karma 這樣的測試運行者並不支援 CasperJS。 如果你需要的是單元測試的解決方案,你應該排除 CasperJS。
完整的例子可以在此找到。