2011/09/22

Javascript client library 之 TDD

最近因緣際會在寫 web service 的 javascript client library,就趁著這個機會試試看 TDD (Test-Driven Development) 的方式來開發看看。

這次撰寫的 client library 因為是 javascript,所以就利用了 Javascript 常見的 event driven 的呼叫方式。原本打算用 jsunit 作為 unit test 的框架,但因為沒看到可以測試 callback 的 method,最後改用了 jquery 所使用的 qunit

qunit 在測試 callback 的方式大略如下:


test(
  'Login success test',

  function() {
    expect(1);
    stop();

    var service = new WebService();
    service.login(
      {
        username: 'user1@example.com',
        password: 'password'
      },
      function(res) {
        equal(res.response.status, "OK", 'expected login success');
        start();
      }
    );
  }
);
qunit 可以利用 stop() 停止整個 unit test 的進行,等到呼叫 start() 的時候再繼續執行。在這個測試中,qunit 會在 stop() 之後開始等待,等到呼叫到 callback method 裡面的 start() 之後才會繼續執行,這個時候就可以擷取到 equal() 所測試的結果。另外 expect() 可以指定預期會跑到的 assert 總共有幾個,在這個例子裡面只跑了一次 equal(),所以是 expect(1)。 當所有 test case 完成後,跑 qunit 的結果大略如下:


因為根本就還沒開始寫 client library,當然所有測試結果都是 failed。但在這個時候就已經得知 javascript client library 要如何使用以及有哪些回傳值了。這樣其實可以在早期的時候就可以看到整個 client library 的面貌。

而且看著 test case 一個一個的通過心中真是有莫名的快感阿。寫完之後就變成這樣:



使用 TDD 方法開發確實讓整個開發的過程踏實不少。不過這種開發方式還是比較適合實作函式庫,如果撰寫 UI 的話就沒有那麼適合了。

不過大家還是可以玩一下,蠻有收穫的 :)

2011/09/10

Jenkins 系列 (1): 在終端機下設定 Android 模擬器

命題的有點怪,不過基本上這是篇為了在 Jenkins 進行 unit test 以及 daily build 的前置動作。當在建立 Continuous Integration 的測試系統時,我希望可以在一台獨立的機器進行測試。而在遠端的伺服器不一定有 X Window 的狀況,這個時候就會需要在終端機上設定 Android Eumlator 環境。

首先是下載並且解壓縮 Android SDK

$ wget http://dl.google.com/android/android-sdk_r12-linux_x86.tgz
$ tar zxvf android-sdk_r12-linux_x86.tgz

切換到 android-sdk-linux_x86/tools,並且用 --no-ui 選項來安裝 Android 3.2/2.3 或其他平台相關的 Platform SDK


$ cd android-sdk-linux_x86/tool
$ ./android update sdk --no-ui

這個時候會從最新的平台(如 Android 3.2)開始下載安裝,一路從最新的下載到最舊的 SDK。我是在下載完 Android 2.2 的 Platform SDK 就按 Ctrl + C 終止安裝。

編輯家目錄的 ~/.bash_profile,加入執行路徑:

PATH="$PATH:~/android-sdk-linux_x86/tools:~/android-sdk-linux_x86/platform-tools

安裝完 platform SDK 之後,可以利用下面的指令看到安裝了哪些 platform SDK:

$ android list target

輸出大略如下:

id: 4 or "android-8"
     Name: Android 2.2
     Type: Platform
     API level: 8
     Revision: 3
     Skins: QVGA, WVGA854, WQVGA432, HVGA, WVGA800 (default), WQVGA400
id: 5 or "android-9"
     Name: Android 2.3.1
     Type: Platform
     API level: 9
     Revision: 2
     Skins: QVGA, WVGA854, WQVGA432, HVGA, WVGA800 (default), WQVGA400
id: 6 or "android-10"
     Name: Android 2.3.3
     Type: Platform
     API level: 10
     Revision: 2
     Skins: QVGA, WVGA854, WQVGA432, HVGA, WVGA800 (default), WQVGA400


用下面的指令就可以建立新的 Android 2.3.3 模擬器環境

$ android create avd --name android-2.3 --target android-10

這個時候就可以用不跑模擬器畫面的方式啟動 Android 模擬環境:

$ emulator-arm -avd android-2.3 -no-window
想知道運行狀況,可以利用 adb logcat 瞭解。