<div dir="ltr"><div><div>Почему же, вот пример из документации Test::Deep:<br><h1><a class="" name="USING_TEST::DEEP_WITH_TEST::BUILDER">USING TEST::DEEP WITH TEST::BUILDER <img alt="^" src="http://st.pimg.net/tucs/img/up.gif"></a></h1>

<p>Combining <code>cmp_details</code> and <code>test_diag</code> makes it possible to use Test::Deep in your own test classes.</p>

<p>In a <a href="http://search.cpan.org/perldoc?Test%3A%3ABuilder" class="">Test::Builder</a> subclass, create a test method in the following form:</p>

<pre class="">  <span class="">sub</span> behaves_ok <span class="">{</span>
    <span class="">my</span> <span class="">$self</span> <span class="">=</span> <span class="">shift</span><span class="">;</span>
    <span class="">my</span> <span class="">$expected</span> <span class="">=</span> <span class="">shift</span><span class="">;</span>
    <span class="">my</span> <span class="">$test_name</span> <span class="">=</span> <span class="">shift</span><span class="">;</span>

    <span class="">my</span> <span class="">$got</span> <span class="">=</span> <span class="">do_the_important_work_here</span><span class="">();</span>

    <span class="">my</span> <span class="">(</span><span class="">$ok</span><span class="">,</span> <span class="">$stack</span><span class="">)</span> <span class="">=</span> <span class="">cmp_details</span><span class="">(</span><span class="">$got</span><span class="">,</span> <span class="">$expected</span><span class="">);</span>
    <span class="">unless</span> <span class="">(</span><span class="">$Test</span><span class="">-></span><span class="">ok</span><span class="">(</span><span class="">$ok</span><span class="">,</span> <span class="">$test_name</span><span class="">))</span> <span class="">{</span>
      <span class="">my</span> <span class="">$diag</span> <span class="">=</span> <span class="">deep_diag</span><span class="">(</span><span class="">$stack</span><span class="">);</span>
      <span class="">$Test</span><span class="">-></span><span class="">diag</span><span class="">(</span><span class="">$diag</span><span class="">);</span>
    <span class="">}</span>
  <span class="">}</span></pre>

