2012-05-09 34 views
7

Tôi đang viết một bài kiểm tra với EUnit, nhưng không phải bất kỳ đầu ra chi tiết ngoại lệ nào trong bảng điều khiển.không theo dõi ngoại lệ dấu vết ngăn xếp trong EUnit

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

Run module này: exp_test() trong sản lượng Erlang Shell sau

** 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) 

Nhưng trong đầu ra EUnit sau

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

EUnit không ra bất cứ điều gì ngoại trừ thông tin dấu vết

Im cố gắng cấu hình tiết trong eunit, nhưng không có hiệu lực.

Tôi muốn xuất một số chi tiết ngoại lệ trong kết quả kiểm tra eunit.

Cảm ơn ~

Trả lời

4

Eunit là khá cũ và trong khi nó được chính thức duy trì bởi đội OTP tại Ericsson, nó thường là uncared cho. Eunit hiện đang có thói quen xấu ăn các dấu vết ngăn xếp, và chưa được cập nhật cho số dòng R15 trong trường hợp ngoại lệ.

Tôi sẽ không cho rằng "đó là cách nó được cho là hoạt động". Không có công cụ kiểm tra lành mạnh nào nên ẩn chi tiết ngoại lệ và số dòng cho bạn.

+0

tks câu trả lời của bạn, Im thử cách khác kiểm tra mã của tôi. – hpyhacking

+0

OTP không duy trì EUnit - tôi làm, khi tôi có thời gian. Và giúp đỡ luôn được chào đón. Nhân đây, nếu bạn có một số ví dụ về khi EUnit ăn một dấu vết ngăn xếp mà nó không nên, xin vui lòng gửi cho tôi. – RichardC

+0

Còn trường hợp trên thì sao? Không thể suy luận rằng trường hợp ngoại lệ xuất phát từ trường hợp thử nghiệm hoặc mã đang được kiểm tra. –

7

Sự cố có vẻ là phiên bản eunit được giao với R15 không hiểu định dạng dấu vết ngăn xếp mới trong R15. Điều này đã được cố định trong phiên bản phát triển của eunit: github.com/richcarl/eunit

Ví dụ:

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 

Tôi hy vọng điều này sẽ được đưa vào phiên bản tiếp theo của OTP R15.

+0

Một [bản vá hơi khác] (https://github.com/erlang/otp/commit/73b94a990bb91fd263dace4ccbaef6ff727a9637) được đưa vào 'pu' (nghĩa là cho bản phát hành R15 tiếp theo) vào tháng 11 năm 2011. Tuy nhiên, nó không được bao gồm trong R15B01 ([phát hành 2012-04-02] (http://www.erlang.org/download/otp_src_R15B01.readme)). – legoscia

7

Đây là vấn đề đã biết trong eunit như được phát hành trong R15B và R15B01. Điều này đã được sửa trong bản phát hành R15B02. Nếu bạn đang mắc kẹt với một phiên bản trước đó, bạn có thể tải về và áp dụng a patch:

Có thể chỉnh lại các phiên bản trước R15B02

Bạn có thể sửa chữa các vấn đề trong cài đặt cục bộ của bạn bằng cách biên dịch lại các mô-đun bị ảnh hưởng:

  1. Tải xuống và giải nén các nguồn Erlang/OTP, nếu bạn chưa có chúng.

    wget http://www.erlang.org/download/otp_src_R15B01.tar.gz 
    tar xzf otp_src_R15B01.tar.gz 
    cd otp_src_R15B01 
    
  2. Tải xuống và áp dụng the patch.

    wget -O eunit-stacktrace.patch https://github.com/erlang/otp/commit/73b94a990bb91fd263dace4ccbaef6ff727a9637.patch 
    patch -p1 < eunit-stacktrace.patch 
    
  3. Biên dịch lại eunit_lib.erl.

    cd lib/eunit 
    erlc -o ebin -I include src/eunit_lib.erl 
    
  4. Sao chép mới eunit_lib.beam hơn cũ (thường là ở đâu đó bên dưới /usr/local).

    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

Một lừa tôi thích sử dụng là ?debugVal(catch expr) nơi expr là hoặc là một begin end khối hoặc một cuộc gọi đến các chức năng thất bại. Ví dụ: ?debugVal(catch begin 1 = 2 end) sẽ xuất ra một stacktrace trong các thử nghiệm của bạn.

+0

cảm ơn, tôi sẽ thử nó. – hpyhacking

+0

@hpyhacking Tôi rất muốn khuyên bạn chỉ cần nhân bản xuống repo eunit mới nhất và thay thế eunit-2.2.2 trên máy cục bộ của bạn với eunit-2.2.3 trong lúc này. – rramsden

Các vấn đề liên quan