寫點測試

TDD Practice

<blockquote cite="https://vinta.ws/blog/695"> 信奉 Test-Driven Development 的工程師鄙視先寫 code 再補 tests 的工程師,先寫 code 再補 tests 的工程師鄙視不寫 tests 的工程師,不寫 tests 的工程師鄙視又他媽亂改需求的 PM。 </blockquote>

測試的理由,是確保程式碼照著一定的規範走。而規範,就是俗稱的 spec:程式要有什麼功能,就得從需求演化為規範,再從規範變成測試用例。

通常,我們會先寫程式,再測試之。但也有人想到:何不先寫規範與測試程式,再想辦法把程式寫進去?<br /> 而這個想法,就變成了 Test-Driven Development

  1. 首先,我先寫一個測試程式,測試程式會寫好規範,以完成需求。當然,也要能呼叫要主程式。
  2. 運行這個測試程式。由於主程式並不存在,結果當然失敗。
  3. 試著撰寫主程式,想辦法讓測試程式通過。
  4. 當你寫到最後,發現測試程式全部完成,你就成功了。

前端測試比較麻煩的是:瀏覽器是個圖形介面,所以很多前端的問題,其實程式測不了......不過看完 Ruby on Rails 的測試寫法,我想依舊可以寫些最簡單的測試。

那就開始吧。

準備

如果需要寫測試,你需要一個測試框架,還有一個斷言函式庫。我這裡用的是 Mocha + Assert

開始

describe('Novel', function()
{
    describe('Add', function()
    {
        it('Should add chapter at last chapter when adding', function()
        {
            let novel = new Novel([1,2,3,4,5,6,7,8,9,10]);
            assert.deepEqual( [1,2,3,4,5,6,7,8,9,10,11] , novel.add() );
        });
    });
});

這是最簡單的測試了。我們需要 Novel 程式,裡面有個 Add 方法,接著寫了需要的功能,還有相對應的測試程式。寫好了,就去跑 npm test 測試程式。

於是:

function Novel( current_chapter )
{   // Code
    this.add = () =>
    {
        let tmp_ary = current_chapter.sort( (x,y) => x - y );
        let new_array = Array.from(tmp_ary);
        let tmp_num = tmp_ary[ tmp_ary.length - 1 ] + 1;
        
        new_array.push( tmp_num );
        return new_array;
    }
}

我寫了程式,接著又用 npm test 跑測試。

感想嗎?<br /> 我很累。沒想到這麼累。

參考資料