SlideShare une entreprise Scribd logo
1  sur  35
Télécharger pour lire hors ligne
Unit testing for Perl

                                                      Alexey Shrub

                                                Российские интернет-технологии


                                                       2011-04-26




Alexey Shrub, Российские интернет-технологии                           Unit testing for Perl   1/30
Модульное тестирование




             Автоматизированное.
             Изолированное.




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   2/30
Зачем нужны модульные тесты

             Необходимая верификация (+ двойная запись).




Alexey Shrub, Российские интернет-технологии     Unit testing for Perl   3/30
Зачем нужны модульные тесты

             Необходимая верификация (+ двойная запись).
             Борьба с ростом энтропии (регрессом) при изменениях (= легкость
             рефакторинга).




Alexey Shrub, Российские интернет-технологии      Unit testing for Perl        3/30
Зачем нужны модульные тесты

             Необходимая верификация (+ двойная запись).
             Борьба с ростом энтропии (регрессом) при изменениях (= легкость
             рефакторинга).
             Локализация ошибок (в отличие от интеграционных).




Alexey Shrub, Российские интернет-технологии      Unit testing for Perl        3/30
Зачем нужны модульные тесты

             Необходимая верификация (+ двойная запись).
             Борьба с ростом энтропии (регрессом) при изменениях (= легкость
             рефакторинга).
             Локализация ошибок (в отличие от интеграционных).
             Раннее обнаружение ошибок (чем раньше, тем дешевле исправление
             ошибки).




Alexey Shrub, Российские интернет-технологии      Unit testing for Perl        3/30
Зачем нужны модульные тесты

             Необходимая верификация (+ двойная запись).
             Борьба с ростом энтропии (регрессом) при изменениях (= легкость
             рефакторинга).
             Локализация ошибок (в отличие от интеграционных).
             Раннее обнаружение ошибок (чем раньше, тем дешевле исправление
             ошибки).
             Раннее обнаружение неудобного интерфейса.




Alexey Shrub, Российские интернет-технологии      Unit testing for Perl        3/30
Зачем нужны модульные тесты

             Необходимая верификация (+ двойная запись).
             Борьба с ростом энтропии (регрессом) при изменениях (= легкость
             рефакторинга).
             Локализация ошибок (в отличие от интеграционных).
             Раннее обнаружение ошибок (чем раньше, тем дешевле исправление
             ошибки).
             Раннее обнаружение неудобного интерфейса.
             Документация.



Alexey Shrub, Российские интернет-технологии      Unit testing for Perl        3/30
Стандартные отмазки нежелающих писать тесты



             Нет времени.
             Код нетестируемый.
             Не умею и боюсь, у меня и без тестов вроде/должно работать.




Alexey Shrub, Российские интернет-технологии      Unit testing for Perl    4/30
Тесты в Perl. Функциональное тестирование




Alexey Shrub, Российские интернет-технологии                Unit testing for Perl   5/30
use Test::More;

     Базовые функции
             ok
             is
             new_ok
             is_deeply
             ...
     Диагностика (diag/explain):
      i s _ d e e p l y ( $got , $ e x p e c t e d , ’ R e s u l t must be . . . ’ )
             or diag e x p l a i n $got ;



Alexey Shrub, Российские интернет-технологии             Unit testing for Perl         6/30
Минимальный пример
     Пример положительного функционального теста
     #! / u s r / b i n / p e r l −w
     use s t r i c t ;
     use T e s t : : More t e s t s => 1 ;
     use E m a i l : : V a l i d ;

     my $ e m a i l       = ’ w o r l d . mind@yahoo . com ’ ;
     my $ e x p e c t e d = $ e m a i l ;
     my $ g o t           = E m a i l : : V a l i d −>a d d r e s s ( $ e m a i l ) ;

      i s ( $got , $ e x p e c t e d , " $ e m a i l must be v a l i d " ) ;


