Scripts Perfectes

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ó

Pasos

  1. Crea l'espai per desenvolupar
    1. Configura l'entorn
  2. Escriu els Tests
  3. Escriu el codi
    1. Arguments
    2. Codi d'alt nivell
    3. Codi de baix nivell
  4. Executa els Tests
  5. Instal.lació
    1. Documentació

Tests Avançats

  1. Saltar Tests
  2. Comparació de text

Conclusions


  1. Crea l'espai
  2. 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.

  3. Tests
  4. 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.

  5. Escriu el codi
  6. 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;
     
    

  7. Verifica el codi
  8. 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.

  9. Instal.lació
  10. Pots instal.lar el script amb la següent comanda des de root:

    root@pillastre:~/src/gesal/Gesal-ruperta # make install


Tests Avançats

  1. Base de Dades i Saltar Tests
  2. 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 }
    

  3. Comparació de Textes
  4. 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";
    

Conclusions