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

Гришаев Анатолий agrishaev на gmail.com
Чт Июн 30 11:38:04 PDT 2016


Когда тест фейлится то печатает номер строки из которой был вызван 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
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20160630/2c938329/attachment-0001.html>


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