Alexey Shrub, Российские интернет-технологии                 Unit testing for Perl      7/30
Запуск одного теста


     TAP - Test Anything Protocol
     Run test
     $ perl t/simple-test.t
     1..1
     ok 1 - world.mind@yahoo.com must be valid




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   8/30
Запуск набора тестов

     Run tests with Test:Harness
     $ prove
     t/simple-test.t .. ok
     t/use.t .......... ok
     All tests successful.
     Files=2, Tests=2, 1 wallclock secs ( 0.02 usr                     0.01 sys +   0.14 cusr
     Result: PASS

     Makefile - бывает удобнее



Alexey Shrub, Российские интернет-технологии   Unit testing for Perl                     9/30
Тестирование исключений
     Test::Exception
     #! / u s r / b i n / p e r l −w
     use s t r i c t ;
     use F a t a l qw( open c l o s e ) ;
     use T e s t : : More t e s t s => 1 ;
     use T e s t : : E x c e p t i o n ;

     my $ f i l e n a m e = ’ t h e _ n o t _ e x i s t e d _ f i l e ’ ;

      throws_ok { open (my $fh , "<" , $ f i l e n a m e ) }
          q r /No s u c h f i l e / ,
           ’ open ( ) w i t h bad f i l e name must throw e x c e p t i o n ’ ;

Alexey Shrub, Российские интернет-технологии                   Unit testing for Perl   10/30
Генерация входных данных
     Test::LectroTest::Compat
     #! / u s r / b i n / p e r l −w

     use s t r i c t ;
     use T e s t : : More t e s t s => 1 ;
     use T e s t : : L e c t r o T e s t : : Compat ;

     my $ p r o p _ n o n n e g a t i v e = P r o p e r t y {
          ##[ x <− I n t ]##
          cmp_ok ( abs ( $x ) , ’>= ’ , 0 ) ;
     } , name => " a b s o u t p u t must be non− n e g a t i v e " ;

      holds ( $prop_nonnegative ) ;
Alexey Shrub, Российские интернет-технологии            Unit testing for Perl   11/30
Что делать, если модуль взаимодействует с внешним миром?


             Пишет/читает базу.
             Обращается к web страницам/скриптам.
             Пишет/читает memcache.
             Вызывает SOAP/XML-RPC сервисы.
             и т.п.


                                               ?


Alexey Shrub, Российские интернет-технологии       Unit testing for Perl   12/30
Mock/Stub/Fake

     Mock модули общего назначения
             Test::MockObject
             Test::MockModule
        Test::MockClass
     Специализированные
             DBD::Mock
             Test::Mock::LWP
             Cache::Memcached::Mock
             и т.п.


Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   13/30
Пример подмены модуля LWP I
     #! / u s r / b i n / p e r l −w
     use s t r i c t ;
     use T e s t : : More t e s t s => 3 ;
     use T e s t : : MockObject ;
     use Cache : : Memcached : : F a s t ;
     use l i b qw( l i b ) ;

     my      $server               =     ’ l o c a l h o s t :11211 ’ ;
     my      $key                  =     ’ mykey ’ ;
     my      $value                =     ’ value ’ ;
     my      $newvalue             =     ’ newvalue ’ ;

     BEGIN {
Alexey Shrub, Российские интернет-технологии                          Unit testing for Perl   14/30
Пример подмены модуля LWP II
          $_ = ’ MyMemcacheWrapper ’ ;
          use_ok ( $_ ) ;
     }

     # moking Cache : : Memcached : : F a s t
     my $memc_mock = T e s t : : MockObject −>new ( ) ;
     T e s t : : MockObject −>fake_module ( ’ Cache : : Memcached : : F a s t ’ ,
            new => sub { $memc_mock } ) ;

     my $memcache = {
         $key , $ v a l u e ,
     };


Alexey Shrub, Российские интернет-технологии     Unit testing for Perl              15/30
Пример подмены модуля LWP III
     $memc_mock−>mock (
         ’ get ’ ,
         sub {
              my ( $ s e l f , $ ke y ) = @_;
               return $memcache −>{$ ke y } ;
         }
     );

     $memc_mock−>mock (
         ’ set ’ ,
         sub {
              my ( $ s e l f , $key , $ v a l u e ) = @_;
               $memcache −>{$ ke y } = $ v a l u e ;

Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   16/30
Пример подмены модуля LWP IV
               }
      );

     # g e t o u r w r a p p e r o b j e c t and memcached c o n n e c t i o n
     my $mem_wrap = new_ok ( $_ , [ s e r v e r => $ s e r v e r ] ) ;
     my $memcached = new Cache : : Memcached : : F a s t (
          { s e r v e r s => [ { a d d r e s s => $ s e r v e r } , ] , } ) ;

     # check s e t
     $mem_wrap−>s e t _ v a l u e ( $key , $ n e w v a l u e ) ;
     i s ( $memcached−>g e t ( $ key ) , $n e w v a l u e ,
           ’ s e t _ v a l u e must s e t v a l u e i n memcache ’ ) ;


Alexey Shrub, Российские интернет-технологии        Unit testing for Perl        17/30
Нефункциональное тестирование
                                           Автоматизированный code review
                                                     Почему?
                                                      Зачем?




Alexey Shrub, Российские интернет-технологии                   Unit testing for Perl   18/30
Компилируется?

             Test::Strict

     #! / u s r / b i n / p e r l −w
     use s t r i c t ;
     use w a r n i n g s ;
     use T e s t : : More ;
     use T e s t : : S t r i c t ;

      a l l _ p e r l _ f i l e s _ o k ( qw/ l i b t x t / ) ;




Alexey Shrub, Российские интернет-технологии              Unit testing for Perl   19/30
Соответствует соглашению о стиле кодирования?



             Test::EOL
             Test::NoTabs
             Test::PerlTidy




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   20/30
Используются ли рекомендации из Perl Best Practice




             Test::Perl::Critic
             Test::Portability::Files




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   21/30
Не забыли ли чего? (инструменты в больном)




             Test::Fixme
             Test::NoBreakpoints




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   22/30
Метрики в норме?




             Perl::Metrics::Simple




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   23/30
Есть ли документация?



             Test::Pod
             Test::Pod::Coverage
             Test::Spelling




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   24/30
Есть ли нужное количество тестов?




             Test::Strict (Devel::Cover)




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   25/30
Не стал ли код медленнее?




             Test::Timer




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   26/30
Нет ли утечек памяти?




             Test::Weaken




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl   27/30
О чём говорит успешное прохождение таких тестов?

             Код компилируется! Это уже успех!
             Стиль кодирования соответствует заданному!
             Выполняются хотя бы минимальные рекомендации из PBP!
             Доделано всё, о чем были пометки!
             Метрики сложности дают надежду на то, что код можно понять!
             Была попытка написать документацию ко всем методам!
             Есть тесты! И их количество соответствует запланированному!
             Код ещё не самый тормозной!
             Можно надеяться на то, что память не течёт!


Alexey Shrub, Российские интернет-технологии      Unit testing for Perl    28/30
Максимальный набор, все кроме последних двух не зависят от кода, можно
     копипастить и запускать




Alexey Shrub, Российские интернет-технологии   Unit testing for Perl          29/30
Вопросы


                                               QUESTIONS?
     Исходники презентации (LaTeX, Beamer):
     https://github.com/worldmind/perl-unit-testing-presentation-ru.git

     Набор тестов:
     https://github.com/worldmind/perl-test-code-quality-template.git

     Feedback to:
     ashrub@yandex.ru


Alexey Shrub, Российские интернет-технологии          Unit testing for Perl   30/30

Contenu connexe

Tendances

Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Stfalcon Meetups
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.genericsmuqaddas_m
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8chashnikov
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Javametaform
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Anton Arhipov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Нескучное тестирование с pytest
Нескучное тестирование с pytestНескучное тестирование с pytest
Нескучное тестирование с pytestRoman Imankulov
 

Tendances (14)

Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
десант презентация
десант презентациядесант презентация
десант презентация
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Нескучное тестирование с pytest
Нескучное тестирование с pytestНескучное тестирование с pytest
Нескучное тестирование с pytest
 

En vedette

Introduction to Moose
Introduction to MooseIntroduction to Moose
Introduction to Moosethashaa
 
Introduction To Moose
Introduction To MooseIntroduction To Moose
Introduction To MooseMike Whitaker
 
Moose (Perl 5)
Moose (Perl 5)Moose (Perl 5)
Moose (Perl 5)xSawyer
 
Browser sniffing в 21 веке‎
Browser sniffing в 21 веке‎Browser sniffing в 21 веке‎
Browser sniffing в 21 веке‎mayperl
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Andrew Shitov
 
Perl Teach-In (part 2)
Perl Teach-In (part 2)Perl Teach-In (part 2)
Perl Teach-In (part 2)Dave Cross
 
Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎mayperl
 
Another Way to Attack the BLOB: Server-side Access via PL/SQL and Perl
Another Way to Attack the BLOB: Server-side Access via PL/SQL and PerlAnother Way to Attack the BLOB: Server-side Access via PL/SQL and Perl
Another Way to Attack the BLOB: Server-side Access via PL/SQL and PerlRoy Zimmer
 
Simple Photo Processing and Web Display with Perl
Simple Photo Processing and Web Display with PerlSimple Photo Processing and Web Display with Perl
Simple Photo Processing and Web Display with PerlKent Cowgill
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Enterprise Perl
Enterprise PerlEnterprise Perl
Enterprise PerlDave Cross
 
Proud To Use Perl
Proud To Use PerlProud To Use Perl
Proud To Use PerlDave Cross
 
Сравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на PerlСравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на Perlmayperl
 
Building Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::ClientBuilding Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::ClientMike Friedman
 
Building a MongoDB App with Perl
Building a MongoDB App with PerlBuilding a MongoDB App with Perl
Building a MongoDB App with PerlMike Friedman
 
Perl Teach-In (part 1)
Perl Teach-In (part 1)Perl Teach-In (part 1)
Perl Teach-In (part 1)Dave Cross
 
Perl University: Getting Started with Perl
Perl University: Getting Started with PerlPerl University: Getting Started with Perl
Perl University: Getting Started with Perlbrian d foy
 
Linked Lists With Perl: Why bother?
Linked Lists With Perl: Why bother?Linked Lists With Perl: Why bother?
Linked Lists With Perl: Why bother?Workhorse Computing
 

En vedette (20)

Introduction to Moose
Introduction to MooseIntroduction to Moose
Introduction to Moose
 
Introduction To Moose
Introduction To MooseIntroduction To Moose
Introduction To Moose
 
Moose (Perl 5)
Moose (Perl 5)Moose (Perl 5)
Moose (Perl 5)
 
Browser sniffing в 21 веке‎
Browser sniffing в 21 веке‎Browser sniffing в 21 веке‎
Browser sniffing в 21 веке‎
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6
 
Perl Teach-In (part 2)
Perl Teach-In (part 2)Perl Teach-In (part 2)
Perl Teach-In (part 2)
 
Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎
 
Another Way to Attack the BLOB: Server-side Access via PL/SQL and Perl
Another Way to Attack the BLOB: Server-side Access via PL/SQL and PerlAnother Way to Attack the BLOB: Server-side Access via PL/SQL and Perl
Another Way to Attack the BLOB: Server-side Access via PL/SQL and Perl
 
Simple Photo Processing and Web Display with Perl
Simple Photo Processing and Web Display with PerlSimple Photo Processing and Web Display with Perl
Simple Photo Processing and Web Display with Perl
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Enterprise Perl
Enterprise PerlEnterprise Perl
Enterprise Perl
 
Proud To Use Perl
Proud To Use PerlProud To Use Perl
Proud To Use Perl
 
Сравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на PerlСравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на Perl
 
Idiotic Perl
Idiotic PerlIdiotic Perl
Idiotic Perl
 
Building Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::ClientBuilding Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::Client
 
Building a MongoDB App with Perl
Building a MongoDB App with PerlBuilding a MongoDB App with Perl
Building a MongoDB App with Perl
 
Perl Teach-In (part 1)
Perl Teach-In (part 1)Perl Teach-In (part 1)
Perl Teach-In (part 1)
 
Perl & Coding Standards
Perl & Coding StandardsPerl & Coding Standards
Perl & Coding Standards
 
Perl University: Getting Started with Perl
Perl University: Getting Started with PerlPerl University: Getting Started with Perl
Perl University: Getting Started with Perl
 
Linked Lists With Perl: Why bother?
Linked Lists With Perl: Why bother?Linked Lists With Perl: Why bother?
Linked Lists With Perl: Why bother?
 

Similaire à модульное тестирование для Perl. алексей шруб. зал 4

C# Desktop. Занятие 17.
C# Desktop. Занятие 17.C# Desktop. Занятие 17.
C# Desktop. Занятие 17.Igor Shkulipa
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Fwdays
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
O Babel 7 и немного больше, Артем Яворский
O Babel 7 и немного больше, Артем ЯворскийO Babel 7 и немного больше, Артем Яворский
O Babel 7 и немного больше, Артем ЯворскийSigma Software
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirCodeFest
 
Статический анализ кода: современный взгляд
Статический анализ кода: современный взглядСтатический анализ кода: современный взгляд
Статический анализ кода: современный взглядAndrey Karpov
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Pavel Tsukanov
 
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей ВасилийSolit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василийsolit
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
Статический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object ScriptСтатический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object ScriptInterSystems
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Python Meetup
 
Lecture5
Lecture5Lecture5
Lecture5orgil
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Moscow.pm
 
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...lshevtsov
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 

Similaire à модульное тестирование для Perl. алексей шруб. зал 4 (20)

C# Desktop. Занятие 17.
C# Desktop. Занятие 17.C# Desktop. Занятие 17.
C# Desktop. Занятие 17.
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
O Babel 7 и немного больше, Артем Яворский
O Babel 7 и немного больше, Артем ЯворскийO Babel 7 и немного больше, Артем Яворский
O Babel 7 и немного больше, Артем Яворский
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Статический анализ кода: современный взгляд
Статический анализ кода: современный взглядСтатический анализ кода: современный взгляд
Статический анализ кода: современный взгляд
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей ВасилийSolit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
Статический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object ScriptСтатический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object Script
 
About Python
About PythonAbout Python
About Python
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
 
Lecture5
Lecture5Lecture5
Lecture5
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
 
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 

Plus de rit2011

классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2rit2011
 
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2rit2011
 
как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3rit2011
 
классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2rit2011
 
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1rit2011
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....rit2011
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....rit2011
 
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4rit2011
 
I pv6 малоизвестные подробности. андрей пантюхин. зал 2
I pv6   малоизвестные подробности. андрей пантюхин. зал 2I pv6   малоизвестные подробности. андрей пантюхин. зал 2
I pv6 малоизвестные подробности. андрей пантюхин. зал 2rit2011
 
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
безопасность веб приложений сегодня. дмитрий евтеев. зал 4безопасность веб приложений сегодня. дмитрий евтеев. зал 4
безопасность веб приложений сегодня. дмитрий евтеев. зал 4rit2011
 
как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4rit2011
 
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...rit2011
 
выращиваем интерфейс своими руками. ольга павлова. зал 3
выращиваем интерфейс своими руками. ольга павлова. зал 3выращиваем интерфейс своими руками. ольга павлова. зал 3
выращиваем интерфейс своими руками. ольга павлова. зал 3rit2011
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2rit2011
 
от Flash к html5. александр бацуев. зал 4
от Flash к html5. александр бацуев. зал 4от Flash к html5. александр бацуев. зал 4
от Flash к html5. александр бацуев. зал 4rit2011
 
Ie9 и ie10. алекс могилевский. зал 2
Ie9 и ie10. алекс могилевский. зал 2Ie9 и ie10. алекс могилевский. зал 2
Ie9 и ie10. алекс могилевский. зал 2rit2011
 
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...rit2011
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...rit2011
 
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...rit2011
 
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2rit2011
 

Plus de rit2011 (20)

классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2
 
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
 
как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3
 
классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2
 
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
 
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
 
I pv6 малоизвестные подробности. андрей пантюхин. зал 2
I pv6   малоизвестные подробности. андрей пантюхин. зал 2I pv6   малоизвестные подробности. андрей пантюхин. зал 2
I pv6 малоизвестные подробности. андрей пантюхин. зал 2
 
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
безопасность веб приложений сегодня. дмитрий евтеев. зал 4безопасность веб приложений сегодня. дмитрий евтеев. зал 4
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
 
как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4
 
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
 
выращиваем интерфейс своими руками. ольга павлова. зал 3
выращиваем интерфейс своими руками. ольга павлова. зал 3выращиваем интерфейс своими руками. ольга павлова. зал 3
выращиваем интерфейс своими руками. ольга павлова. зал 3
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
 
от Flash к html5. александр бацуев. зал 4
от Flash к html5. александр бацуев. зал 4от Flash к html5. александр бацуев. зал 4
от Flash к html5. александр бацуев. зал 4
 
Ie9 и ie10. алекс могилевский. зал 2
Ie9 и ie10. алекс могилевский. зал 2Ie9 и ie10. алекс могилевский. зал 2
Ie9 и ie10. алекс могилевский. зал 2
 
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
 
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
 

модульное тестирование для Perl. алексей шруб. зал 4

  • 1. Unit testing for Perl Alexey Shrub Российские интернет-технологии 2011-04-26 Alexey Shrub, Российские интернет-технологии Unit testing for Perl 1/30
  • 2. Модульное тестирование Автоматизированное. Изолированное. Alexey Shrub, Российские интернет-технологии Unit testing for Perl 2/30
  • 3. Зачем нужны модульные тесты Необходимая верификация (+ двойная запись). Alexey Shrub, Российские интернет-технологии Unit testing for Perl 3/30
  • 4. Зачем нужны модульные тесты Необходимая верификация (+ двойная запись). Борьба с ростом энтропии (регрессом) при изменениях (= легкость рефакторинга). Alexey Shrub, Российские интернет-технологии Unit testing for Perl 3/30
  • 5. Зачем нужны модульные тесты Необходимая верификация (+ двойная запись). Борьба с ростом энтропии (регрессом) при изменениях (= легкость рефакторинга). Локализация ошибок (в отличие от интеграционных). Alexey Shrub, Российские интернет-технологии Unit testing for Perl 3/30
  • 6. Зачем нужны модульные тесты Необходимая верификация (+ двойная запись). Борьба с ростом энтропии (регрессом) при изменениях (= легкость рефакторинга). Локализация ошибок (в отличие от интеграционных). Раннее обнаружение ошибок (чем раньше, тем дешевле исправление ошибки). Alexey Shrub, Российские интернет-технологии Unit testing for Perl 3/30
  • 7. Зачем нужны модульные тесты Необходимая верификация (+ двойная запись). Борьба с ростом энтропии (регрессом) при изменениях (= легкость рефакторинга). Локализация ошибок (в отличие от интеграционных). Раннее обнаружение ошибок (чем раньше, тем дешевле исправление ошибки). Раннее обнаружение неудобного интерфейса. Alexey Shrub, Российские интернет-технологии Unit testing for Perl 3/30
  • 8. Зачем нужны модульные тесты Необходимая верификация (+ двойная запись). Борьба с ростом энтропии (регрессом) при изменениях (= легкость рефакторинга). Локализация ошибок (в отличие от интеграционных). Раннее обнаружение ошибок (чем раньше, тем дешевле исправление ошибки). Раннее обнаружение неудобного интерфейса. Документация. Alexey Shrub, Российские интернет-технологии Unit testing for Perl 3/30
  • 9. Стандартные отмазки нежелающих писать тесты Нет времени. Код нетестируемый. Не умею и боюсь, у меня и без тестов вроде/должно работать. Alexey Shrub, Российские интернет-технологии Unit testing for Perl 4/30
  • 10. Тесты в Perl. Функциональное тестирование Alexey Shrub, Российские интернет-технологии Unit testing for Perl 5/30
  • 11. use Test::More; Базовые функции ok is new_ok is_deeply ... Диагностика (diag/explain): i s _ d e e p l y ( $got , $ e x p e c t e d , ’ R e s u l t must be . . . ’ ) or diag e x p l a i n $got ; Alexey Shrub, Российские интернет-технологии Unit testing for Perl 6/30
  • 12. Минимальный пример Пример положительного функционального теста #! / u s r / b i n / p e r l −w use s t r i c t ; use T e s t : : More t e s t s => 1 ; use E m a i l : : V a l i d ; my $ e m a i l = ’ w o r l d . mind@yahoo . com ’ ; my $ e x p e c t e d = $ e m a i l ; my $ g o t = E m a i l : : V a l i d −>a d d r e s s ( $ e m a i l ) ; i s ( $got , $ e x p e c t e d , " $ e m a i l must be v a l i d " ) ; Alexey Shrub, Российские интернет-технологии Unit testing for Perl 7/30
  • 13. Запуск одного теста TAP - Test Anything Protocol Run test $ perl t/simple-test.t 1..1 ok 1 - world.mind@yahoo.com must be valid Alexey Shrub, Российские интернет-технологии Unit testing for Perl 8/30
  • 14. Запуск набора тестов Run tests with Test:Harness $ prove t/simple-test.t .. ok t/use.t .......... ok All tests successful. Files=2, Tests=2, 1 wallclock secs ( 0.02 usr 0.01 sys + 0.14 cusr Result: PASS Makefile - бывает удобнее Alexey Shrub, Российские интернет-технологии Unit testing for Perl 9/30
  • 15. Тестирование исключений Test::Exception #! / u s r / b i n / p e r l −w use s t r i c t ; use F a t a l qw( open c l o s e ) ; use T e s t : : More t e s t s => 1 ; use T e s t : : E x c e p t i o n ; my $ f i l e n a m e = ’ t h e _ n o t _ e x i s t e d _ f i l e ’ ; throws_ok { open (my $fh , "<" , $ f i l e n a m e ) } q r /No s u c h f i l e / , ’ open ( ) w i t h bad f i l e name must throw e x c e p t i o n ’ ; Alexey Shrub, Российские интернет-технологии Unit testing for Perl 10/30
  • 16. Генерация входных данных Test::LectroTest::Compat #! / u s r / b i n / p e r l −w use s t r i c t ; use T e s t : : More t e s t s => 1 ; use T e s t : : L e c t r o T e s t : : Compat ; my $ p r o p _ n o n n e g a t i v e = P r o p e r t y { ##[ x <− I n t ]## cmp_ok ( abs ( $x ) , ’>= ’ , 0 ) ; } , name => " a b s o u t p u t must be non− n e g a t i v e " ; holds ( $prop_nonnegative ) ; Alexey Shrub, Российские интернет-технологии Unit testing for Perl 11/30
  • 17. Что делать, если модуль взаимодействует с внешним миром? Пишет/читает базу. Обращается к web страницам/скриптам. Пишет/читает memcache. Вызывает SOAP/XML-RPC сервисы. и т.п. ? Alexey Shrub, Российские интернет-технологии Unit testing for Perl 12/30
  • 18. Mock/Stub/Fake Mock модули общего назначения Test::MockObject Test::MockModule Test::MockClass Специализированные DBD::Mock Test::Mock::LWP Cache::Memcached::Mock и т.п. Alexey Shrub, Российские интернет-технологии Unit testing for Perl 13/30
  • 19. Пример подмены модуля LWP I #! / u s r / b i n / p e r l −w use s t r i c t ; use T e s t : : More t e s t s => 3 ; use T e s t : : MockObject ; use Cache : : Memcached : : F a s t ; use l i b qw( l i b ) ; my $server = ’ l o c a l h o s t :11211 ’ ; my $key = ’ mykey ’ ; my $value = ’ value ’ ; my $newvalue = ’ newvalue ’ ; BEGIN { Alexey Shrub, Российские интернет-технологии Unit testing for Perl 14/30
  • 20. Пример подмены модуля LWP II $_ = ’ MyMemcacheWrapper ’ ; use_ok ( $_ ) ; } # moking Cache : : Memcached : : F a s t my $memc_mock = T e s t : : MockObject −>new ( ) ; T e s t : : MockObject −>fake_module ( ’ Cache : : Memcached : : F a s t ’ , new => sub { $memc_mock } ) ; my $memcache = { $key , $ v a l u e , }; Alexey Shrub, Российские интернет-технологии Unit testing for Perl 15/30
  • 21. Пример подмены модуля LWP III $memc_mock−>mock ( ’ get ’ , sub { my ( $ s e l f , $ ke y ) = @_; return $memcache −>{$ ke y } ; } ); $memc_mock−>mock ( ’ set ’ , sub { my ( $ s e l f , $key , $ v a l u e ) = @_; $memcache −>{$ ke y } = $ v a l u e ; Alexey Shrub, Российские интернет-технологии Unit testing for Perl 16/30
  • 22. Пример подмены модуля LWP IV } ); # g e t o u r w r a p p e r o b j e c t and memcached c o n n e c t i o n my $mem_wrap = new_ok ( $_ , [ s e r v e r => $ s e r v e r ] ) ; my $memcached = new Cache : : Memcached : : F a s t ( { s e r v e r s => [ { a d d r e s s => $ s e r v e r } , ] , } ) ; # check s e t $mem_wrap−>s e t _ v a l u e ( $key , $ n e w v a l u e ) ; i s ( $memcached−>g e t ( $ key ) , $n e w v a l u e , ’ s e t _ v a l u e must s e t v a l u e i n memcache ’ ) ; Alexey Shrub, Российские интернет-технологии Unit testing for Perl 17/30
  • 23. Нефункциональное тестирование Автоматизированный code review Почему? Зачем? Alexey Shrub, Российские интернет-технологии Unit testing for Perl 18/30
  • 24. Компилируется? Test::Strict #! / u s r / b i n / p e r l −w use s t r i c t ; use w a r n i n g s ; use T e s t : : More ; use T e s t : : S t r i c t ; a l l _ p e r l _ f i l e s _ o k ( qw/ l i b t x t / ) ; Alexey Shrub, Российские интернет-технологии Unit testing for Perl 19/30
  • 25. Соответствует соглашению о стиле кодирования? Test::EOL Test::NoTabs Test::PerlTidy Alexey Shrub, Российские интернет-технологии Unit testing for Perl 20/30
  • 26. Используются ли рекомендации из Perl Best Practice Test::Perl::Critic Test::Portability::Files Alexey Shrub, Российские интернет-технологии Unit testing for Perl 21/30
  • 27. Не забыли ли чего? (инструменты в больном) Test::Fixme Test::NoBreakpoints Alexey Shrub, Российские интернет-технологии Unit testing for Perl 22/30
  • 28. Метрики в норме? Perl::Metrics::Simple Alexey Shrub, Российские интернет-технологии Unit testing for Perl 23/30
  • 29. Есть ли документация? Test::Pod Test::Pod::Coverage Test::Spelling Alexey Shrub, Российские интернет-технологии Unit testing for Perl 24/30
  • 30. Есть ли нужное количество тестов? Test::Strict (Devel::Cover) Alexey Shrub, Российские интернет-технологии Unit testing for Perl 25/30
  • 31. Не стал ли код медленнее? Test::Timer Alexey Shrub, Российские интернет-технологии Unit testing for Perl 26/30
  • 32. Нет ли утечек памяти? Test::Weaken Alexey Shrub, Российские интернет-технологии Unit testing for Perl 27/30
  • 33. О чём говорит успешное прохождение таких тестов? Код компилируется! Это уже успех! Стиль кодирования соответствует заданному! Выполняются хотя бы минимальные рекомендации из PBP! Доделано всё, о чем были пометки! Метрики сложности дают надежду на то, что код можно понять! Была попытка написать документацию ко всем методам! Есть тесты! И их количество соответствует запланированному! Код ещё не самый тормозной! Можно надеяться на то, что память не течёт! Alexey Shrub, Российские интернет-технологии Unit testing for Perl 28/30
  • 34. Максимальный набор, все кроме последних двух не зависят от кода, можно копипастить и запускать Alexey Shrub, Российские интернет-технологии Unit testing for Perl 29/30
  • 35. Вопросы QUESTIONS? Исходники презентации (LaTeX, Beamer): https://github.com/worldmind/perl-unit-testing-presentation-ru.git Набор тестов: https://github.com/worldmind/perl-test-code-quality-template.git Feedback to: ashrub@yandex.ru Alexey Shrub, Российские интернет-технологии Unit testing for Perl 30/30