<p>As the subclass defines a test class, not tests themselves, make sure it uses <a href="http://search.cpan.org/%7Erjbs/Test-Deep-1.120/lib/Test/Deep/NoTest.pm" class="">Test::Deep::NoTest</a>, not <code>Test::Deep</code> itself.</p><p><br></p><p>Похоже покурить прийдется, но я думаю это не полеты в космос.<br></p></div></div><br></div><div class="gmail_extra"><br><div class="gmail_quote">30 июня 2016 г., 22:28 пользователь Victor Efimov <span dir="ltr"><<a href="mailto:victor@vsespb.ru" target="_blank">victor@vsespb.ru</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Круто, буду юзать. Похоже сложные вещи, типа, не is_eq, а cmp_deeply<br>
из Test::Deep так заюзать нельзя?<br>
<br>
30 июня 2016 г., 21:38 пользователь Гришаев Анатолий<br>
<div class="HOEnZb"><div class="h5"><<a href="mailto:agrishaev@gmail.com">agrishaev@gmail.com</a>> написал:<br>
> Когда тест фейлится то печатает номер строки из которой был вызван is()<br>
> а если используешь $tb->is_eq, то печатается номер строки где была вызвана<br>
> test_case.<br>
><br>
> в первом случае это одна строка на все тесты, а во втором на каждый тест<br>
> своя строка.<br>
><br>
> Помогает, если ты не имеешь доступа к той тачке, где тесты<br>
> проходят(cpan-testers например)<br>
> В первом случае ты знаешь, что какой-то тест в файле сломался, а во втором<br>
> знаешь какой именно тест сломался,<br>
> даже если ты не дал для него имя или у двух тестов оно каким-то образом<br>
> получилось одинаковым (бывало, такова жизнь).<br>
><br>
><br>
><br>
><br>
><br>
><br>
> 30 июня 2016 г., 21:07 пользователь Victor Efimov <<a href="mailto:victor@vsespb.ru">victor@vsespb.ru</a>><br>
> написал:<br>
><br>
>> а зачем, кстати, $tb ?<br>
>><br>
>> 30 июня 2016 г., 20:59 пользователь Гришаев Анатолий<br>
>> <<a href="mailto:agrishaev@gmail.com">agrishaev@gmail.com</a>> написал:<br>
>> > Спасибо Акжан и Виктор за ваши варианты.<br>
>> ><br>
>> > Вообщем использовал обе идеи и добавил, что-то от себя.<br>
>> > 1) использовал именованные параметры для ясности<br>
>> > 2) Завернул в функцию<br>
>> > 3) Используем номера строк для нахождения failing case<br>
>> ><br>
>> > Получилось в итоге.<br>
>> > =========================<br>
>> > test_case(<br>
>> >    input => "input 1",<br>
>> >    output => "result 1",<br>
>> > );<br>
>> > ...<br>
>> > test_case(<br>
>> >    input => "input 2",<br>
>> >    output => "result 2",<br>
>> > );<br>
>> ><br>
>> > sub test_case{<br>
>> >      my $tb = Test::Builder->new;<br>
>> >      ...<br>
>> >       $tb->is_eq( ... );<br>
>> > };<br>
>> > =========================<br>
>> ><br>
>> ><br>
>> > 30 июня 2016 г., 20:21 пользователь Гришаев Анатолий<br>
>> > <<a href="mailto:agrishaev@gmail.com">agrishaev@gmail.com</a>><br>
>> > написал:<br>
>> ><br>
>> >> Не совсем эквивалентно теряется информация о строке в которой определен<br>
>> >> тест<br>
>> >><br>
>> >> Можно твой вариант улучшить чуть-чуть<br>
>> >><br>
>> >> вместо<br>
>> >> .............<br>
>> >> sub test_case {<br>
>> >>   my ($want_result,  $input) = @_;<br>
>> >><br>
>> >>   my $r = my_func($input)<br>
>> >>   ok($r)<br>
>> >>   is($r->string, $want_result, "parse $input")<br>
>> >> }<br>
>> >> ..........................<br>
>> >><br>
>> >> Лучше писать<br>
>> >> ////////////////////<br>
>> >><br>
>> >> sub test_case {<br>
>> >>   my ($want_result,  $input) = @_;<br>
>> >> +my $tb = Test::Builder->new;<br>
>> >>   my $r = my_func($input)<br>
>> >>   $tb->ok($r)<br>
>> >>   -is($r->string, $want_result, "parse $input")<br>
>> >>   +$tb->is_eq($r->string, $want_result, "parse $input");<br>
>> >> }<br>
>> >> /////////////////////<br>
>> >><br>
>> >> Я от подобного варианта ушел, не смог заставить писать в таком стиле,<br>
>> >> из-за собственных требований к красоте.<br>
>> >><br>
>> >><br>
>> >><br>
>> >> 30 июня 2016 г., 19:53 пользователь Victor Efimov <<a href="mailto:victor@vsespb.ru">victor@vsespb.ru</a>><br>
>> >> написал:<br>
>> >><br>
>> >>> или<br>
>> >>> я переодически делаю вместо<br>
>> >>> ===<br>
>> >>> my ($want_result,  $input) = ( "вход 1", "выход 1")<br>
>> >>><br>
>> >>> my $r = my_func($input)<br>
>> >>> ok($r)<br>
>> >>> is($r->string, $want_result, "parse $input")<br>
>> >>> ===<br>
>> >>><br>
>> >>> так:<br>
>> >>><br>
>> >>> ===<br>
>> >>> sub test_case {<br>
>> >>>   my ($want_result,  $input) = @_;<br>
>> >>><br>
>> >>>   my $r = my_func($input)<br>
>> >>>   ok($r)<br>
>> >>>   is($r->string, $want_result, "parse $input")<br>
>> >>> }<br>
>> >>><br>
>> >>> test_case( "вход 1", "выход 1");<br>
>> >>> test_case( "вход 2", "выход 2");<br>
>> >>> test_case( "вход 3", "выход 3");<br>
>> >>> test_case( "вход 4", "выход 4");<br>
>> >>> ===<br>
>> >>><br>
>> >>> что-то в общем-то эквивалентно готовому хэшу с вход-выход<br>
>> >>><br>
>> >>> 30 июня 2016 г., 19:46 пользователь Akzhan Abdulin<br>
>> >>> <<a href="mailto:akzhan.abdulin@gmail.com">akzhan.abdulin@gmail.com</a>> написал:<br>
>> >>> > оно?<br>
>> >>> ><br>
>> >>> ><br>
>> >>> ><br>
>> >>> > <a href="https://github.com/plack/Plack/blob/master/t/Plack-Middleware/lint_wrong_header_info.t" rel="noreferrer" target="_blank">https://github.com/plack/Plack/blob/master/t/Plack-Middleware/lint_wrong_header_info.t</a><br>
>> >>> ><br>
>> >>> > 30 июня 2016 г., 19:25 пользователь Гришаев Анатолий<br>
>> >>> > <<a href="mailto:agrishaev@gmail.com">agrishaev@gmail.com</a>><br>
>> >>> > написал:<br>
>> >>> >><br>
>> >>> >> Добрый день Moscow PM!<br>
>> >>> >><br>
>> >>> >><br>
>> >>> >> Пишу тесты для сложной функции-монстра<br>
>> >>> >><br>
>> >>> >> На вход принимает строку  и на выход "почти" строку.<br>
>> >>> >><br>
>> >>> >><br>
>> >>> >> Сейчас тесты выглядят так<br>
>> >>> >> ////////////////////////////<br>
>> >>> >> my ($want_result,  $input) = ( "вход 1", "выход 1")<br>
>> >>> >><br>
>> >>> >> my $r = my_func($input)<br>
>> >>> >> ok($r)<br>
>> >>> >> is($r->string, $want_result, "parse $input")<br>
>> >>> >><br>
>> >>> >> my ($want_result,  $input) = ( "вход 2", "выход 2")<br>
>> >>> >><br>
>> >>> >> my $r = my_func($input)<br>
>> >>> >> ok($r)<br>
>> >>> >> is($r->string, $want_result, "parse $input")<br>
>> >>> >> //////////////////////////<br>
>> >>> >><br>
>> >>> >> Получается куча повторяющего кода, в котором теряется суть<br>
>> >>> >><br>
>> >>> >> Можно ли этого избежать и писать более красиво?<br>
>> >>> >><br>
>> >>> >><br>
>> >>> >><br>
>> >>> >><br>
>> >>> >><br>
>> >>> >> --<br>
>> >>> >> Moscow.pm mailing list<br>
>> >>> >> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
>> >>> >><br>
>> >>> ><br>
>> >>> ><br>
>> >>> > --<br>
>> >>> > Moscow.pm mailing list<br>
>> >>> > <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
>> >>> ><br>
>> >>> --<br>
>> >>> Moscow.pm mailing list<br>
>> >>> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
>> >><br>
>> >><br>
>> ><br>
>> ><br>
>> > --<br>
>> > Moscow.pm mailing list<br>
>> > <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
>> ><br>
>> --<br>
>> Moscow.pm mailing list<br>
>> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
><br>
><br>
><br>
> --<br>
> Moscow.pm mailing list<br>
> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
><br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br></div>