sách gpt4 ai đã đi

erlang - 在 erlang eunit failure 中打印测试夹具描述

In lại 作者:行者123 更新时间:2023-12-01 12:52:35 hai mươi bốn 4
mua khóa gpt4 Nike

有没有办法打印使用fixtures的erlang测试生成器的测试描述?使用生成器很难判断哪个测试实际上失败了,打印描述会有所帮助。

ví dụ:

-module(math_test).

-include_lib("eunit/include/eunit.hrl").
-define(test(Desc, F), {Desc, {setup, fun setup/0, fun cleanup/1, F}}).

setup() ->
ok.

cleanup(_) ->
ok.

math_test_ () ->
[
?test("adds two numbers", fun add_two_numbers/0),
?test("subtract two numbers", fun subtract_two_numbers/0),
?test("undefined method called", fun undefined_error/0)
].

add_two_numbers () ->
?assertEqual(2, 1 + 3).

subtract_two_numbers () ->
?assertEqual(1, 2 - 2).

undefined_error () ->
undefined_module:uh_oh().

然后运行它

[root@a7c901c022bb src]# rebar3 eunit --module=math_test
===> Verifying dependencies...
===> Compiling math
===> Performing EUnit tests...
FFF
Failures:

1) math_test:math_test_/0
Failure/Error: ?assertEqual(2, 1 + 3)
expected: 2
got: 4
%% /src/_build/test/lib/math/src/math_test.erl:20:in `math_test:-add_two_numbers/0-fun-0-/1`
Đầu ra:
Đầu ra:
2) math_test:math_test_/0
Failure/Error: ?assertEqual(1, 2 - 2)
expected: 1
got: 0
%% /src/_build/test/lib/math/src/math_test.erl:23:in `math_test:-subtract_two_numbers/0-fun-0-/1`
Đầu ra:
Đầu ra:
3) math_test:math_test_/0
Failure/Error: {error,undef,[{undefined_module,uh_oh,[],[]}]}
Đầu ra:

前 2 个错误没问题,但不是很好——您至少可以在断言中看到实际出错的地方。

然而,第三个错误(调用未定义的模块/方法)是非常错误的地方——没有真正的方法来判断它来自哪里!

有没有办法改进,比如打印测试描述和失败日志?

1 Câu trả lời

您可以做的一件事是将测试描述放在测试本身上,而不是整个 setup 元组。即,更改此行:

-define(test(Desc, F), {Desc, {setup, fun setup/0, fun cleanup/1, F}}).

到:

-define(test(Desc, F), {setup, fun setup/0, fun cleanup/1, {Desc, F}}).

随着这个改变,测试描述被打印出来:

Failures:

1) math_test:math_test_/0: adds two numbers
Failure/Error: ?assertEqual(2, 1 + 3)
expected: 2
got: 4
%% /tmp/math_test/mylib/_build/test/lib/mylib/test/math_test.erl:20:in `math_test:-add_two_numbers/0-fun-0-/0`
Đầu ra:
Đầu ra:
2) math_test:math_test_/0: subtract two numbers
Failure/Error: ?assertEqual(1, 2 - 2)
expected: 1
got: 0
%% /tmp/math_test/mylib/_build/test/lib/mylib/test/math_test.erl:23:in `math_test:-subtract_two_numbers/0-fun-0-/0`
Đầu ra:
Đầu ra:
3) math_test:math_test_/0: undefined method called
Failure/Error: {error,undef,[{undefined_module,uh_oh,[],[]}]}
Đầu ra:

要尝试的另一件事是使用 ?_test 宏而不是普通的 fun 术语指定测试函数:

math_test_ () ->
[
?test("adds two numbers", ?_test(add_two_numbers())),
?test("subtract two numbers", ?_test(subtract_two_numbers())),
?test("undefined method called", ?_test(undefined_error()))
].

?_test 宏会记住它出现的行号,并在测试失败时将其包含在输出中:

  1) math_test:math_test_/0:14: adds two numbers
[...]
2) math_test:math_test_/0:15: subtract two numbers
[...]
3) math_test:math_test_/0:16: undefined method called
[...]

现在您可以知道从哪一行调用了这些测试。


另一种方法是让各个函数返回 eunit“测试对象”,而不是仅仅运行测试。这将涉及使用 ?_assertEqual Còn hơn là ?assertEqual,或者将整个内容包装在 ?_test ở giữa:

math_test_ () ->
[
?test("adds two numbers", add_two_numbers()),
?test("subtract two numbers", subtract_two_numbers()),
?test("undefined method called", undefined_error())
].

add_two_numbers () ->
?_assertEqual(2, 1 + 3).

subtract_two_numbers () ->
?_assertEqual(1, 2 - 2).

undefined_error () ->
?_test(undefined_module:uh_oh())

然后输出包含行号和各个测试函数的名称:

Failures:

1) math_test:add_two_numbers/0:20: adds two numbers
Failure/Error: ?assertEqual(2, 1 + 3)
expected: 2
got: 4
%% /tmp/math_test/mylib/_build/test/lib/mylib/test/math_test.erl:20:in `math_test:-add_two_numbers/0-fun-0-/0`
Đầu ra:
Đầu ra:
2) math_test:subtract_two_numbers/0:23: subtract two numbers
Failure/Error: ?assertEqual(1, 2 - 2)
expected: 1
got: 0
%% /tmp/math_test/mylib/_build/test/lib/mylib/test/math_test.erl:23:in `math_test:-subtract_two_numbers/0-fun-0-/0`
Đầu ra:
Đầu ra:
3) math_test:undefined_error/0:26: undefined method called
Failure/Error: {error,undef,[{undefined_module,uh_oh,[],[]}]}
Đầu ra:

关于erlang - 在 erlang eunit failure 中打印测试夹具描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50765610/

hai mươi bốn 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com