2013-08-03 115 views
9

我是Erlang的新手。它有2個測試框架:EUnit和通用測試。我很困惑什麼時候使用另一個。有人可以向我解釋EUnit與普通測試相比有什麼優勢,反之亦然。看起來普通測試可以完成EUnit可以做的一切以及更多,不知道我應該使用EUnit。謝謝!EUnit與普通測試

回答

5

Eunit非常簡單,適合在白盒級進行模塊測試或庫測試。它被整合到螺紋鋼中。

通用測試更多地面向黑盒測試和應用程序以及應用程序測試系統。它非常容易帶有測試覆蓋率。

編輯(後安迪評論):

這是正確的,你可以使用通用測試單一白盒測試,以及它是正確的,你可以利用eunit使用固定裝置的一些應用測試。

然而,eUnit對於簡單的單一測試非常方便:您可以編寫函數myFun,在測試模塊中添加測試函數myFun_test或測試生成器myFun_test_(用於測試很多模式,甚至是一些測試中的失敗)就是這樣。你可以隨心所欲地運行它(沒有測試歷史)。

通用測試要求您列出全部函數或組中的每個測試用例。據我所知,它沒有測試生成器,因此不容易通過每個函數的所有測試模式。這就是爲什麼我認爲它不適應單一的白盒測試。另一方面,當init_per_testcase,init_per_group ...需要一些應用程序上下文運行時,它比eunit fixtures更靈活地組織測試。通用測試還會保留在日誌目錄中完成的所有測試的歷史記錄,這很好,但我建議限制運行次數以保持其有用性。

編輯:

爲了避免不導出函數的問題,對於eunit和通用試驗,其能夠使用定義。例如在rebar.config(因爲我使用的eunit測試單獨的文件):

{eunit_compile_opts, [{d,'EUNIT_TEST',true}]}. 
{erl_opts, [debug_info, warn_export_all]}. 

,並在一個模塊中,如果有必要:

%% export all functions when used in eunit context 
-ifdef(EUNIT_TEST). 
-compile(export_all). 
-endif. 

您可以驗證它只能修改編譯對於eunit

D:\git\helper>rebar clean eunit compile 
==> helper (clean) 
==> helper (eunit) 
Compiled test/help_list_tests.erl 
Compiled test/help_ets_tests.erl 
Compiled test/help_num_tests.erl 
Compiled src/help_ets.erl 
Compiled src/help_list.erl 
Compiled src/helper.erl 
src/help_num.erl:6: Warning: export_all flag enabled - all functions will be exported 
Compiled src/help_num.erl 
Compiled src/help_code.erl 
    All 31 tests passed. 
Cover analysis: d:/git/helper/.eunit/index.html 
==> helper (compile) 
Compiled src/help_ets.erl 
Compiled src/help_list.erl 
Compiled src/helper.erl 
Compiled src/help_num.erl 
Compiled src/help_code.erl 
+0

謝謝帕斯卡。我和一些Erlang工程師交談過,我得到的唯一原因是common_test無法測試未導出的函數。 – user342673

+0

這是不正確的,你在源模塊中嵌入測試,以便你可以測試任何你想要的。 –

+0

我按照Andy的評論編輯了我的回答。我不知道如何使用通用測試,我在test_SUITE.erl模塊中編寫測試用例 – Pascal

10

Learn you some erlang(Erlang的最好的在線資源之一,除了官方的文檔)的代碼說明這兩種方法非常好:

正如帕斯卡指出,EUnit最好是在白盒測試中使用的,更喜歡內部功能由功能單元測試,光集成測試。

Common Test做的比較繁重:集成&系統測試,黑盒子的東西。當然,它也更復雜,功能更強大。

當你在它的時候,你可能會嘗試使用Erlang/OTP中的另一個集成測試工具Dialyzer,它非常適合查找死亡或無法訪問的代碼,邏輯&類型錯誤(它是一個靜態類型分析器)。再次,瞭解你一些erlang提供了一個很好的介紹:Dialyzer。噢,順便說一下,如果您選擇將EUnit測試放在不同的文件中(這是完全可能的),那麼您將無法測試未導出的函數(這是預期的)。還有一個預期是Common Test不測試未導出的函數:否則它不會是一個黑盒測試工具(可能是一個作弊的測試工具)。

+1

您可以在測試上下文中導出所有函數,但是在黑盒測試中進行區分甚至更重要(不允許export_all )和白盒測試(做你想做的)。請參閱編輯。 – Pascal

+0

我確認該網站了解一些erlang是erlang的最佳選擇之一。 – Pascal

0

http://www.erlang.org/doc/apps/common_test/basics_chapter.html

常用的測試也是白盒測試二郎山代碼的一個非常有用的工具(例如,模塊測試),因爲測試程序可以調用直接出口二郎功能並有實現需要非常小的開銷基本測試套件和執行簡單測試。對於黑盒測試Erlang軟件,例如可以使用Erlang RPC以及標準的O接口。