[[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') }