qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          使用EUnit進行單元測試

          為了寫一個好的產品,必定離不開完善的測試。
            最近開始籌劃項目,因此單元測試必不可少,一定要在開始的時候把測試做好,從下到上才能讓產品更加堅固。
            我們選擇使用EUnit進行單元測試。使用Eunit的好處:減少代碼的修改;提高開發速度;有利于接口與實現分離;有利于系統集成;還有測試本身可以作為一種文檔。
            1,首次從http://support.process-one.net/doc/display/CONTRIBS/EUnit 獲取對應的SVN checkout路徑,http://svn.process-one.net/contribs/trunk/eunit,通過svn進行下載。
            2,將整個eunit目錄放到你的erlang安裝目錄下的lib目錄中。也可以使用通過code:add_path/1或者其他編譯選項指明eunit的路徑,但是不是很方便。
            3,在你的module中添加: -include_lib("eunit/include/eunit.hrl"). 這樣就引入了eunit的頭文件,此時你的module具有了下面的特性:自動的將以"_test"結尾的函數作為測試函數;為你的module添加并導出了test/0函數;為你提供了豐富的test macro。(自動導出test函數,是通過compile指示符的parse_transform選項進行處理)
            此時,我們的module已經具有了eunit賦予的一切權利。注意你從svn下載的代碼,沒有進行編譯,你需要進行編譯生成beam文件。由于本人是在windows下工作,編譯不是很方便,所以我就直接從這里下載了eunit的beam文件,放到eunit/ebin/目錄下。
            在我們要測試的module中我們加入一個函數:
            basic_test() ->
            assert(1 == 1).
            好了,編譯module,隨后運行M:test(),進行單元測試,我們會看到
            Test successful.
            的提示。測試ok。
            這里bsic_test/0會在執行test/0的時候調用,我們也可以把basic_test/0寫成另一種形式:
            basic_test_() ->
            fun() ->  assert(1 == 1) end.
            以"_test_"結尾的函數,在EUnit中稱為“test generation function",測試生成函數,
            它返回一個或一個函數list,EUnit會依次執行每個函數。為了讓代碼更緊湊簡潔,
            我們又有了另一個macro:_test,這樣上面的test可以變成這樣:
          basic_test_() ->
          _test( assert(1 == 1)).
            是不是代碼少一些了?好的讓我們再進一步,我們使用另一個macro:_assert:
          basic_test_() ->
          _assert(1 == 1).
            怎么樣,很簡單了吧,好的,比如我有一系列的內容要測試,我就可以簡單的寫成這樣:
          basic_test_() ->
          [ _assert(1 == 1),
          _assert(2 == 2),
          _assertEqual(3, 3),
          _assertMatch(4,  4),
          _assertException(throw, a, throw(a))].


          我們非常容易的就測試了某個表達式是否為true,某兩個值是否相等assertEqual
            (注:這里使用=:=進行判斷,因此assertEqual(3, 3.0)不會測試通過),
            某個表達式是否匹配,是否產生指定的異常等。
            好了,暫時就這些基本的東西,更多的內容查看EUnit的幫助:
            http://svn.process-one.net/contribs/trunk/eunit/doc/overview-summary.html
            Update:
            R12B-5中,eunit作為一個標準的lib被加入,eunit中提供了一些有用的Macro,如:
            LET(Var,Arg,Expr)
            等效于 (fun(Var) -> (Expr) end)(Arg)
            用法: L =  LET(L1, [1, 2, 3], lists:reverse(L1))
            IF(Cond,TrueCase,FalseCase)
            用法: G =  IF(A >= B, A, B)
            形如_test()的函數,作為一個test 單元
            形如_test_()的函數作為test generator,其用來產生test單元,其結尾表達式可以為:
            單個形如 _xxx的測試,表示一個test單元
            也可以為一個List(可以為Deep List),List進行flatten后,長度表示test單元數目如下面代碼表示五個測試單元:
          basic_test() ->
          assert([1, 2] = lists:reverse([2, 1]).
          basic_test_() ->
          [ _assert(true),
          _assertNot(false),
          [  _assert(1 == 1.0),
          _assert(true)
          ]
          ].

          posted on 2014-01-30 11:47 順其自然EVO 閱讀(338) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年1月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 溧阳市| 合水县| 江西省| 前郭尔| 陇西县| 孟州市| 若羌县| 临城县| 平舆县| 银川市| 宁乡县| 白银市| 靖安县| 旺苍县| 南郑县| 前郭尔| 屏东县| 麻阳| 缙云县| 望江县| 新沂市| 阳高县| 方山县| 文水县| 简阳市| 绥芬河市| 莆田市| 临洮县| 郴州市| 大宁县| 石河子市| 凯里市| 甘南县| 温泉县| 清远市| 灯塔市| 龙南县| 德保县| 囊谦县| 右玉县| 牙克石市|