[[oktatas:programozás:perl|< Perl]] ====== Perl teszt ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2015 * Licenc: GNU Free Documentation License 1.3 * Web: http://szit.hu ===== Az egységtesztekről ===== Az egységtesztekkel függvényeket, modulokat, utasítások sikeres vagy sikertelen végrehajtását tesztelünk. Azt vizsgáljuk, hogy a kívánt eredményt adja-e az adott függvény, vagy éppen adott modul be van-e töltve, adott változó a kívánt értéket tartalmazza. A teszteléshez többféle Modul áll rendelkezésre. Ha egy modul függvényeit teszteljük, azt egy külön programban célszerű megtenni. Így függetlenül fejlődhet a teszt és az ipari kód. ===== Tesztmodulok ===== * [[http://search.cpan.org/~exodist/Test-Exception-0.40/lib/Test/Exception.pm|Test::Exception]] * [[http://search.cpan.org/~exodist/Test-Simple-1.001014/lib/Test/Simple.pm|Test::Simple]] * [[http://search.cpan.org/~exodist/Test-Simple-1.001014/lib/Test/More.pm|Test::More]] ===== A Test::More ===== A use deklarációnál megtervezhetjük hány darab tesztet szeretnénk írni. use Test::More tests => 15; Ha szeretnénk átugrani teszteket: use Test::More skip_all => $skip_reason; A tervezett tesztek száma, később is megadható: use Test::More; done_testing( 5 ); A plan() függvény is használható: use Test::More; plan tests => 5; A tesztek mindig kiírják, hogy "ok" vagy "not ok" egy teszt. Ez után a teszt sorszámát írja képernyőre: ok 3 not ok 4 ok 5 A teszteket el is nevezhetjük 1..5 ok 1 - require Haromszog; ok 2 - területszámítás ok 3 - területszámítás ok 4 - kerületszámítás ok 5 - kerületszámítás $kerulet = 0; ok( $kerulet > 0, "Az alap nagyobb mint 0 vizsgálat"); Ha az eredmény csak 105 lehet: is( szamitKerulet(30, 35, 40), 105, "kerületszámítás vizsgálat" ); Ha az eredmény nem lehet 0: isnt( szamitKerulet(30, 35, 40), 0, "kerületszámítás" ); Szabályos kifejezés használata: like($nev, qr/Nagy/, "Nagy vezetéknév vizsgálata"); Azokat keressük, akik nem Nagyok: unlike($nev, qr/Nagy/, "Nem Nagy vezetéknevüek vizsgálata"); Két érték összehasonlítása: cmp_ok( $amitKaptam, $ezKelleneLegyen, $elvartErtek, $tesztNev ); Egy adott modul, azon belül, egy adott függvény elérhető? can_ok(Haromszog, "szamitKerulet"); Metódusok tömbjét is vizsgálhatjuk: @metodusok = ("szamitKerulet", "szamitTerulet"); foreach my $metodus (@metodusok) { can_ok('Haromszog', $metodus); } #!/usr/bin/env perl package Haromszog; use Exporter; use vars qw($VERSION @ISA @EXPORT); $VERSION = '1.00'; @ISA = qw(Exporter); @EXPORT = qw(szamitTerulet szamitKerulet); sub szamitTerulet { ($alap, $magassag) = @_; $terulet = ($alap * $magassag) / 2.0; return $terulet; } sub szamitKerulet { ($a, $b, $c) = @_; $kerulet = $a + $b + $c; return $kerulet; } 1; #!/usr/bin/env perl use Haromszog; use Test::More tests => 5; require_ok( 'Haromszog' ); is( szamitTerulet(30, 35), 525, "területszámítás" ); is( szamitTerulet(130, 140), 9100, "területszámítás" ); is( szamitKerulet(30, 35, 40), 105, "kerületszámítás" ); is( szamitKerulet(130, 140, 150), 420, "kerületszámítás" ); ===== A Test::More folytatása ===== ==== isa_ok() ==== Megvizsgálhatjuk, hogy adott objektum, adott osztályból, van-e származtatva. isa_ok($mari, 'Mernok', "A mari objektum a Mernok osztályból"); Teljes kód: #!/usr/bin/env perl package Dolgozo; sub new { my $class = shift; my $self = { _nev => shift, _szuletes => shift, _fizetes => shift, }; bless $self, $class; return $self; } sub lekerNev { my( $self) = @_; return $self->{_nev}; } sub beallitNev { my ( $self, $nev ) = @_; $self->{_nev} = $nev if defined($nev); } package Mernok; our @ISA = qw(Dolgozo); sub new { my($class) = @_; my $self = $class->SUPER::new(@_[1], @_[2], @_[3]); $self->{_diploma} = undef; bless $self, $class; return $self; } sub beallitDiploma { my ( $self, $diploma ) = @_; $self->{_diploma} = $diploma if defined($diploma); } sub lekerDiploma { my( $self) = @_; return $self->{_diploma}; } package main; use Test::More; $mari = new Mernok( "Piros Mária", "1985-06-01", 870000); $mari->beallitDiploma("ABE34224"); print $mari->lekerNev()."\n"; print "Diploma száma: ".$mari->lekerDiploma() . "\n"; isa_ok($mari, 'Mernok', "A mari objektum a Mernok osztályból"); done_testing(); ==== new_ok() ==== A Mernok osztályból származtatás rendben? my $kati = new_ok(Mernok); ==== Altesztek futtatása ==== #!/usr/bin/env perl use Test::More; pass("Első teszt"); pass("Második teszt"); subtest 'Altesztpélda' => sub { plan tests => 3; pass("Első alteszt"); pass("Második alteszt"); pass("Harmadik alteszt"); }; pass("Negyedik teszt"); done_testing(); ==== A pass() és a fail() ==== Néha szeretnénk csak úgy hibás vagy sikeres teszteredményt viszontlátni a képernyőn. Erre való a fail(), pass() páros. pass("Első teszt); fail("Második teszt"); Ezek tulajdonképpen a ok(1) és ok(0) szinonimái. ==== Modulok tesztelése ==== Szeretnénk ellenőrizni, hogy egy modul betöltődött-e. Erre a require_ok() és a use_ok() függvények adnak lehetőséget. # szükséges modul: Valami::Modul require_ok "Valami::Modul"; # szükséges fájl "valami/fajl.pl"; require_ok "valami/fajl.pl"; A use_ok csak modulok tesztelésre való. BEGIN { use_ok('Valami::Modul', qw(egy ketto)) } BEGIN { use_ok('Valami::Modul') }