[Moscow.pm] Научите писать красивые тесты

Victor Efimov victor на vsespb.ru
Чт Июн 30 11:07:00 PDT 2016


а зачем, кстати, $tb ?

30 июня 2016 г., 20:59 пользователь Гришаев Анатолий
<agrishaev на gmail.com> написал:
> Спасибо Акжан и Виктор за ваши варианты.
>
> Вообщем использовал обе идеи и добавил, что-то от себя.
> 1) использовал именованные параметры для ясности
> 2) Завернул в функцию
> 3) Используем номера строк для нахождения failing case
>
> Получилось в итоге.
> =========================
> test_case(
>    input => "input 1",
>    output => "result 1",
> );
> ...
> test_case(
>    input => "input 2",
>    output => "result 2",
> );
>
> sub test_case{
>      my $tb = Test::Builder->new;
>      ...
>       $tb->is_eq( ... );
> };
> =========================
>
>
> 30 июня 2016 г., 20:21 пользователь Гришаев Анатолий <agrishaev на gmail.com>
> написал:
>
>> Не совсем эквивалентно теряется информация о строке в которой определен
>> тест
>>
>> Можно твой вариант улучшить чуть-чуть
>>
>> вместо
>> .............
>> sub test_case {
>>   my ($want_result,  $input) = @_;
>>
>>   my $r = my_func($input)
>>   ok($r)
>>   is($r->string, $want_result, "parse $input")
>> }
>> ..........................
>>
>> Лучше писать
>> ////////////////////
>>
>> sub test_case {
>>   my ($want_result,  $input) = @_;
>> +my $tb = Test::Builder->new;
>>   my $r = my_func($input)
>>   $tb->ok($r)
>>   -is($r->string, $want_result, "parse $input")
>>   +$tb->is_eq($r->string, $want_result, "parse $input");
>> }
>> /////////////////////
>>
>> Я от подобного варианта ушел, не смог заставить писать в таком стиле,
>> из-за собственных требований к красоте.
>>
>>
>>
>> 30 июня 2016 г., 19:53 пользователь Victor Efimov <victor на vsespb.ru>
>> написал:
>>
>>> или
>>> я переодически делаю вместо
>>> ===
>>> my ($want_result,  $input) = ( "вход 1", "выход 1")
>>>
>>> my $r = my_func($input)
>>> ok($r)
>>> is($r->string, $want_result, "parse $input")
>>> ===
>>>
>>> так:
>>>
>>> ===
>>> sub test_case {
>>>   my ($want_result,  $input) = @_;
>>>
>>>   my $r = my_func($input)
>>>   ok($r)
>>>   is($r->string, $want_result, "parse $input")
>>> }
>>>
>>> test_case( "вход 1", "выход 1");
>>> test_case( "вход 2", "выход 2");
>>> test_case( "вход 3", "выход 3");
>>> test_case( "вход 4", "выход 4");
>>> ===
>>>
>>> что-то в общем-то эквивалентно готовому хэшу с вход-выход
>>>
>>> 30 июня 2016 г., 19:46 пользователь Akzhan Abdulin
>>> <akzhan.abdulin на gmail.com> написал:
>>> > оно?
>>> >
>>> >
>>> > https://github.com/plack/Plack/blob/master/t/Plack-Middleware/lint_wrong_header_info.t
>>> >
>>> > 30 июня 2016 г., 19:25 пользователь Гришаев Анатолий
>>> > <agrishaev на gmail.com>
>>> > написал:
>>> >>
>>> >> Добрый день Moscow PM!
>>> >>
>>> >>
>>> >> Пишу тесты для сложной функции-монстра
>>> >>
>>> >> На вход принимает строку  и на выход "почти" строку.
>>> >>
>>> >>
>>> >> Сейчас тесты выглядят так
>>> >> ////////////////////////////
>>> >> my ($want_result,  $input) = ( "вход 1", "выход 1")
>>> >>
>>> >> my $r = my_func($input)
>>> >> ok($r)
>>> >> is($r->string, $want_result, "parse $input")
>>> >>
>>> >> my ($want_result,  $input) = ( "вход 2", "выход 2")
>>> >>
>>> >> my $r = my_func($input)
>>> >> ok($r)
>>> >> is($r->string, $want_result, "parse $input")
>>> >> //////////////////////////
>>> >>
>>> >> Получается куча повторяющего кода, в котором теряется суть
>>> >>
>>> >> Можно ли этого избежать и писать более красиво?
>>> >>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Moscow.pm mailing list
>>> >> moscow-pm на pm.org | http://moscow.pm.org
>>> >>
>>> >
>>> >
>>> > --
>>> > Moscow.pm mailing list
>>> > moscow-pm на pm.org | http://moscow.pm.org
>>> >
>>> --
>>> Moscow.pm mailing list
>>> moscow-pm на pm.org | http://moscow.pm.org
>>
>>
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>


Подробная информация о списке рассылки Moscow-pm