Распечатать описание испытательного стенда при сбое erlang eunit - PullRequest
0 голосов
/ 08 июня 2018

Есть ли способ напечатать описание теста генератора теста Erlang, который использует приборы?Использование генератора затрудняет определение того, какой тест на самом деле не выполняется, и распечатка описания может помочь.

Пример:

-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`
     Output: 
     Output: 
  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`
     Output: 
     Output: 
  3) math_test:math_test_/0
     Failure/Error: {error,undef,[{undefined_module,uh_oh,[],[]}]}
     Output: 

Первые 2 ошибки в порядке, но не велики - вы можете, по крайней мере, увидеть в утверждении, где что-то пошло не так.

Однако 3-я ошибка (вызов неопределенного модуля / метода) - это то, где дела идут ужасно неправильно- нет никакого реального способа узнать, откуда он взялся!

Есть ли способ улучшить ситуацию, например распечатать описание теста с журналом сбоев?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Ответы @legoscia хороши, но я также подозреваю, что отчеты об ошибках, реализованные rebar3, неоптимальны для такого рода ошибок.Запустив тесты непосредственно из eunit с его выводом по умолчанию, вы получите следующее:

2> eunit:test(math_test). 
math_test: math_test_...*failed*
in function math_test:'-add_two_numbers/0-fun-0-'/0 (math_test.erl, line 22)
**error:{assertEqual,[{module,math_test},
                      {line,22},
                      {expression,"1 + 3"},
                      {expected,2},
                      {value,4}]}
  output:<<"">>

math_test: math_test_...*failed*
in function math_test:'-subtract_two_numbers/0-fun-0-'/0 (math_test.erl, line 25)
**error:{assertEqual,[{module,math_test},
                      {line,25},
                      {expression,"2 - 2"},
                      {expected,1},
                      {value,0}]}
  output:<<"">>

math_test: math_test_...*failed*
in function undefined_module:uh_oh/0
  called as uh_oh()
**error:undef 
  output:<<"">>

=======================================================
  Failed: 3.  Skipped: 0.  Passed: 0.

С опцией 'verbose' он также печатает описания перед каждой настройкой.Кроме того, переместив описание в тестовую забаву и используя макрос? _Test (...) для создания тестовых забав с большей позиционной информацией, чем простой забавой, как предложила @legoscia, вы получите такой вывод:

  math_test:18: math_test_ (undefined method called)...*failed*
in function undefined_module:uh_oh/0
  called as uh_oh()
**error:undef 
  output:<<"">>

Вы можете сообщить об этом сопровождающим rebar3.

0 голосов
/ 12 июня 2018

Одна вещь, которую вы можете сделать, это поместить описание теста в сам тест, а не во весь кортеж 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`
     Output: 
     Output: 
  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`
     Output: 
     Output: 
  3) math_test:math_test_/0: undefined method called
     Failure/Error: {error,undef,[{undefined_module,uh_oh,[],[]}]}
     Output: 

Другойпопробуйте указать тестовые функции с помощью макроса ?_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 вместо ?assertEqual или обернуть все в ?_test:

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`
     Output: 
     Output: 
  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`
     Output: 
     Output: 
  3) math_test:undefined_error/0:26: undefined method called
     Failure/Error: {error,undef,[{undefined_module,uh_oh,[],[]}]}
     Output: 
...