2013-05-16 2 views
4

Вот мой текущий Жгут тест с помощью TAP:Использование функций в TAP жгутов вместо тестовых файлов

use TAP::Harness; 
my $harness = TAP::Harness->new(); 
$harness->runtests(['sequential.t']); 

Я хотел бы избежать с помощью тестовых файлов и вызвать непосредственно функцию Perl вместо этого. Что-то вроде:

my %args = (
    exec => run_all_tests(), 
); 
$harness->runtests(); 

ответ

5

Основная проблема заключается в том, что все современные test модули используют Test::Builder под капотом.
Test::Builder сам предполагает, что у вас будет только один набор тестов в файле.
Поэтому нам нужно сбросить синглтон для каждого набора тестов (Test::More->builder->reset).

use strict; 
use warnings; 

use TAP::Harness; 
use Test::More; 

my %tests = (
    a => sub{ 
    plan tests => 4; 
    ok 5==5, '5 == 5'; 
    is 5, "5", 'is 5, 5'; 
    like 5, qr'^\d$', '5 =~ /^\d$/'; 
    is 5, 4, 'is 5, 4'; 
    }, 
    b => sub{ 
    plan tests => 3; 
    ok !0; 
    ok !0; 
    ok !0; 
    }, 
    c => sub{ 
    plan 'no_plan'; 
    ok !0; 
    done_testing; 
    }, 
    d => sub{ 
    ok !0; 
    done_testing; 
    }, 
); 

sub runner{ 
    my($harness,$test) = @_; 

    my $builder = Test::More->builder; 

    # reset the Test::Builder object for every "file" 
    $builder->reset; 
    $builder->{Indent} = ''; # may not be needed 

    # collect the output into $out 
    $builder->output(\my($out));  # STDOUT 
    $builder->failure_output(\$out); # STDERR 
    $builder->todo_output(\$out); # STDOUT 

    # run the test 
    $tests{$test}->(); 

    # the output (needs at least one newline) 
    return $out; 
} 

my $harness = TAP::Harness->new(
    { 
    exec => \&runner, 
    verbosity => 1, 
    } 
); 

$harness->runtests(sort keys %tests); 
a .. 
1..4 
ok 1 - 5 == 5 
ok 2 - is 5, 5 
ok 3 - 5 =~ /^\d$/ 
not ok 4 - is 5, 4 

# Failed test 'is 5, 4' 
# at test.pl line 13. 
#   got: '5' 
#  expected: '4' 
Failed 1/4 subtests 
b .. 
1..3 
ok 1 
ok 2 
ok 3 
ok 
c .. 
ok 1 
1..1 
ok 
d .. 
ok 1 
1..1 
ok 

Test Summary Report 
------------------- 
a (Wstat: 0 Tests: 4 Failed: 1) 
    Failed test: 4 
Files=4, Tests=9, 0 wallclock secs (0.02 usr + 0.00 sys = 0.02 CPU) 
Result: FAIL 
+0

Я думал, что будет короче использовать подпрограммы, но, по-видимому, нет. Спасибо за пример. –

+0

@alex_reader На самом деле я использовал подпрограммы. Просто большинство из них находятся в [Test :: More] (https://metacpan.org/module/Test%3a%3aMore «perldoc Test :: More»). Я также использовал [анонимные подпрограммы] (http://perldoc.perl.org/perlsub.html «perldoc perlsub»), хранящиеся в хэше. Анонимные поднаймы могут быть названы одними, но это либо избыточно: '% tests = (a => \ & a, b => \ & b)' или advanced '{no strict 'refs'; die, если не существует &$test; & $ test();} '. –