SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Михаил Давыдов — 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 Teplyakov
Alex Tumanoff
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
metaform
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 

Was ist angesagt? (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
 

Andere mochten auch

Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎
mayperl
 
Сравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на PerlСравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на Perl
mayperl
 

Andere mochten auch (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?
 

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

Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"
Fwdays
 
Статический анализ кода: современный взгляд
Статический анализ кода: современный взглядСтатический анализ кода: современный взгляд
Статический анализ кода: современный взгляд
Andrey Karpov
 
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей ВасилийSolit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
solit
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
guest32215a
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
Lecture5
Lecture5Lecture5
Lecture5
orgil
 
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
lshevtsov
 

Ähnlich wie модульное тестирование для 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...
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 

Mehr von rit2011

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

Mehr von 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
 

Kürzlich hochgeladen

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 

Kürzlich hochgeladen (9)

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 

модульное тестирование для 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