星期三, 8月 09, 2017

星期三, 8月 02, 2017

Node.js + Selenium + Headless Browser

接續這篇的話題,既然準備好了 System Under Test SUT,那就來自動化測試吧!這次為了遷就 Linux 可能沒有 UI,先把環境需求降到最低:
  • Linux
  • Docker (Optional)
  • Node.js
  • Internet Access
別忘了 Node.js 支援跨平台,Linux 也只代表作業系統,不是非君不嫁。正好上一篇的結果可以拿來加工再利用,要補三個東西:
  • 基於 Node.js 的測試程式-checkHello.js
  • 瀏覽器
  • selenium-webdriver (for Node.js)
checkHello.js 也是愈簡單愈好,第一版只有這樣:

const assert = require('assert');
var webdriver = require('selenium-webdriver'),
    By = webdriver.By;
var driver = new webdriver.Builder()
    .forBrowser('phantomjs')
    .build();
driver.get('http://172.17.0.2:8080');
var byH1 = By.css('h1');
var h1 = driver.findElement(byH1);
var h1Text = h1.getText();
var h1Handler = function (text) {
    assert.equal(text, "Hello World!");
}
h1Text.then(h1Handler);
driver.quit();

應該很好猜在測什麼?就是比對 <h1>Hello World!</h1> 而已。瀏覽器也先挑簡單的 PhantomJS,一是不需依賴圖形介面,一是大部份瀏覽器還要再搭配驅動程式,比較麻煩。安裝指令其實源出於,改編如下:
  • docker exec -it myNode sh
  • curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar -xj --strip-components=2 -C /usr/local/bin phantomjs-2.1.1-linux-x86_64/bin
  • exit
其中 PhantomJS 下載目錄來自這裡,/usr/local/bin 是環境變數 PATH 所指向的路徑之一。本段前後這些提到指令的部份,都是針對上一篇名為 myNode 的 docker container,如果不是,例如只在本機,可以忽略灰底的部份。至於 selenium-webdriver 安裝,指令是:
  • docker exec -it myNode npm install selenium-webdriver
萬事俱備,執行測試的指令是:
  • docker exec -it myNode node checkHello.js
順利的話,會讓人誤以為沒反應?可以故意弄錯一些東西來驗證,例如換個 IP,換個 port,關掉 Web Server,Hello World! 改個大小寫什麼的。

星期二, 8月 01, 2017

Simplest Node.js Web Server (in Docker or not)

這篇實在是一年多前就不該偷懶好好寫的(與這篇有關),在參考了這篇這篇之後,覺得以下的內容還算能用:

var http = require('http');
var port = 8080;
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end('<html><head></head><body><h1>Hello World!</h1></body></html>');
}).listen(port);
console.log('Server running at http://localhost:' + port);

要能執行的前提僅需安裝 Node.js,因為 http 是內建的,也不需要再補 npm install http。假設存檔名為 helloServer.js,執行時只要切到該目錄,在命令列下 node helloServer.js,之後就可用瀏覽器訪問 http://localhost:8080 看到這個超陽春網頁。

想更乾淨一點,不要直接在本機安裝 Node.js?用 Docker 再適合不過了,而且官方支援就提到如何直接執行單一程式,我稍做修改的命令與簡略說明:
  • docker run -it --rm --name myNode -v "$PWD":/usr/src/app -w /usr/src/app node:latest node helloServer.js
  • 命名為 myNode,可以修改。
  • /usr/src/app 是 container 裡面的目錄,對應外面的現行目錄,也是裡面的工作目錄。
  • image 名稱 node:latest,因為這個簡單範例不挑版本。
  • 最後的 node helloServer.js 就是下到 container 裡面去執行的命令。
但這次瀏覽器看不到網頁了?別急,先另開一個 Terminal 下指令查 container 用哪個 IP:
  • docker inspect myNode | grep IPAddress
瀏覽器在 docker 外面,所以 localhost 要換成這樣查來的 IP 才會通。


Jenkins current users

如何能得知 Jenkins 目前有哪些使用者登入?只要安裝了 Monitoring Plugin,管理者就可以在 Manage Jenkins -> Monitoring of Jenkins master -> System information -> View http sessions 看到多個 session id,點進去就有 Username 了。