Как перенаправить вывод stdout и stderr из сценария Perl в файл в Windows? - PullRequest
4 голосов
/ 29 января 2009

Я пробовал это:

test1.pl >output.log 2>&1

но это результат:

Can't dup STDOUT:  Permission denied at C:/Perl/lib/Test/Builder.pm line 1376.
Compilation failed in require at C:/Perl/lib/Test/Builder/Module.pm line 3.
BEGIN failed--compilation aborted at C:/Perl/lib/Test/Builder/Module.pm line 3.
Compilation failed in require at C:/Perl/lib/Test/More.pm line 22.
BEGIN failed--compilation aborted at C:/Perl/lib/Test/More.pm line 22.
Compilation failed in require at C:/Perl/site/lib/Test/WWW/Selenium.pm line 72.
BEGIN failed--compilation aborted at C:/Perl/site/lib/Test/WWW/Selenium.pm line 72.
Compilation failed in require at C:\Software\selenium-remote-control-1.0-beta-2\tests\test1.pl line 5.
BEGIN failed--compilation aborted at C:\Software\selenium-remote-control-1.0-beta-2\tests\test1.pl line 5.

Скрипт запускает файл до тех пор, пока я не пытаюсь каким-либо образом перенаправить вывод из командной строки.

Вот мой сценарий, на всякий случай, если это поможет. (Это Selenium тестовый скрипт):

#!C:/perl/bin/perl.exe -w
use strict;
use warnings;
use Time::HiRes qw(sleep);
use Test::WWW::Selenium;
use Test::More "no_plan";
use Test::Exception;

my $sel = Test::WWW::Selenium->new( host => "localhost",
                                    port => 4444,
                                    browser => "*chrome",
                                    browser_url => "http://localhost/" );
print "Start Time: " . localtime() . "\n";
for (my $count = 3000; $count > 0; $count--)
{
    print $count . " tests remaining.\n";
    $sel->open_ok("/home");
    $sel->click_ok("link=News");
    $sel->wait_for_page_to_load_ok("30000");
    $sel->click_ok("video");
    $sel->wait_for_page_to_load_ok("30000");
    $sel->click_ok("link=Sports");
    $sel->wait_for_page_to_load_ok("30000");
    $sel->click_ok("link=Movies");
    $sel->wait_for_page_to_load_ok("30000");
    $sel->click_ok("moremovies");
    $sel->wait_for_page_to_load_ok("30000");
}

print "End Time: " . localtime() . "\n";

Ответы [ 2 ]

10 голосов
/ 29 января 2009

Существует общая проблема с перенаправлением в Perl для Windows.

Строка, которая не работает в пакете Test::More, говорит:

open TESTOUT, ">&STDOUT" or die $!;

Сбой при вызове команды как test.pl > outlog.log, поскольку файл, на который вы перенаправляете STDOUT, заблокирован cmd.exe, а не perl.exe. Вы не можете dup() это с perl.exe

Вам нужно запустить:

perl test1.pl >output.log 2>&1

вместо.

1 голос
/ 16 мая 2012

Во всех моих тестовых сценариях я всегда настраиваю параметры отчетов о тестировании и регистрации (вместо использования stdout). Я также столкнулся с той же проблемой перенаправления вывода. Вы можете использовать решение, указанное выше мое или вы можете сделать то, что я сделал:

my $res_file = "C:\\Automation\\Results\\Test_Logs\\login_test_output.txt"; 
my $err_file = "C:\\Automation\\Results\\Test_Logs\\login_error_output.txt";

open FH, ">$res_file" or die "couldn't open file: $!";

FH->autoflush(1); # Make FileHandle HOT. Set to 0 to turn autoflush off

Test::More->builder->output (*FH{IO}); # Redirect to test result file ($res_file)
Test::More->builder->failure_output ($err_file); # and test failure output file

Используя этот подход, я могу перенаправить вывод stdout и stderr из моих сценариев perl в файл в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...