Comment puis-je tester un script Perl autonome?

j'ai écrit un petit script Perl et maintenant je voudrais créer une suite de tests. J'ai pensé qu'il serait agréable d'être en mesure de use le script en tant que module, importez les subs définis dans le script et testez-les. Y a-t-il un moyen d'avoir le script à la fois autonome Perl script et Perl module? (Je ne veux pas diviser le script dans un module séparé et le "exécutable", car j'ai l'intention de distribuer le script en un seul fichier.)

Ou est-il une meilleure façon de tester l' script?

21
demandé sur brian d foy 2009-01-22 13:57:24

5 réponses

Depuis brian semble être endormi maintenant, voici un pointeur vers ce qu'il appelle modulinos. Il s'agit essentiellement d'une recette pour construire des scripts qui agissent comme des modules ou des modules qui peuvent être exécutés comme des scripts. Sonne exactement comme ce que vous cherchez.

Mastering Perl est certainement un livre qui mérite d'être lu (et l'achat).

32
répondu innaM 2012-06-14 14:39:21

(Je ne veux pas diviser le script en un module séparé et l ' "exécutable", puisque je prévois de distribuer le script en un seul fichier.)

la plupart des gens assemblent des fichiers comme celui-ci au moment de la compilation. App:: Ack sur le CPAN est un exemple de quelque chose qui peut être construit comme ceci.

si vous voulez vraiment tester votre application correctement, vous devez mettre la fonctionnalité dans un module, puis écrire un test:: script de test plus basé qui exerce les fonctions que le module fournit. Alors le script actuel est juste un emballage mince autour du module, habituellement quelque chose comme:

#!/usr/bin/env perl
use Your::Class;
Your::Class->new(args => \@ARGV)->run;

Voir aussi: MooseX:: Getopt.

6
répondu jrockway 2009-07-21 19:00:18

je veux faire la même chose. Est-il une raison de ne pas faire ce qui suit? (Je ne suis pas un expert en perl, la solution semble fonctionner pour moi, cependant.):

Au début du script je demande un switch ("- test") ou quoi que ce soit et une branche à un sub comme celui-ci:

my $myargs = CmdLineOptions->new( args=>\@ARGV );
if ($myargs->was_given(option=>"-test"))    { &tests; }

sub tests   {
    require "Test/More.pm";
    Test::More->import('no_plan');

    is(1,1,"my tests go here");
    exit;
}

(en utilisant require et import je supprime le ' # No tests run!'message que je reçois lors de l'utilisation de l'utilisation de Test: Plus d'', sans faire de tests. Je suppose que ça réduit aussi les frais généraux.)

3
répondu Dirk 2011-01-14 11:21:06

cela dépend si vous voulez tester le script lui-même, ou tester les sous-marins qui composent le script. Si vous voulez tester le script, puis un test externe serait plus approprié, par exemple un script shell. Si vous voulez tester les fonctions qui composent le script, alors vous pouvez soit écrire ces tests en tant que plus de fonctions dans le script ou reformuler les éléments dans un module Perl et tester le module (ce que vous dites que vous ne voulez pas faire).

Si le script est assez petit, ensuite le refactoring pourrait ne pas être nécessaire. Il suffit d'ajouter un argument de ligne de commande '-test' et d'appeler dans un sub test, qui à son tour teste tout le reste. Si je fais cela, j'aime imprimer un indicateur de progrès d'une sorte (par exemple a '."pour chaque essai réussi).

si le script est plus complexe, Cependant, vous pouvez envisager de reconfigurer les bits en un ou plusieurs modules et de les tester avec Test:: Simple ou Test: Plus D'.

2
répondu Joe Casadonte 2009-01-22 12:14:18

pourquoi ne pas écrire une suite de test dans un script shell, avec le script Perl appelé comme n'importe quelle autre commande shell ?

1
répondu mouviciel 2009-01-22 22:51:06