單元測試簡介以及在 Docker 上部署 Drone 並連結至 GitHub

Unit Test

開發專案時,我們常需要確保其中的功能或函式能夠達到我們預期的效果而進行測試,
但是遇到大型專案時我們通常無法手動進行它們的測試,
於是就有了「單元測試」(Unit Test)這個東西的誕生。

單元測試是什麼?

當我們寫好每個功能或函式時,我們會需要幫他寫一個單元測試的程式。
你可以上 GitHub 看看,很多大型專案可能都有 /test 這個資料夾,
點進去之後一般來說裡面都是單元測試的程式。

舉例來說 ...

今天有一段 Node.js code 長這樣:

function testMe () {  
    if (no_problem)
        return true;

    return false;
}

module.exports = testMe;  

我將這段 code 存在 /path/to/project/lib/index.js 裡頭。

我的目標是:當程式執行起來沒問題(即 no_problem === true 時),
這個函式執行起來就不會有問題,不然這個函式就沒辦法通過測試。

那麼它的單元測試可能是這樣寫:

var should     = require('should'),  
    codeToTest = require('../lib/index.js');

describe('Test function "testMe"', function () {  
    it('should return true', function () {
        codeToTest().should.equal(true);
    });
});

然後將這段 code 存在 /path/to/project/test/testMe.js 裡頭。

這樣當程式撰寫完畢之後,執行 mocha 就能進行測試並返回結果了!

請記住:為你的專案寫單元測試是一個良好的習慣,且每個工程師都應該要有這種心態。

架設 Drone

我們寫完專案、還有它們的單元測試後,
就會把它們通通 push 到 GitHub 上(這裡假設你使用 GitHub)。

但是我們一般不會手動去進行測試,
而通常都是一些平台會去在我們 push 之後幫我們自動做測試,
就例如很有名的持續性測試平台 Travis CI

而今天我們要來架設自己的持續性測試平台 Drone

Drone 的功能與 Travis CI 差不多一樣,只是 Drone 的界面十分簡潔美觀,而且測試速度也快上 Travis CI 不少。

首先,我這邊先假設你會使用 Docker、有了一些基礎知識以及已經安裝好了 Docker daemon。

連線到 GitHub

為了把 Drone 與 GitHub 整合,
我們需要先在 GitHub 設定一個 OAuth 應用程式。

首先,打開 https://github.com/settings/developers
然後按下「Register a new application」。

接下來會進入到這個頁面。
請你在四個欄位內分別填上:

  • 你的應用程式名稱,這裡可以填寫「Drone」。
  • 你的 Drone 網址。雖然還沒進行架設,但是你應該也已經打算好把 Drone 放到哪邊了。這裡我打算放到 https://drone.birkhoff.me
  • 你的應用程式描述。
  • 你的應用程式 callback 網址。這裡請填寫「<你的 Drone 網址>/authorize」,例如我的就是「https://drone.birkhoff.me/authorize」。(圖片內寫錯了)

接下來,按下「Register application」進行應用程式的建立。

建立完之後會來到這個畫面,

請把你的「Client ID」與「Client Secret」記下來,
稍後在設定 Drone 時會使用到。

部署 Drone

請執行下面這段指令,以進行 Drone 的部署。

其中,請將「<CLIENT_ID>」變更為你先前記下的 Client ID,「<CLIENT_SECRET>」亦同。

$ docker run \
    --name=drone \
    -itd \
    -p 80:8000
    -v /var/lib/drone:/var/lib/drone \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -e "REMOTE_DRIVER=github" \
    -e "REMOTE_CONFIG=https://github.com?client_id=<CLIENT_ID>&client_secret=<CLIENT_SECRET>" \
    -e "DATABASE_DRIVER=sqlite3" \
    -e "DATABASE_CONFIG=/var/lib/drone/drone.sqlite" \
    drone/drone:0.4.2

記住:永遠不要在不需要的情況下把你的 sudo 權限給 docker 使用,並且請另外開一個使用者給 Docker daemon。

接下來,請打開你的 Drone 網址,你應該會看到這個畫面:

這就代表你設定完成了!請點擊「LOGIN」按鈕繼續。

授權 GitHub

接下來可能會彈出類似的畫面,請點擊「Authorize Application」繼續。

接下來請輸入你的 GitHub 密碼以進行授權,
如果你忘記了你的密碼,你可以在這邊找它:https://www.google.com

啟用專案

接下來就部署完畢了!你會跳到這個畫面:

請你點擊「AVAILABLE REPOSITORIES」,並選擇你想要測試的專案。
這些專案都是你在 GitHub 上的專案,無論 public/private 都可以進行自動測試。

接下來會到這個畫面,請點擊「ACTIVATE NOW」。

然後稍等幾秒鐘,就會啟用完成並跳到這個畫面囉!
因為你還沒進行測試,所以這裡會顯示「You have no builds」。

設定專案

Drone 是依靠一個叫做 .drone.yml 的設定檔案進行自動測試的設定的。這個檔案內容依循 YAML 格式並以 2 個空白進行縮進。

我這次測試的是 BirkhoffLee/AnonyPages,它是一個 CoffeeScript 專案,以下是我 .drone.yml 的內容:

build:  
  image: shouldbee/coffeescript
  commands:
    - npm install
    - coffee --compile -o lib/ src/
    - cp lib/config.sample.js lib/config.js
    - npm test

接下來,請將這個檔案 commit 並 push 到 GitHub 上,
Drone 就會自動開始進行測試了!

$ git add .drone.yml
$ git commit -m "Added .drone.yml"
$ git push

待 push 完成之後,你會看到 Drone 頁面上多出了一個 Build Task,它可能長這樣:

點進去看,過沒多久就完成了,比同時 Travis CI 自動開始的 task 的測試速度快了不少(相同的設定,我兩個 Drone 的 build task 跑完之後 Travis CI 那邊一個都還沒跑完)。

這邊因為我的 .drone.yml 設定有點問題,修正兩次之後重新 push 才成功,所以已經不是這個截圖中的 task 了 XD

往下翻:

小結

Drone 的測試速度真的是快到令小弟吃驚,而且它的介面真的是十分地美觀,不妨使用看看。