Francesc Guasch Ortiz
Fer scripts amb tests d'integració automatitzats no ha de significar més feina que fer un script i anar provant que tot funcioni. Amb aquests truquillus podràs millorar la qualitat del teu codi i arribar a la perfecció.
Per fer aixó cal tenir el script en un directori personal, on amés hi afegim algun arxiu més que és necessari per fer els tests. Un cop tot funcioni el propi entorn ens facilita la instal.lació
Cada script ha d'estar en un directori on es guarden tots els seus components: el script, els mòduls, els tests, i els arxius de suport. Dins el projecte gesal, on ja tinc altres coses, afegiré un nou script que es dirà ruperta. Aquest procés el farem fàcilment executant l'eina de perl h2xs.
frankie@pillastre:~ $ cd src frankie@pillastre:~/src $/gesal/ frankie@pillastre:~/src/gesal$ h2xs -X -b 5.6.1 -n Gesal::ruperta
Si és queixa del -b 5.6.1 és que tens una versió de perl molt antiga, executa la comanda sense -X 5.6.1.
Wooaah, ens ha creat molts arxius i jo només volia fer un scriptillo petitó. Anem a veure per que serveixen tots aquests arxius, la majoría són opcionals i no cal que els modifiquis.
Arxiu | Descripció |
Gesal-ruperta/lib/Gesal/ruperta.pm | Aquí van les funcions del script. |
Gesal-ruperta/Makefile.PL | Arxiu de configuració avançada ( el veurem més tard) |
Gesal-ruperta/README | Pots afegir aquí comentaris |
Gesal-ruperta/t/Gesal-ruperta.t | Aquí hi escriuràs els tests |
Gesal-ruperta/Changes | Arxiu on pots descriure els canvis que hi vas fent al script. |
Gesal-ruperta/MANIFEST | Llistat d'arxius que formen el script. |
Si vols, pots ajustar alguns paràmetres de configuració editant l'arxiu Makefile.PL. Com a mínim cal que afegeixis el nom del script.
AUTHOR => \'Francesc Guasch\') : ()), EXE_FILES => [\'scripts/ruperta.pl\'],
Les funcions no són gaire complicades, anem a fer tests que es el que voliem. Cal editar l'arxiu de tests generat. Veuràs que ja t'ha fet un test, el que comprova que el mòdul es carregui bé. Afegim comprovacions per les funcions a l'arxiu t/Gesal-ruperta.t:
use Test;
BEGIN { plan tests => 3 };
use Gesal::ruperta;
ok(1); # If we made it this far, we\'re ok.
#########################
# Insert your test code below, the Test::More module is use()ed here so read
# its man page ( perldoc Test::More ) for help writing this test script.
ok(fes_aixo() eq "soc aixo");
ok(fes_allo("hola") eq "allo ha rebut hola");
Amb això tenim un arxiu amb 3 tests, podem afegir els que volguem o crear més arxius amb altres proves. Només cal que estiguin dins el directori t i que el nom acabi en .t.
Caldrà crear el directori i fer el script:
frankie@pillastre:~/src/gesal/Gesal-ruperta $ mkdir scripts frankie@pillastre:~/src/gesal/Gesal-ruperta $ gvim scripts/ruperta.pl
L'arxiu hauria de començar per :
#!/usr/bin/perl -w use strict; use Gesal::ruperta;
Això és opcional, però es probable que volguis afegir arguments al script. Com a mínim una ajuda i versió:
use Getopt::Long; # Globals my $DEBUG = 0; sub opcions { my $me = $0; $me =~ s#.*/##; my $usage="$me [--debug] [--version] [--help]"; my ($help,$version); GetOptions( help => \$help, debug => \$DEBUG, version => \$version ); if ($help) { print "$usage\n"; exit; } if ($version) { print "$me v$Gesal::ruperta::VERSION\n"; exit; } }
Oju!, la major part del codi no s'ha d'escriure a l'arxiu del script sino a l'arxiu .pm. Dins el script hi haurà crides a funcions que estàn al .pm.
Per exemple: en funció d'un paràmetre cridem a una funció o a una altre.
Abans d'editar el .pm tornem al que ja hem escrit i afegim uns paràmetres. Torna a editar el script:
# Globals my ($DEBUG,$AIXO,$ALLO) = (0); sub opcions { my $me = $0; $me =~ s#.*/##; my $usage="$me [--debug] [--version] [--help] [--aixo] [--allo=\"un text\"]"; my ($help,$version); GetOptions( help => \$help, debug => \$DEBUG, version => \$version, aixo => \$AIXO, \'allo=s\' => \$ALLO, );
Després, al final de tot hi afegim les crides. Fixa't que el paràmetre allo pot tenir un valor que ens diu l'usuari i que enviem a la subrutina.
##################################################################### opcions(); print fes_aixo(),"\n" if $AIXO; print fes_allo($ALLO),"\n" if $ALLO;
Si vols saber més sobre el pas de paràmetres pots fer:
perldoc Getopt::Long
El codi de veritat ha d'anar dins l'arxiu .pm, si l'edites veuràs que ja tens l'arxiu preparat per que puguis afegir-hi coses. Hi escriurem els noms de les funcions que volem exportar a l'arxiu lib/Gesal/ruperta.pm:
@EXPORT = qw( fes_aixo fes_allo );
Dins el codi podem fer més funcions internes, però no les escriurem al export si no cal que s'executin des d'alt nivell.
Mourem les marques de final de codi al final de l'arxiu. Les linies amb el 1; i el __END__ esborra-les i afegeix-les al final.
# Autoload methods go after =cut, and are processed by the autosplit program. 1; __END__
Ha d'anar al final:
it under the same terms as Perl itself, either Perl version 5.8.4 or, at your option, any later version of Perl 5 you may have available. =cut 1; __END__
Escribim el codi de les funcions. Veuràs que hi ha espais preparats per la documentació, el que no facis servir esborra-ho.
=head2 EXPORT Exportem les funcions fes_aixo i fes_allo =head1 FUNCIONS =head2 fes_aixo Retorna la frase "soc aixo" =cut sub fes_aixo { return "soc aixo" } =head2 fes_allo Retorna la frase "allo ha rebut " i el text que se li passa com paràmetre =cut sub fes_allo { my $text = shift; return "allo ha rebut $text"; }
Ara ho tenim tot escrit. Cal que executis aquesta comanda el primer cop, quan modifiquis l'arxiu perl Makefile.PL o si fas un make clean:
frankie@pillastre:~/src/gesal/Gesal-ruperta $ perl Makefile.PL
Per executar els tests fes:
frankie@pillastre:~/src/gesal/Gesal-ruperta $ make test t/Gesal-ruperta....ok All tests successful. Files=1, Tests=3, 0 wallclock secs ( 0.01 cusr + 0.00 csys = 0.01 CPU)')
A la sortida em diu que ha executat els 3 tests i han funcionat correctament Felicitats!
Ara, cada vegada que facis algun canvi en el mòdul, pots verificar
que tot funciona correctament fent un make test.
Pots instal.lar el script amb la següent comanda des de root:
root@pillastre:~/src/gesal/Gesal-ruperta # make install
Ara que ho penso, hem escrit una mica de documentació dins el codi, la pots veure si executes:
$ perldoc lib/Gesal/ruperta.pm
I un cop el script estiguin instal.lats al sistema, qualsevol usuari podrà veure la documentació fent:
$ perldoc Gesal::ruperta
Aquest test requereix una base de dades per funcionar. Si no hi pot accedir salta (skips) el test.
my $dbh; SKIP: { eval { $dbh = DBI->connect("DBI:mysql:test",undef,undef ,{RaiseError => 1, PrintError => 1}); $dbh->do( "CREATE table ruperta (id int auto_increment primary key ". " ,nom char(20) not null)"); $dbh->do("INSERT INTO ruperta (id,nom) values(1,'pepito')"); }; if ($@) { skip "skipping: $@\n" => 2;exit } ok(fes_busqueda($dbh,1) eq 'pepito'); eval { fes_busqueda($dbh,2) }; ok( $@ =~ /^ERROR: No existeix id=2/) or warn $@; } END { $dbh->do("DROP table ruperta") if defined $dbh }
En aquest exemple fem servir Text::Diff per comparar el resultat dels tests.
BEGIN { plan tests => 1 }; use Gesal::ruperta; use Text::Diff; use strict; my $text_esperat=<diff(\$text_esperat,\$text_obtingut); ok(!$diff) or warn "$diff\n";