2012-05-09 10 views
7

EUnitでテストを書いていますが、コンソールの例外詳細出力はありません。EUnitで例外スタックトレースを出力しません

exp_test() -> 
    ?assertEqual(0, 1/0). 

を実行し、このモジュール:Erlangのシェル出力のexp_test()

> eunit:test(xxx). 
> xxx_test: exp_test...*failed* 
    ::badarith 

EUNITない何も出力例外トレース情報

** exception error: bad argument in an arithmetic expression 
in function exp_test:'-exp_test/0-fun-0-'/1 (src/test/eunit/xxx_test.erl, line 8) 

しかしEUNIT出力では、次のImはeunitで冗長な設定を試していますが、何の効果もありません。

eunitのテスト結果に例外の詳細を出力したい。

感謝〜

答えて

4

EUNITはかなり古いですし、それが正式エリクソンのOTPチームによって維持されている間、それがために通常uncaredです。 Eunitは現在、スタックトレースを食べるという習慣が悪いですし、例外的にR15の行番号について更新されていません。

「私はそれがうまくいく」とは言いません。正常なテストツールでは、例外の詳細と行番号を隠すべきではありません。

+0

あなたの答えをtks、私のコードをテストする他の方法を試してください。 – hpyhacking

+0

OTPはEUnitを維持していません - 私は時間があればします。そして助けはいつでも歓迎です。ちなみに、EUnitがスタックトレースを食べるときの例があれば、それを私に送ってください。 – RichardC

+0

上記の場合はどうですか?例外がテストケースまたはテスト対象のコードから来ていると推測することは不可能です。 –

7

問題は、R15に付属のeunitのバージョンがR15の新しいスタックトレースフォーマットを理解していないことが原因と考えられます。これはEUNITの開発版で修正されています。たとえばgithub.com/richcarl/eunit

Eshell V5.10 (abort with ^G) 
1> eunit:test(fun() -> (fun() -> exit(foo), ok end)() end). 
erl_eval: expr...*failed* 
in function erl_eval:do_apply/6 (erl_eval.erl, line 576) 
in call from erl_eval:exprs/5 (erl_eval.erl, line 118) 
**exit:foo 

私は、これはOTP R15の次のリリースにそれを作ることを願っています。

+0

2011年11月に「pu」(すなわち、次のR15リリース用)で作られた[わずかに異なるパッチ](https://github.com/erlang/otp/commit/73b94a990bb91fd263dace4ccbaef6ff727a9637)。しかし、それはR15B01([2012-04-02](http://www.erlang.org/download/otp_src_R15B01.readme))。 – legoscia

7

これは、R15BおよびR15B01でリリースされたeunitの既知の問題です。これはリリースR15B02で修正されています。以前のバージョンで立ち往生している場合は、a patchをダウンロードして適用することができます。

    回避策をリリースするためにR15B02

    前に、あなたが影響を受けたモジュールを再コンパイルすることで、ローカルインストールで問題を解決することができます

  1. Erlang/OTPソースがない場合は、ダウンロードして解凍してください。

    wget http://www.erlang.org/download/otp_src_R15B01.tar.gz 
    tar xzf otp_src_R15B01.tar.gz 
    cd otp_src_R15B01 
    
  2. ダウンロードしてthe patchを適用します。

    wget -O eunit-stacktrace.patch https://github.com/erlang/otp/commit/73b94a990bb91fd263dace4ccbaef6ff727a9637.patch 
    patch -p1 < eunit-stacktrace.patch 
    
  3. 再コンパイルeunit_lib.erl

    cd lib/eunit 
    erlc -o ebin -I include src/eunit_lib.erl 
    
  4. 古いもの(通常はどこか/usr/local以下)の上に新しいeunit_lib.beamをコピーします。

    ls /usr/local/lib/erlang/lib/eunit-2.2.2/ebin/ 
    # check that eunit_lib.beam is actually there 
    sudo cp ebin/eunit_lib.beam /usr/local/lib/erlang/lib/eunit-2.2.2/ebin/ 
    
2

exprがbegin endブロック 又は障害の関数への呼び出しのいずれかである場合、私が使用するようにトリック?debugVal(catch expr)あります。たとえば、?debugVal(catch begin 1 = 2 end)はテストでスタックトレースを出力します。

+0

ありがとう、私はそれを試してみます。 – hpyhacking

+0

@hpyhacking最新のeunitリポジトリをクローンダウンして、ローカルマシンのeunit-2.2.2をeunit-2.2.3に取り替えることをお勧めします。 – rramsden

関連する問題