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

Victor Efimov victor на vsespb.ru
Чт Июн 30 12:28:16 PDT 2016


Круто, буду юзать. Похоже сложные вещи, типа, не is_eq, а cmp_deeply
из Test::Deep так заюзать нельзя?

30 июня 2016 г., 21:38 пользователь Гришаев Анатолий
<agrishaev на gmail.com> написал:
> Когда тест фейлится то печатает номер строки из которой был вызван is()
> а если используешь $tb->is_eq, то печатается номер строки где была вызвана
> test_case.
>
> в первом случае это одна строка на все тесты, а во втором на каждый тест
> своя строка.
>
> Помогает, если ты не имеешь доступа к той тачке, где тесты
> проходят(cpan-testers например)
> В первом случае ты знаешь, что какой-то тест в файле сломался, а во втором
> знаешь какой именно тест сломался,
> даже если ты не дал для него имя или у двух тестов оно каким-то образом
> получилось одинаковым (бывало, такова жизнь).
>
>
>
>
>
>
> 30 июня 2016 г., 21:07 пользователь Victor Efimov <victor на vsespb.ru>
> написал:
>
>> а зачем, кстати, $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 mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>


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