2017-08-03 6 views
2

Je suis capable d'écrire tests unitaires test_case.t pour un module Perl ModuleOne.pmComment écrire l'unité cas de test pour un script Perl

test_case.t

use strict; 
use warnings; 
use Test::More; 
use Test::Cmd; 
use ModuleOne; # Included the module here 

my $ret = ModuleOne::methodone(args); 
is($ret->{val}, 1, "Checking return value"); # success 

Je suis en train de la réaliser la même cas de tests unitaires pour un script perl script_one.pl

de script_one.pl

use strict; 
use warnings; 
use ModuleOne; 

my $NAME; 
my $ID; 

# get parameters 
GetOptions (
"name" => \$NAME, 
"emp_id" => \$ID, 
) 

validate_params(); 

sub validate_params { 
    # this method will validate params 
} 

sub print_name { 
    # this method will print name 
} 

Comment puis-je inclure ce fichier perl script_one.pl dans test_case.t et écrire des scénarios de test pour les méthodes validate_params et print_name?

Répondre

4

Il existe plusieurs options. L'un est d'utiliser Test::Script pour voir si votre code compile et fonctionne, et fait des choses. Il s'agit plus d'un test d'intégration que d'un test unitaire, et si vous avez des dépendances externes telles que l'écriture sur le système de fichiers, il est difficile de se moquer de ceux-ci comme ça.

Depuis que vous avez sous-marins dans le script, le plus simple est probablement require ou do le script dans votre fichier de test, peut-être dans un autre package (mais cela ne compte pas vraiment). Vous pouvez ensuite appeler ces fonctions, car elles se trouvent dans l'un de vos espaces de noms. De cette façon, vous pouvez simuler plus facilement les dépendances et obtenir plus de contrôle. La seule chose qui pourrait être difficile est le code qui n'est pas dans les sous-marins et sera exécuté à l'appel, comme l'appel à validate_params. Vous pourrait juste utiliser Capture::Tiny pour brosser que sous le tapis.

La meilleure option est de ne pas avoir de fonctions dans votre script. Faites juste un autre module qui a ces fonctions, et appelez-le dans votre script. C'est bien d'avoir un script comme celui-ci.

#!/usr/bin/env perl 
use strict; 
use warnings; 
use My::Modules::Foo; 

My::Modules::Foo->run; # or ::run() 

Peu importe que ce soit de la POO ou non. L'idée sera la même. Si vous l'encapsulez correctement, vous pouvez tester tous vos codes sans jamais utiliser ce script. En ce qui concerne les choses GetOpts, ces variables peuvent être des lexiques du script, mais votre nom avec les lettres majuscules et l'absence d'arguments à l'appel validate_params indiquent qu'ils sont vraiment à l'échelle du paquet et sont utilisés dans la fonction. Ne fais pas ça. Utilisez des arguments à sub s. Placez tous les sous-marins dans un package, puis placez GetOpts dans le script et transmettez les options en tant qu'arguments à la fonction.

De cette façon, vous pouvez tout tester et n'avez vraiment pas besoin du script.