国产一区二区精品久久_蜜桃狠狠狠狠狠狠狠狠狠_午夜视频精品_激情都市一区二区

當(dāng)前位置:首頁 > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計軟件教程 > 使用EUnit進行單元測試

使用EUnit進行單元測試
2010-01-13 23:17:42  作者:  來源:
為了寫一個好的產(chǎn)品,必定離不開完善的測試。

最近開始籌劃項目,因此單元測試必不可少,一定要在開始的時候把測試做好,從下到上才能讓產(chǎn)品更加堅固。

我們選擇使用EUnit進行單元測試。使用Eunit的好處:減少代碼的修改;提高開發(fā)速度;有利于接口與實現(xiàn)分離;有利于系統(tǒng)集成;還有測試本身可以作為一種文檔。

1,首次從http://support.process-one.net/doc/display/CONTRIBS/EUnit 獲取對應(yīng)的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"結(jié)尾的函數(shù)作為測試函數(shù);為你的module添加并導(dǎo)出了test/0函數(shù);為你提供了豐富的test macro。(自動導(dǎo)出test函數(shù),是通過compile指示符的parse_transform選項進行處理)

此時,我們的module已經(jīng)具有了eunit賦予的一切權(quán)利。注意你從svn下載的代碼,沒有進行編譯,你需要進行編譯生成beam文件。由于本人是在windows下工作,編譯不是很方便,所以我就直接從這里下載了eunit的beam文件,放到eunit/ebin/目錄下。

在我們要測試的module中我們加入一個函數(shù):
Erlang代碼 復(fù)制代碼
  1. basic_test() ->   
  2.      ?assert(1 == 1).  


好了,編譯module,隨后運行M:test(),進行單元測試,我們會看到
Test successful.
的提示。測試ok。

這里bsic_test/0會在執(zhí)行test/0的時候調(diào)用,我們也可以把basic_test/0寫成另一種形式:
Erlang代碼 復(fù)制代碼
  1. basic_test_() ->   
  2.     fun() -> ?assert(1 == 1) end.  


以"_test_"結(jié)尾的函數(shù),在EUnit中稱為“test generation function",測試生成函數(shù),
它返回一個或一個函數(shù)list,EUnit會依次執(zhí)行每個函數(shù)。為了讓代碼更緊湊簡潔,
我們又有了另一個macro:_test,這樣上面的test可以變成這樣:

Erlang代碼 復(fù)制代碼
  1. basic_test_() ->   
  2.     ?_test(?assert(1 == 1)).  


是不是代碼少一些了?好的讓我們再進一步,我們使用另一個macro:_assert:
Erlang代碼 復(fù)制代碼
  1. basic_test_() ->   
  2.     ?_assert(1 == 1).  


怎么樣,很簡單了吧,好的,比如我有一系列的內(nèi)容要測試,我就可以簡單的寫成這樣:
Erlang代碼 復(fù)制代碼
  1. basic_test_() ->   
  2.     [?_assert(1 == 1),   
  3.      ?_assert(2 == 2),   
  4.      ?_assertEqual(33),   
  5.      ?_assertMatch(4,  4),   
  6.      ?_assertException(throw, a, throw(a))].  


我們非常容易的就測試了某個表達(dá)式是否為true,某兩個值是否相等assertEqual
(注:這里使用=:=進行判斷,因此assertEqual(3, 3.0)不會測試通過),
某個表達(dá)式是否匹配,是否產(chǎn)生指定的異常等。
好了,暫時就這些基本的東西,更多的內(nèi)容查看EUnit的幫助:
http://svn.process-one.net/contribs/trunk/eunit/doc/overview-summary.html

Update:
R12B-5中,eunit作為一個標(biāo)準(zhǔn)的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()的函數(shù),作為一個test 單元
形如_test_()的函數(shù)作為test generator,其用來產(chǎn)生test單元,其結(jié)尾表達(dá)式可以為:
單個形如?_xxx的測試,表示一個test單元
也可以為一個List(可以為Deep List),List進行flatten后,長度表示test單元數(shù)目如下面代碼表示五個測試單元:

Erlang代碼 復(fù)制代碼
  1. basic_test() ->   
  2.     ?assert([12] = lists:reverse([21]).   
  3.   
  4. basic_test_() ->   
  5.     [?_assert(true),   
  6.      ?_assertNot(false),   
  7.      [ ?_assert(1 == 1.0),   
  8.        ?_assert(true)   
  9.      ]   
  10.     ].  

安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