PHPnit을 사용하여 PHP 헤더 테스트
커스텀 헤더를 출력하는 클래스를 테스트하기 위해 PHPunit을 사용하려고 합니다.
문제는 내 기계에서 다음과 같은 것이 있다는 것입니다.
<?php
class HeadersTest extends PHPUnit_Framework_TestCase {
public function testHeaders()
{
ob_start();
header('Location: foo');
$headers_list = headers_list();
header_remove();
ob_clean();
$this->assertContains('Location: foo', $headers_list);
}
}
또는 이 경우에도 마찬가지입니다.
<?php
class HeadersTest extends PHPUnit_Framework_TestCase {
public function testHeaders()
{
ob_start();
header('Location: foo');
header_remove();
ob_clean();
}
}
다음 오류를 반환합니다.
name@host [~/test]# phpunit --verbose HeadersTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.
E
Time: 0 seconds, Memory: 2.25Mb
There was 1 error:
1) HeadersTest::testHeaders
Cannot modify header information - headers already sent by (output started at /usr/local/lib/php/PHPUnit/Util/Printer.php:173)
/test/HeadersTest.php:9
FAILURES!
Tests: 1, Assertions: 0, Errors: 1.
이것은 다른 파일이 포함되어 있지 않고 PHP 태그의 선두에 다른 문자가 없는 경우에도 테스트 실행 전에 터미널에 출력되는 다른 무언가가 있는 것처럼 보입니다.PHPunit 내부의 무언가가 원인이었을 수 있습니까?
무엇이 문제일까요?
문제는 PHPUnit이 화면에 헤더를 인쇄하고 그 시점에서 헤더를 추가할 수 없다는 것입니다.
회피책은 격리된 프로세스에서 테스트를 실행하는 것입니다.여기 예가 있습니다.
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
/**
* @runInSeparateProcess
*/
public function testBar()
{
header('Location : http://foo.com');
}
}
그 결과, 다음과 같은 결과가 됩니다.
$ phpunit FooTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.
.
Time: 1 second, Memory: 9.00Mb
OK (1 test, 0 assertions)
키는 @runInSeparateProcess 주석입니다.
PHPUnit ~ 4.1 또는 그 이상을 사용하는 경우 다음 오류가 나타납니다.
PHP Fatal error: Uncaught Error: Class 'PHPUnit_Util_Configuration' not found in -:378
Stack trace:
#0 {main}
thrown in - on line 378
Fatal error: Uncaught Error: Class 'PHPUnit_Util_Configuration' not found in - on line 378
Error: Class 'PHPUnit_Util_Configuration' not found in - on line 378
Call Stack:
0.0013 582512 1. {main}() -:0
부트스트랩 파일에 추가하여 수정해 보십시오.
<?php
if (!defined('PHPUNIT_COMPOSER_INSTALL')) {
define('PHPUNIT_COMPOSER_INSTALL', __DIR__ . '/path/to/composer/vendors/dir/autoload.php');
}
다른 프로세스로 테스트를 실행하면 문제가 해결되지만 대규모 테스트 스위트를 실행하면 상당한 오버헤드가 발생합니다.
제 수정사항은 다음과 같이 phpunit의 출력을 stderr로 보내는 것이었습니다.
phpunit --stderr <options>
그러면 문제가 해결됩니다.또한 래퍼 기능을 생성하여 코드 내의 모든 항목을 교체할 필요가 없습니다.
여백으로서:나를 위해.headers_list()
0개의 요소가 계속 반환되었습니다.질문에 대한 @titel의 코멘트를 보고 특별히 언급할 가치가 있다고 생각했습니다.
다른 관심 있는 분들이 있다면 취재하고 싶어서요.
headers_list()
(PHP CLI를 사용하는) PHPunit 실행 중에는 동작하지 않지만xdebug_get_headers()
대신 동작합니다.
HTH
이미 코멘트에서 언급했듯이 프로세스를 정의하는 것이 더 낫다고 생각합니다.다음과 같은 XML 구성 파일에서의 분리
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
processIsolation = "true"
// ...
>
</phpunit>
이런 식으로 --stderr 옵션을 통과하지 않아도 되고, 이것은 당신의 동료들을 짜증나게 할 수 있습니다.
좀 더 급진적인 해결책이 있었는데$_SESSION
내 테스트 완료/삭제 완료 파일에 저장.에서 PHPUnit 파일 중 하나를 편집했습니다./PHPUnit/Utils/프린터php를 가지려면"session_start();"
명령어 print $190보다 앞에 표시됩니다.
나한테는 마법처럼 먹혔어요.하지만 저는 "준티" 사용자의 솔루션이 지금까지의 솔루션 중 최고라고 생각합니다.
Laravel을 사용하고 루트 파일에 헤더를 추가하는 경우
테스트 중에 무시할 headers_sent로 둘러싸야 합니다.
다음은 예를 제시하겠습니다.
if (!headers_sent()) {
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Access-Control-Allow-Origin, Content-Type, X-Authorization, Authorization, Accept,charset,boundary,Content-Length');
header('Access-Control-Allow-Origin: *');
}
유닛 테스트를 다시 시도하면 합격입니다.
@runInSeparateProcess의 대체 솔루션은 PHPUnit 실행 시 --process-isolation 옵션을 지정하는 것입니다.
name@host [~/test]# phpunit --process-isolation HeadersTest.php
이는 프로세스를 설정하는 것과 유사합니다.phpunit.xml의 Isolation="true" 옵션입니다.
이 솔루션은 --stderr 옵션을 지정하는 것과 유사한 장점과 단점을 가지고 있지만, 제 경우에는 작동하지 않았습니다.각 테스트를 별도의 PHP 프로세스로 실행함으로써 성능 저하가 발생하더라도 기본적으로 코드를 변경할 필요는 없습니다.
--stderr 매개 변수를 사용하여 테스트 후 PHPunit에서 헤더를 가져옵니다.
phpunit --stderr
언급URL : https://stackoverflow.com/questions/9745080/test-php-headers-with-phpunit
'programing' 카테고리의 다른 글
PDO:: 10진수 타입의 PARAM? (0) | 2023.02.06 |
---|---|
**kwargs 인수를 **kwargs를 사용하여 다른 함수에 전달합니다. (0) | 2023.02.06 |
Java에서 숫자를 단어로 변환하는 방법 (0) | 2023.02.06 |
jQuery를 사용하여 하이퍼링크의 href 속성을 변경하는 방법 (0) | 2023.02.06 |
python에 math nCr 함수가 있나요? (0) | 2023.02.06 |