Mi ci è voluto un po 'e mi ci è voluto anche prendere piccoli frammenti da un numero di fonti diverse e fonderli insieme, ma penso di avere un piccolo esempio funzionante che dimostra sufficientemente a un principiante di Perl il processo di compilazione Perl inclusi test di unità e copertura del codice analisi e reportistica. (Sto usando ActiveState ActivePerl v5.10.0 su un PC Windows XP Pro, Module :: Build , Test :: More , Develop :: Cover )
Inizia con una directory per il tuo progetto Perl e poi crea una directory "lib" e una directory "t" nella directory del tuo progetto:
HelloPerlBuildWorld
|
|----------> lib
|
|----------> t
Nella directory "lib", crea un file di testo denominato "HelloPerlBuildWorld.pm". Questo file è il tuo modulo Perl che costruirai e testerai. Incolla il seguente contenuto in questo file:
use strict;
use warnings;
package HelloPerlBuildWorld;
$HelloPerlBuildWorld::VERSION = '0.1';
sub hello {
return "Hello, Perl Build World!";
}
sub bye {
return "Goodbye, cruel world!";
}
sub repeat {
return 1;
}
sub argumentTest {
my ($booleanArg) = @_;
if (!defined($booleanArg)) {
return "null";
}
elsif ($booleanArg eq "false") {
return "false";
}
elsif ($booleanArg eq "true") {
return "true";
}
else {
return "unknown";
}
return "Unreachable code: cannot be covered";
}
1;
Nella directory "t", crea un file di testo denominato "HelloPerlBuildWorld.t". Questo file è il tuo script di unit test che tenterà di testare completamente il tuo modulo Perl sopra. Incolla il seguente contenuto in questo file:
use strict;
use warnings;
use Test::More qw(no_plan);
BEGIN { use_ok('HelloPerlBuildWorld') };
require_ok( 'HelloPerlBuildWorld' );
my $helloCall = HelloPerlBuildWorld::hello();
like($helloCall, qr/Hello, .*World/, "hello() RE test");
is($helloCall, "Hello, Perl Build World!", "hello() IS test");
for (my $ctr=1; $ctr<=10; $ctr++) {
my $repeatCall = HelloPerlBuildWorld::repeat();
is($repeatCall, 1, "repeat() IS test");
}
my $argumentTestCall1 = HelloPerlBuildWorld::argumentTest();
is($argumentTestCall1, "null", "argumentTest() IS null test");
my $argumentTestCall2 = HelloPerlBuildWorld::argumentTest("true");
is($argumentTestCall2, "true", "argumentTest() IS true test");
my $argumentTestCall3 = HelloPerlBuildWorld::argumentTest("false");
is($argumentTestCall3, "false", "argumentTest() IS false test");
my $argumentTestCall4 = HelloPerlBuildWorld::argumentTest(123);
is($argumentTestCall4, "unknown", "argumentTest() IS unknown test");
Ora esegui il backup nella directory del progetto di livello superiore, crea un file di testo denominato "Build.PL". Questo file creerà i tuoi script di build che utilizzerai in seguito. Incolla il seguente contenuto in questo file:
use strict;
use warnings;
use Module::Build;
my $builder = Module::Build->new(
module_name => 'HelloPerlBuildWorld',
license => 'perl',
dist_abstract => 'HelloPerlBuildWorld short description',
dist_author => 'Author Name <email_addy@goes.here>',
build_requires => {
'Test::More' => '0.10',
},
);
$builder->create_build_script();
Sono tutti i file di cui hai bisogno. Ora dalla riga di comando nella directory del progetto di livello superiore, digita il seguente comando:
perl Build.PL
Vedrai qualcosa di simile al seguente:
Checking prerequisites...
Looks good
Creating new 'Build' script for 'HelloPerlBuildWorld' version '0.1'
Ora dovresti essere in grado di eseguire i tuoi unit test con il seguente comando:
Build test
E vedi qualcosa di simile a questo:
Copying lib\HelloPerlBuildWorld.pm -> blib\lib\HelloPerlBuildWorld.pm
t\HelloPerlBuildWorld....ok
All tests successful.
Files=1, Tests=18, 0 wallclock secs ( 0.00 cusr + 0.00 csys = 0.00 CPU)
Per eseguire gli unit test con l'analisi della copertura del codice, prova questo:
Build testcover
E vedrai qualcosa nell'ordine di questo:
t\HelloPerlBuildWorld....ok
All tests successful.
Files=1, Tests=18, 12 wallclock secs ( 0.00 cusr + 0.00 csys = 0.00 CPU)
cover
Reading database from D:/Documents and Settings/LeuchKW/workspace/HelloPerlBuildWorld/cover_db
----------------------------------- ------ ------ ------ ------ ------ ------
File stmt bran cond sub time total
----------------------------------- ------ ------ ------ ------ ------ ------
D:/Perl/lib/ActivePerl/Config.pm 0.0 0.0 0.0 0.0 n/a 0.0
D:/Perl/lib/ActiveState/Path.pm 0.0 0.0 0.0 0.0 n/a 0.0
D:/Perl/lib/AutoLoader.pm 0.0 0.0 0.0 0.0 n/a 0.0
D:/Perl/lib/B.pm 18.6 16.7 13.3 19.2 96.4 17.6
...
[SNIP]
...
D:/Perl/lib/re.pm 0.0 0.0 0.0 0.0 n/a 0.0
D:/Perl/lib/strict.pm 84.6 50.0 50.0 100.0 0.0 73.1
D:/Perl/lib/vars.pm 44.4 36.4 0.0 100.0 0.0 36.2
D:/Perl/lib/warnings.pm 15.3 12.1 0.0 11.1 0.0 12.0
D:/Perl/lib/warnings/register.pm 0.0 0.0 n/a 0.0 n/a 0.0
blib/lib/HelloPerlBuildWorld.pm 87.5 100.0 n/a 83.3 0.0 89.3
Total 9.9 4.6 2.8 11.3 100.0 7.6
----------------------------------- ------ ------ ------ ------ ------ ------
Writing HTML output to D:/Documents and Settings/LeuchKW/workspace/HelloPerlBuildWorld/cover_db/coverage.html ...
done.
(Qualcuno, per favore, mi dica come configurare Cover per ignorare tutte le librerie Perl eccetto e riferirmi semplicemente sul mio singolo file che ho scritto. Non sono riuscito a far funzionare il filtro Cover secondo la documentazione CPAN!)
Ora, se aggiorni la tua directory di primo livello, puoi vedere una nuova sottodirectory chiamata "cover_db". Andare in quella directory e fare doppio clic sul file "coverage.html" per aprire il report sulla copertura del codice nel browser Web preferito. Fornisce un bel rapporto ipertestuale codificato a colori in cui è possibile fare clic sul nome del file e vedere le statistiche dettagliate sulla copertura di dichiarazione, ramo, condizione e subroutine per il modulo Perl proprio lì nel rapporto accanto al codice sorgente effettivo. Puoi vedere in questo rapporto che non abbiamo trattato affatto la routine "bye ()" e che c'è anche una riga di codice irraggiungibile che non è stata trattata come ci aspettavamo.
(fonte: leucht.com )
Un'altra cosa che puoi fare per aiutare ad automatizzare questo processo nel tuo IDE è creare altri file di tipo "Build.PL" che eseguono esplicitamente alcuni degli obiettivi di compilazione che abbiamo fatto sopra manualmente dalla riga di comando. Ad esempio, utilizzo un file "BuildTest.PL" con il seguente contenuto:
use strict;
use warnings;
use Module::Build;
my $build = Module::Build->resume (
properties => {
config_dir => '_build',
},
);
$build->dispatch('build');
$build->dispatch('test');
Quindi ho impostato il mio IDE per eseguire questo file (tramite "perl BuiltTest.PL") con un solo clic del mouse ed esegue automaticamente il mio codice di unit test dall'IDE invece di farlo manualmente dalla riga di comando. Sostituisci "dispatch ('test')" con "dispatch ('testcover')" per l'esecuzione automatica della copertura del codice. Digitare "Build help" per un elenco completo di obiettivi di build disponibili da Module :: Build.
Build build
e poiBuild test
?