2009-08-30 3 views
12

응용 프로그램 테스트 스위트를 실행할 때 나는 모든 Perl 컴파일 및 런타임 경고 (예 : "초기화되지 않은 변수"경고)를 치명적인 오류로 승격 시켜서 필자와 다른 개발자가 경고를 생성하는 코드를 조사하고 수정하려고합니다. 그러나 개발 및 CI 테스트 중에 만이 작업을 수행하려고합니다. 프로덕션 환경에서 경고는 경고로 유지되어야합니다. 개발 중 치명적인 오류에 대한 Perl 경고를 어떻게 홍보해야합니까?

# TestHelper.pm 
use warnings FATAL => qw(all); 
1; 

는 다음과 같이 테스트 스위트라고 : "/ lib에 t"나는 모듈 TestHelper.pm 생성에서 :

나는 다음을 시도

$ PERL5LIB=$PERL5LIB:./t/lib PERL5OPT=-MTestHelper.pm prove -l t/*.t 

을하지만이 없었어요 모든 경고를 치명적인 오류로 승격시키는 바람직한 효과. 정상적으로 경고를 받았지만 경고는 치명적인 것으로 취급되지 않았습니다. 모든 test.t 스크립트에는 "use warnings"행이 있습니다. 그 (것)들 - 아마 이것은 "사용 경고"가 국부적으로 범위이기 때문에 TestHelper.pm에 하나를 over-ride?

대신 내가 이런 짓을했습니다

# TestHelper.pm 
# Promote all warnings to fatal 
$SIG{__WARN__} = sub { die @_; }; 
1; 

이 작동하지만 그것에 대해 코드 냄새가 있습니다. 나는 또한 그것이 첫 번째 경고에서 폭탄을 터뜨리는 것을 좋아하지 않는다. 차라리 테스트 스위트가 전부 실행되어 모든 경고가 기록되지만 코드가 경고와 함께 실행 되었기 때문에 테스트 상태가 결국 실패했습니다.

이 최종 결과를 얻는 더 좋은 방법이 있습니까?

답변

21

나는 Test::NoWarnings을 찾고 있다고 생각합니다.

+0

이 모듈은 내가 필요한 것입니다. 감사합니다. friedo가 위와 같이 제안한 것과 거의 동일하게 작동한다는 것을 알고 있습니다. :-) – Hissohathair

+0

불행히도 Test :: NoWarnings은 "done_testing()"과 함께 제대로 작동하지 않습니다. https://rt.cpan.org/Public/Bug/Display.html?id=66485 및 https : // rt를 참조하십시오. cpan.org/Ticket/Display.html?id=52412 –

17

use warnings FATAL => qw(all);이 작동하지 않는 이유는 use warnings이 어휘 적으로 범위가 지정 되었기 때문입니다. 따라서 TestHelper.pm에서 생성 된 경고는 치명적일 수 있지만 다른 곳에서 생성 된 경고는 정상적으로 작동합니다.

치명적인 경고를 전역 적으로 사용하려면 $SIG{__WARN__} 처리기가 처리 방법 일 수 있습니다. 첫 번째 경고가 울리기를 원하지 않으면 처리기가 배열에 배열을 저장하도록하고 END 블록을 확인하십시오.

my @WARNINGS; 
$SIG{__WARN__} = sub { push @WARNINGS, shift }; 

END { 
    if (@WARNINGS) {  
     print STDERR "There were warnings!\n"; 
     print "$_\n" for @WARNINGS; 
     exit 1; 
    } 
} 
+0

"경고 사용"은 어휘 적으로 범위가 있다고 이해합니다. 그러나 TestHelper.pm에는 "패키지"선언이 없습니다. PERL5OPTS를 통해 "-MTestHelper"를 전달할 때 의미가 있습니까? – Hissohathair

+3

어휘 범위 지정은 패키지와 관련이 없습니다. 그것은 선언 시점에서 파일의 끝까지 (또는 중괄호 안에있는 경우 끝 중괄호로) 실행됩니다. 다른 파일의 코드에는 영향을주지 않습니다. – cjm

+0

아. 훌륭해, 고마워. – Hissohathair

관련 문제