Comment passer des arguments Perl test lorsque vous exécutez à travers prove

Lors de la rédaction des cas de test dans l'écosystème de l'Perl parfois besoin d'écrire un test que vous pouvez transférer n'importe quel argument. Par exemple, peut être un test, qui sans arguments vérifie tous les fichiers, et si il est comme argument pour spécifier le chemin d'accès au fichier, puis il vérifie que ce seul fichier.

C'est-à-dire la tâche consiste à en Perl test dans la variable @ARGV est apparu valeur.

Voici un exemple de test t/main.t:

use Test::More tests => 1;
use Data::Dumper;

pass('Loaded ok');

warn Dumper \@ARGV;

Si vous exécutez ce test à l'aide perl t/main.t one two three, alors la sortie sera visible que dans la variable @ARGV ont frappé la valeur de la ligne de commande:

1..1
ok 1 - Loaded ok
$VAR1 = [
          'one',
          'two',
          'three'
        ];

Mais, si vous exécutez ce même test avec l'aide de prove t/main.t one two three, le retrait sera visible que dans le tableau @ARGV les valeurs de la ligne de commande n'ont pas, et à en juger par стектрейсу, prove a perçu ces arguments ne sont pas comme des arguments à la pâte, ainsi que les arguments à lui-même.

Voici la liste complète des résultats de travail:

$VAR1 = [];
t/main.t .. ok
Cannot detect source of 'one'! at /usr/local/lib/perl5/5.28.1/TAP/Parser/IteratorFactory.pm line 256.
    TAP::Parser::IteratorFactory::detect_source(TAP::Parser::IteratorFactory=HASH(0x55663d4f4300), TAP::Parser::Source=HASH(0x55663d61cdc0)) called at /usr/local/lib/perl5/5.28.1/TAP/Parser/IteratorFactory.pm line 211
    TAP::Parser::IteratorFactory::make_iterator(TAP::Parser::IteratorFactory=HASH(0x55663d4f4300), TAP::Parser::Source=HASH(0x55663d61cdc0)) called at /usr/local/lib/perl5/5.28.1/TAP/Parser.pm line 472
    TAP::Parser::_initialize(TAP::Parser=HASH(0x55663d6a11d8), HASH(0x55663d4f4390)) called at /usr/local/lib/perl5/5.28.1/TAP/Object.pm line 55
    TAP::Object::new("TAP::Parser", HASH(0x55663d4f4390)) called at /usr/local/lib/perl5/5.28.1/TAP/Object.pm line 130
    TAP::Object::_construct(TAP::Harness=HASH(0x55663ce11a90), "TAP::Parser", HASH(0x55663d4f4390)) called at /usr/local/lib/perl5/5.28.1/TAP/Harness.pm line 852
    TAP::Harness::make_parser(TAP::Harness=HASH(0x55663ce11a90), TAP::Parser::Scheduler::Job=HASH(0x55663d33bf80)) called at /usr/local/lib/perl5/5.28.1/TAP/Harness.pm line 651
    TAP::Harness::_aggregate_single(TAP::Harness=HASH(0x55663ce11a90), TAP::Parser::Aggregator=HASH(0x55663ce11880), TAP::Parser::Scheduler=HASH(0x55663d33be78)) called at /usr/local/lib/perl5/5.28.1/TAP/Harness.pm line 743
    TAP::Harness::aggregate_tests(TAP::Harness=HASH(0x55663ce11a90), TAP::Parser::Aggregator=HASH(0x55663ce11880), "t/main.t", "one", "two", "three") called at /usr/local/lib/perl5/5.28.1/TAP/Harness.pm line 558
    TAP::Harness::__ANON__() called at /usr/local/lib/perl5/5.28.1/TAP/Harness.pm line 571
    TAP::Harness::runtests(TAP::Harness=HASH(0x55663ce11a90), "t/main.t", "one", "two", "three") called at /usr/local/lib/perl5/5.28.1/App/Prove.pm line 548
    App::Prove::_runtests(App::Prove=HASH(0x55663ce093a8), HASH(0x55663d22f6c8), "t/main.t", "one", "two", "three") called at /usr/local/lib/perl5/5.28.1/App/Prove.pm line 506
    App::Prove::run(App::Prove=HASH(0x55663ce093a8)) called at /usr/local/bin/prove line 13

La solution est d'utiliser ::

Dans l'équipe prove il ya ficha — ce qui est écrit après le double caractère deux-points :: prove transmet dans le test lancé.

Donc si si vous exécutez un test à l'aide de prove t/main.t :: one two three, nous obtenons le résultat attendu:

$VAR1 = [
          'one',
          'two',
          'three'
        ];
t/main.t .. ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.04 usr  0.01 sys +  0.09 cusr  0.02 csys =  0.16 CPU)
Result: PASS

La documentation officielle

Voici un extrait de la sortie de la commande perldoc prove sur cette caractéristique prove:

  Arguments to Tests
    It is possible to supply arguments to tests. To do so separate them from
    prove's own arguments with the arisdottle, '::'. For example

     prove -v t/mytest.t :: --url http://example.com

    would run t/mytest.t with the options '--url http://example.com'. When
    running multiple tests they will each receive the same arguments.

Autres articles