2013-04-25 22 views
1

我想編寫測試,其中安裝和清理功能不會針對每個單獨的測試執行,而是會在測試開始和測試結束時執行一次。Erlang - Eunit設置功能不運行

所以我想是這樣的:

generator_test_() -> 
{setup, fun setup/0, fun cleanup/1, 
    {inorder, 
     [ 
      some_test1() 
      %... 
     ] 
    } 
}. 

哪裏some_test1/0

some_test1() -> 
    begin 
     Value1 = something1(), 
     Value2 = something2(), 
     [?_assertEqual(Value1, Value2)] 
    end. 

安裝不執行這種方式。

但這種方式:

some_test1() -> 
    ?_test(begin 
     Value1 = something1(), 
     Value2 = something2(), 
     [?_assertEqual(Value1, Value2)] 
    end). 

some_test1() -> 
    [?_assertEqual(something1(), something2())]. 

這一切都很好。

我不明白它爲什麼可行,我的問題是我不能在?_test(....)中寫入多個斷言。

some_test1() -> 
    ?_test(begin 
     Value1 = something1(), 
     Value2 = something2(), 
     [?_assertEqual(Value1, Value2), 
     ?_assertEqual(Value1, Value2)] 
    end). 

通過運行eunit:test(my_module, [verbose]).我看到只有1個測試通過了。

UPDATE

例1

一個小例子:

-module(example). 

-include_lib("eunit/include/eunit.hrl"). 

generator_test_() -> 
    {setup, fun setup/0, fun cleanup/1, 
     {inorder, 
      fun() -> some_test1() end 
     } 
    }. 

some_test1() -> 
    begin 
     X = 3, 
     Y = 4, 
     %%% This is a test set/deep list as it 
     %%% contains two tests. 
     [?_assertEqual(X, Y), 
     ?_assertEqual(ok, ok)] 
    end. 

setup() -> 
    erlang:display("---SETUP CALLED---"), 
    "setup". 

cleanup(_) -> 
    ok. 

運行eunit:

eunit:test(example, [verbose]). 
======================== EUnit ======================== 
"---SETUP CALLED---" 
module 'example' 
    example: generator_test_...ok 
    [done in 0.004 s] 
======================================================= 
    Test passed. 
ok 

小修改:

some_test1() -> 
    begin 
     X = 3, 
     Y = 4, 
     %%% This is a test set/deep list as it 
     %%% containst two tests. 
     [?_assertEqual(X, Y), 
     ?_assertEqual(it_doesnt_work, ok)] 
    end. 

而且測試仍然通過。

例2

然而

some_test1() -> 
    begin 
     X = 3, 
     Y = 4, 
     %%% These are just two simple tests 
     ?assertEqual(X, Y), 
     ?assertEqual(it_doesnt_work, ok) 
    end. 

失敗

eunit:test(example, [verbose]). 
======================== EUnit ======================== 
"---SETUP CALLED---" 
module 'example' 
    example: generator_test_...*failed* 
in function example:'-some_test1/0-fun-0-'/1 (example.erl, line 17) 
in call from example:some_test1/0 (example.erl, line 17) 
**error:{assertEqual_failed,[{module,example}, 
        {line,17}, 
        {expression,"Y"}, 
        {expected,3}, 
        {value,4}]} 


    [done in 0.003 s] 
======================================================= 
    Failed: 1. Skipped: 0. Passed: 0. 
error 

BUT

示例3

generator_test_() -> 
    {setup, fun setup/0, fun cleanup/1, 
     {inorder, 
      some_test1() 
     } 
    }. 

some_test1() -> 
    [?_assertEqual(3, 3), 
    ?_assertEqual(ok, ok)]. 

eunit:test(example, [verbose]). 
======================== EUnit ======================== 
"---SETUP CALLED---" 
module 'example' 
    example:13: some_test1...ok 
    example:14: some_test1...ok 
    [done in 0.005 s] 
======================================================= 
    All 2 tests passed. 
ok 

現在我看到有2(!)測試。

我可能只是忘記了塊語句,並寫出沒有變量的測試,但我認爲這可能是可怕的閱讀,它應該與塊。

回答

3

documentation的說:

一個簡單的測試對象是下列之一:

甲無參函數值(即,一個樂趣取零個參數)。實例:

fun() -> ... end 
    fun some_function/0 
    fun some_module:some_function/0 

A tuple {test, ModuleName, FunctionName}, where ModuleName and FunctionName are atoms, referring to the function 

模塊名:FunctionName/0

A pair {LineNumber, SimpleTest}, where LineNumber is a nonnegative integer and SimpleTest is another simple test object. LineNumber 

應表明測試的源極線。像這樣的對是 通常只能通過?_test(...)宏創建;請參閱基本宏。

所以,你可以指定你的測試,例如:

generator_test_() -> 
{setup, fun setup/0, fun cleanup/1, 
    {inorder, 
     [ 
      fun() -> some_test1() end 
      %% OR 
      fun some_test1/0 
     ] 
    } 
}. 

除了:

(請注意,這些宏也有與 啓動 「_」(下劃線對應的形式)字符,如?_assert(BoolExpr)中那樣,它創建了一個 「測試對象」,而不是立即執行測試,這相當於寫入?_test(assert(BoolExpr))等等012)

這就是你的測試生成器工作的原因。

編輯

例2和3是做事的好方法。示例2將簡單的測試樂趣放入測試列表中。例3,因爲

[?_assertEqual(a, b), ?_assertEqual(a == a)] 

,如果你想變量實際上是擴大到

[fun() -> ?assertEqual(a, b) end, fun() -> ?assertEqual(a, a) end] 

使用例如2,如3否則產生的2次測試列表。例1沒有給出預期的結果,因爲「fun() - > some_test1()end」是一個測試本身,它應該執行真正的斷言(?assert *)而不是產生另一個測試(?_assert *)。我希望現在很清楚。

+0

安裝程序會與您的解決方案一起運行,但測試不會運行。 通過運行eunit,generator_test_/0運行,但在some_test1/0中編寫任何?_assert宏不會做出更改。通過運行詳細模式,我沒有看到?_assert測試,並且例如編寫?_assertEqual(3,4)遍。 – otisonoza 2013-04-26 13:39:19

+0

寫入?assertEqual(3,4)失敗,但eunit認爲它是一個測試,但有2個斷言。 – otisonoza 2013-04-26 13:45:37

+0

在測試中,您應該只使用?assert *宏,而不是?_assert *宏。請提供有問題的代碼。 – 2013-04-26 19:28:59