320 likes | 447 Views
TestCover. Introductie in Test::More en Devel::Cover. use Workshop::Perl::Dutch 2; date( ‘2005-02-25’ ); author( abeltje => ‘Abe Timmerman’ );. Gang van zaken. Documentatie Broncode Eerste tests Meer tests Dekking van de tests Meer tests Meer dekking. Serialize::Hash (doc1). NAME
E N D
TestCover Introductie in Test::More en Devel::Cover use Workshop::Perl::Dutch 2; date( ‘2005-02-25’ ); author( abeltje => ‘Abe Timmerman’ ); TestCover/abeltje
Gang van zaken • Documentatie • Broncode • Eerste tests • Meer tests • Dekking van de tests • Meer tests • Meer dekking TestCover/abeltje
Serialize::Hash (doc1) NAME Serialize::Hash - Een OO module om gegevens in een hash te serialiseren SYNOPSIS use Serialize::Hash; my %persoon = ( vnaam => 'Piet', mnaam => 'de', anaam => 'Vries' ); my $naam = Serialize::Hash->new( keys => [qw( vnaam mnaam anaam )], data => \%persoon ); printf "Naam is: '%s'\n", $naam->serialize; $naam->keys(qw( anaam vnaam mnaam )); printf "Naam is: '%s'\n", $naam->serialize; TestCover/abeltje
Serialize::Hash (doc2) Serialize::Hash->new( %options ) De contructor heeft drie mogelijke argumenten: keys => \@fieldlist (verplicht) Een arrayref met de key-namen uit de data-hash in de volgorde waarin ze aan elkaar geplakt moeten worden. Als het "keys" argument niet wordt meegegeven, zal de constructor de uitvoer van het programma stoppen met behulp van "croak()". data => \%data Een hashref die de data bevat. separator => '*separator-string*' Een string die wordt gebruikt om de verschillende delen aan elkaar te plakken. De verstek waarde is een spatie. TestCover/abeltje
Serialize::Hash (doc3) $sh->keys( \@fieldlist ) Met de "keys()" method kan je nieuwe keys of een nieuwe volgorde instellen. Deze method retourneert het vernieuwde object. my $str = $sh->keys( \@newfields )->serialize; Als het argument niet een arrayref is, zal de method de uitvoer van het programma stoppen met behulp van "croak()". $sh->data( \%data ) Met de "data()" method kan je nieuwe data aan het object toe kennen. Deze method retourneert het vernieuwde object. my $str = $sh->keys( \%data )->serialize; Als het argument niet een hashref is, zal de method de uitvoer van het programma stoppen met behulp van "croak()". TestCover/abeltje
Serialize::Hash (doc4) $sh->separator( $sep ) Met de "separator()" method kan je een nieuwe scheidings-string instellen of opvragen. Deze method retourneert het vernieuwde object als een waarde werd meegegeven anders de waarde van de scheidings-string. my $sep = $sh->separator; my $str = $sh->separator( '.' )->serialize; $sh->serialize De "serialize()" method zal alle (aanwezige) waarden die bij de gedefinieerde keys horen aan elkaar plakken met de scheidings-string er tussen. TestCover/abeltje
Serialize::Hash (src1) sub keys { my $self = shift; croak "Usage: \$sh->keys( \\\@keys )" unless ref $_[0] eq 'ARRAY'; $self->{_keys} = shift; return $self; } sub data { my $self = shift; croak "Usage: \$sh->data( \\\%data )" unless ref $_[0] eq 'HASH'; $self->{_data} = shift; return $self; } TestCover/abeltje
Serialize::Hash (src2) sub separator { my $self = shift; return $self->{_sep} unless @_; $self->{_sep} = shift; return $self; } sub serialize { my $self = shift; my $data = $self->{_data}; my @vals = map $data->{ $_ } => grep exists $data->{ $_ } && $data->{ $_ } => @{ $self->{_keys} }; return join $self->{_sep}, @vals; } TestCover/abeltje
Serialize::Hash (src3) sub new { my $class = shift; my %opt = @_; croak "Usage: Serialize::Hash->new( keys => \\\@keys )" unless exists $opt{keys}; my $self = bless {}, $class; for my $item (qw( keys data separator )) { next unless exists $opt{ $item }; $self->$item( $opt{ $item } ); } return $self; } TestCover/abeltje
Perl test framework • Eenvoudig te begrijpen • Een test slaagt of niet • Slaagt melding: ok # • Slaagt niet melding: not ok # • Test::More • Defacto standaard • Test::Harness / prove • Rapportage van gerunde tests TestCover/abeltje
Test::More • Telt zelf de tests • Eenvoudige functies • ok() • is() • is_deeply() • like() • use_ok() • isa_ok() TestCover/abeltje
Eerste tests #! perl -w use strict; use Test::More 'no_plan'; use_ok 'Serialize::Hash'; { my %persoon = ( vnaam => 'Piet', mnaam => 'de', anaam=> 'Vries' ); my $sh = Serialize::Hash->new( keys => [qw( vnaam mnaam anaam )], data => \%persoon, ); isa_ok $sh, 'Serialize::Hash'; is $sh->serialize, 'Piet de Vries', "Voorbeeld uit de documentatie"; is $sh->keys( [qw( anaam vnaam mnaam )] )->serialize, 'Vries Piet de', "Nieuwe volgorde"; } TestCover/abeltje
Demorun prove stage1/t/basic.t TestCover/abeltje
Serialize::Hash (src4) sub new { my $class = shift; my %opt = @_; croak "Usage: Serialize::Hash->new( keys => \\\@keys )" unless exists $opt{keys}; my $self = bless {}, $class; for my $item (qw( keys data separator )) { next unless exists $opt{ $item }; $self->$item( $opt{ $item } ); } $self->{_sep} = " " unless exists $self->{_sep}; return $self; } TestCover/abeltje
Demorun prove stage2/t/basic.t TestCover/abeltje
Meer tests { my $sh = Serialize::Hash->new( keys => [qw( vnaam mnaam anaam )] ); isa_ok $sh, 'Serialize::Hash'; { my $new_sh = $sh->data( {vnaam => 'Abe', anaam => 'Timmerman'} ); isa_ok $new_sh, 'Serialize::Hash'; is_deeply $new_sh, $sh, "Zelfde objecten"; my $str1 = $sh->serialize; is $str1, 'Abe Timmerman', "\$sh->serialize"; is $new_sh->serialize, $str1, "\$new_sh->serialize eq \$sh->serialize"; } { is $sh->separator, ' ', "Scheidingsteken"; my $new_sh = $sh->separator( '.' ); isa_ok $new_sh, 'Serialize::Hash'; is $sh->serialize, 'Abe.Timmerman', "Nieuw scheidingsteken"; } } TestCover/abeltje
Demorun prove stage2/t/*.t TestCover/abeltje
Dekking van testcode • Devel::Cover • stmt: statement coverage • branch: takken • if, unless, ?: • cond: condities • &&, || • Rapport in HTML TestCover/abeltje
Genereren van dekkings data • cover -delete • Oude data verwijderen • HARNESS_PERL_SWITCHES=-MDevel::Cover prove -l t/*.t • Voer de tests uit en verzamel dekkings data • cover • Maak het rapport TestCover/abeltje
Demorun coverage stage2/t/*.t TestCover/abeltje
Nog meer tests (1) { my $sh = Serialize::Hash->new( keys => [qw( vnaam mnaam anaam )], data => {vnaam => 'Abe', mnaam => '', anaam => 'Timmerman'}, separator => '*', ); isa_ok $sh, 'Serialize::Hash'; is $sh->serialize, 'Abe*Timmerman', "serialize"; } TestCover/abeltje
Nog meer tests (2) { # croak bij geen keys veld my $sh = eval { Serialize::Hash->new() }; my $err = $@; like $err, qr/Usage:\ Serialize::Hash->new\(\ keys\ =>\ \\\@keys\ \) \s+ at\ .+\ line\ \d+/x, "croak in constructor"; } { # Data not a hashref my $sh = Serialize::Hash->new( keys => [qw( vnaam mnaam anaam )] ); eval { $sh->data( vnaam => 'Abe', anaam => 'Timmerman' ) }; my $err = $@; like $err, qr/Usage:\ \$sh->data\(\ \\\%data\ \) \s+ at\ .+\ line\ \d+/x, "croak in data()"; } { # keys not an arrayhref my $sh = eval { Serialize::Hash->new( keys => qw( vnaam mnaam anaam ) ) }; my $err = $@; like $err, qr/Usage:\ \$sh->keys\(\ \\\@keys\ \) \s+ at\ .+\ line\ \d+/x, "croak in keys()"; } TestCover/abeltje
Demorun coverage stage3/t/*.t TestCover/abeltje
100% dekking niet alles • Nog steeds bugs mogelijk • Geen dekkings data voor regexen • overload TestCover/abeltje
Overload toevoegen package Serialize::Hash; use strict; use warnings; use Carp; use overload '""' => \&serialize, fallback => 1; sub new { TestCover/abeltje
Demorun coverage stage4/t/*.t TestCover/abeltje
Overload tests #! perl use strict; use warnings; use Test::More 'no_plan'; use_ok 'Serialize::Hash'; my $sh = Serialize::Hash->new( keys => [qw( vnaam mnaam anaam )], data => {vnaam => 'Abe', anaam => 'Timmerman'}, ); isa_ok $sh, 'Serialize::Hash'; is $sh, 'Abe Timmerman', "overloaded stringify ($sh)"; TestCover/abeltje
Demorun prove stage4/t/overload/*.t TestCover/abeltje
Vragen? TestCover/abeltje
Dank voor de aandacht TestCover/abeltje
Silly Bonus TestCover/abeltje
Sillyer Bonus TestCover/abeltje