PHP 유닛 테스트 실행 중 CLI에서 출력하는 방법
PHPUnit 테스트를 실행할 때 출력을 덤프하여 한두 가지를 디버깅할 수 있도록 하고 싶습니다.
다음을 시도했습니다(PHPUnit 매뉴얼의 예와 유사).
class theTest extends PHPUnit_Framework_TestCase
{
/**
* @outputBuffering disabled
*/
public function testOutput() {
print_r("Hello World");
print "Ping";
echo "Pong";
$out = "Foo";
var_dump($out);
}
}
결과는 다음과 같습니다.
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 0 assertions)
예상되는 출력은 없습니다.
2011년 9월 19일 현재 git repos의 HEAD 버전을 사용하고 있습니다.
의 php -version
:
$ php -version
PHP 5.2.9 (cli) (built: Dec 8 2010 11:36:37)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
제가 잘못하고 있는 것이 있나요?아니면 PHPUnit 버그일 가능성이 있나요?
갱신하다
막 이 할 때 더 잘 방법을 알게 되었습니다. 이 방법이 훨씬 더 효과적이죠.--verbose
다음 중 하나:
class TestSomething extends PHPUnit_Framework_TestCase {
function testSomething() {
$myDebugVar = array(1, 2, 3);
fwrite(STDERR, print_r($myDebugVar, TRUE));
}
}
에 의해, 「」에 을 일절 , 할 수 .이것에 의해, 불필요한 출력은 모두 불필요하게 됩니다.--verbose
CLI 션
다른 답변에서도 언급했듯이 다음과 같은 내장 방법을 사용하여 출력을 테스트하는 것이 가장 좋습니다.
$this->expectOutputString('foo');
단, 테스트 케이스 내에서 일회성/일시적인 디버깅 출력을 확인하는 것이 도움이 될 수 있습니다. 말은 필요 .var_dump
★★★★★★★★★★★★★★★★★★★★★. , , , , , , , , , , , , , , , , , , , 를 합니다.--verbose
명령줄 옵션을 선택합니다.예를 들어 다음과 같습니다.
$ phpunit --verbose -c phpunit.xml
CLI 환경에서 실행할 때 테스트 방식 내부에서 출력이 표시됩니다.
자세한 내용은 PHPUnit 쓰기 테스트 - 출력 테스트를 참조하십시오.
업데이트: 아래 rdlowrey의 업데이트를 참조하십시오.fwrite(STDERR, print_r($myDebugVar, TRUE));
이 동작은 (jasonbar가 지적한 바와 같이) 의도적인 것입니다.매뉴얼의 충돌 상태가 PHPUnit에 보고되었습니다.
회피책은 PHPUnit이 예상되는 출력이 비어 있다고 단언하도록 하는 것입니다(인펙트가 있는 경우). 그러면 예기치 않은 출력이 표시됩니다.
class theTest extends PHPUnit_Framework_TestCase
{
/**
* @outputBuffering disabled
*/
public function testOutput() {
$this->expectOutputString(''); // tell PHPUnit to expect '' as output
print_r("Hello World");
print "Ping";
echo "Pong";
$out = "Foo";
var_dump($out);
}
}
다음과 같은 기능이 있습니다.
PHPUnit @package_version@ by Sebastian Bergmann.
F
Time: 1 second, Memory: 3.50Mb
There was 1 failure:
1) theTest::testOutput
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-''
+'Hello WorldPingPongstring(4) "Foo"
+'
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
출력 어설션이 테스트되기 전에 실패할 수 있으므로 테스트에 대해 가지고 있는 다른 어설션은 반드시 비활성화하십시오(따라서 출력이 표시되지 않습니다).
도 한번 써보세요.--debug
포함 또는 원본 데이터 파일에 대한 올바른 경로를 얻으려고 할 때 유용합니다.
버그는 아니지만, 매우 의도적인 것입니다.가장 좋은 방법은 로그 파일에 쓰고 로그를 추적하여 출력을 감시하는 것입니다.
출력을 테스트하는 경우는, 이것을 확인해 주세요.
기타:
주의: PHPUnit은 테스트 실행 중에 출력되는 모든 출력을 삼켜버립니다.strict 모드에서는 출력을 방출하는 테스트는 실패합니다.
전화하세요.ob_flush()
후
코드 예:
public function testDebugOutputToCli() {
var_dump(new DateTime());
ob_flush();
}
코드 및 출력 스크린샷:
왜요? PHPUnit은 항상 출력 버퍼링이기 때문에 디버깅할 때 버퍼를 덤프해야 합니다.
위의 모든 답변에 어려움을 겪고 있었습니다.특히 선택한 답변이codecept_debug()
--debug
매뉴얼에 기재되어 있는 바와 같이 디버깅 출력이 대량으로 발생하여 사용할 수 없게 되었습니다.
PHPUnit 매뉴얼을 잘 읽고 있었는데 우연히 알게 되었습니다.이것은 Codeception뿐만 아니라 모든 PHPunit에서 이 문제의 원인이 무엇인지 설명한다고 생각합니다.
PHPUnit 매뉴얼, Testing Output: "예를 들어 메서드를 실행하면 (에코나 인쇄를 통해) 예상 출력이 생성된다고 주장하고 싶을 수 있습니다.PHPUnit\Framework\TestCase 클래스는 PHP의 Output Buffering 기능을 사용하여 필요한 기능을 제공합니다."
이것은 완전히 타당하며, 왜 출력이 표시되지 않는지 설명합니다.PHPUnit은 코멘트를 검토하고 싶은 경우에 대비하여 저장하고 있습니다.실제 테스트에서는 항상 이렇게 동작해야 합니다.물론 무작위로 조작하는 것은 원하지 않습니다.echo
.
다만, 디버깅을 실시할 때는, 곧바로 텍스트를 표시하고 싶다고 생각하고 있기 때문에, 이 모든 것을 이해하면, 해결 방법은 명확합니다.출력 버퍼의 내용을 필요에 따라서 인쇄하는 것 뿐입니다.
즐거운 매뉴얼을 읽어주셔서 만세 삼창!
추신: 이 힌트는 How to show var_phunit in phpunit 또는 Julian이 dev.to에서 코드인셉션을 표시하는 방법에도 숨겨져 있습니다.
자신의 의도에 대해 진지하게 생각해야 합니다.테스트를 수정하기 위해 디버깅할 때 정보가 지금 필요한 경우 다음 주에 테스트가 중단될 때 정보가 다시 필요합니다.
즉, 테스트에 불합격했을 때 항상 정보가 필요합니다.또,var_dump
을 사용하다오히려 데이터를 당신의 주장에 넣으세요.
코드가 너무 복잡하면 (커스텀메시지가 있는) 하나의 어설션으로 코드가 어디서 고장났는지, 왜 고장났는지, 어떻게 고치는지 알 수 있는 수준에 도달할 때까지 코드를 분할합니다.
저는 Visual PHPUnit에 대해 운이 좋았습니다만, 그 중에서도 출력에 도움이 됩니다.
class TestHello extends PHPUnit_Framework_TestCase
{
public function test_Hello()
{
print "hello world";
}
}
phpunit을 실행할 때는 --verbose 플래그를 사용합니다.
$ phpunit --verbose -c phpunit.xml
이 방법의 장점은 테스트 코드를 변경할 필요가 없고 문자열, var_dump's o를 원하는 대로 인쇄할 수 있으며 상세 모드를 설정한 경우에만 콘솔에 표시됩니다.
이게 도움이 됐으면 좋겠어요.
레벨 5에서는 dump()를 사용할 수 있습니다.마지막 응답의 콘텐츠를 덤프합니다.
class ExampleTest extends TestCase{
public function test1()
{
$this->post('/user', ['name' => 'Gema']);
$this->dump();
}
}
이것은 설비 관련 PHPUnit Docs에서 가져온 것입니다.
이를 통해 phpunit 테스트 라이프 사이클 중 임의의 시점에서 정보를 덤프할 수 있습니다.
교환만 하면 됩니다.__METHOD__
하고 싶은 것을 입력해 주세요.
예 4.2: 사용 가능한 모든 템플릿 방식을 보여주는 예
<?php
class TemplateMethodsTest extends PHPUnit_Framework_TestCase
{
public static function setUpBeforeClass()
{
fwrite(STDOUT, __METHOD__ . "\n");
}
protected function setUp()
{
fwrite(STDOUT, __METHOD__ . "\n");
}
protected function assertPreConditions()
{
fwrite(STDOUT, __METHOD__ . "\n");
}
public function testOne()
{
fwrite(STDOUT, __METHOD__ . "\n");
$this->assertTrue(TRUE);
}
public function testTwo()
{
fwrite(STDOUT, __METHOD__ . "\n");
$this->assertTrue(FALSE);
}
protected function assertPostConditions()
{
fwrite(STDOUT, __METHOD__ . "\n");
}
protected function tearDown()
{
fwrite(STDOUT, __METHOD__ . "\n");
}
public static function tearDownAfterClass()
{
fwrite(STDOUT, __METHOD__ . "\n");
}
protected function onNotSuccessfulTest(Exception $e)
{
fwrite(STDOUT, __METHOD__ . "\n");
throw $e;
}
}
?>
경우에 따라서는 이러한 기능을 사용하여 콘솔에 출력할 수 있습니다.
class yourTests extends PHPUnit_Framework_TestCase
{
/* Add Warnings */
protected function addWarning($msg, Exception $previous = null)
{
$add_warning = $this->getTestResultObject();
$msg = new PHPUnit_Framework_Warning($msg, 0, $previous);
$add_warning->addWarning($this, $msg, time());
$this->setTestResultObject($add_warning);
}
/* Add errors */
protected function addError($msg, Exception $previous = null)
{
$add_error = $this->getTestResultObject();
$msg = new PHPUnit_Framework_AssertionFailedError($msg, 0, $previous);
$add_error->addError($this, $msg, time());
$this->setTestResultObject($add_error);
}
/* Add failures */
protected function addFailure($msg, Exception $previous = null)
{
$add_failure = $this->getTestResultObject();
$msg = new PHPUnit_Framework_AssertionFailedError($msg, 0, $previous);
$add_failure->addFailure($this, $msg, time());
$this->setTestResultObject($add_failure);
}
public function test_messages()
{
$this->addWarning("Your warning message!");
$this->addError("Your error message!");
$this->addFailure("Your Failure message");
}
/* Or just mark test states! */
public function test_testMarking()
{
$this->markTestIncomplete();
$this->markTestSkipped();
}
}
해키쉬하지만, 효과가 있습니다.디버깅 출력을 메시지로 하여 예외를 슬로우합니다.
class theTest extends PHPUnit_Framework_TestCase
{
public function testOutput() {
throw new \Exception("hello");
}
}
수율:
...
There was 1 error:
1) theTest::testOutput
Exception: hello
은 PHPUnit으로 .ob_start()
일시적으로 비활성화할 수 있습니다.
public function log($something = null)
{
ob_end_clean();
var_dump($something);
ob_start();
}
HTML 기반의 Testresults를 출력합니다.이 경우 콘텐츠를 플러시하는 데 도움이 됩니다.
var_dump($array);
ob_flush();
두 번째 PHP 메서드가 있습니다.
flush()
난 시도도 안 해봤어
이 코드가 작동하려면 소스 코드를 수정해야 하므로 이 분기된 저장소의 URL을 컴포저에 추가해야 합니다.
class TestCase extends \PHPUnit_Framework_TestCase
{
/**
* Save last response
* @var Response|null A Response instance
*/
static $lastResponse;
/**
* Modify to save response
*
* @param string $method
* @param string $uri
* @param array $parameters
* @param array $files
* @param array $server
* @param string $content
* @param bool $changeHistory
* @return \Illuminate\Http\Response
*/
final public function call(
$method,
$uri,
$parameters = [],
$files = [],
$server = [],
$content = null,
$changeHistory = true
) {
$response = parent::call($method, $uri, $parameters, $files, $server, $content, $changeHistory);
static::$lastResponse = $this->client->getResponse();
return $response;
}
/**
* Modify message to add response text
*
* @param mixed $value
* @param PHPUnit_Framework_Constraint $constraint
* @param string $message
* @since Method available since Release 3.0.0
*/
final public static function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
{
$message .= PHP_EOL . static::$lastResponse . PHP_EOL;
parent::assertThat($value, $constraint, $message);
}
}
다음은 PHPUnit 4.x에서 디버깅메시지를 인쇄할 때 도움이 되는 몇 가지 방법입니다.
syslog(LOG_DEBUG, "Debug: Message 1!");
보다 실용적인 예:
syslog(LOG_DEBUG, sprintf("%s: Value: %s", __METHOD__, var_export($_GET, TRUE)));
호출하면 시스템로그 메시지가 생성됩니다( 참조).
man syslog.conf
를 참조해 주세요.한 레벨: " " : " " " " : " "
LOG_DEBUG
,LOG_INFO
,LOG_NOTICE
,LOG_WARNING
,LOG_ERR
등등.MacOS에서 syslog 메시지를 실시간으로 스트리밍하려면 다음을 수행합니다.
log stream --level debug --predicate 'processImagePath contains "php"'
fwrite(STDERR, "LOG: Message 2!\n");
★★★★★★
STDERR
stdin에서 PHP 스크립트를 읽는 경우 상수를 사용할 수 없습니다.회피책은 다음과 같습니다." " " "
STDERR
파일명을 지정할 수도 있습니다.file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND);
참고: 상수가 정의되지 않은 경우 이 방법을 사용하십시오.
register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND);
주의: 테스트에 영향을 주지 않고 마지막에 인쇄하려면 이 방법을 사용하십시오.
을 사용합니다.var_export()
예 , ) 。"Value: " . var_export($some_var, TRUE) . "\n"
.
상기의 메시지를 상세 모드 또는 디버깅모드시에만 인쇄하려면 , 를 참조해 주세요.테스트에서 --debug 또는 --verbose가 PHPUnit에 전달되었는지 확인할 수 있는 방법이 있습니까?
출력 테스트가 테스트 자체의 일부인 경우 다음 사항을 확인하십시오.Testing Output docs 페이지.
합니다.「STDERR」를 에 .--verbose
또는--debug
다음 중 하나를 수행할 수 있습니다.
- 대신 디버깅 출력을 STDERR로 출력합니다.
var_dump
디버깅은 정상적으로 실행되지만--verbose
phpunit 명령줄로 이동합니다.var_dump
디버깅은 정상적으로 행 추가ob_flush();
그 밑에- 여기서 테스트하려는 것을 정확하게 테스트하기 위해 phpunit에서 올바른 명령을 사용합니다.
분명히 마지막은 좋은 일이고 나머지는 임시 해킹입니다.
메시지를 표시하는 기본 PHPunit 방법을 사용하여 다음과 같이 테스트 내에서 변수를 디버깅할 수 있습니다.
$this->assertTrue(false,$your_variable);
사용할 수 있습니다.Symfony\Component\Console\Output\TrimmedBufferOutput
버퍼링된 출력 문자열을 다음과 같이 테스트합니다.
use Symfony\Component\Console\Output\TrimmedBufferOutput;
//...
public function testSomething()
{
$output = new TrimmedBufferOutput(999);
$output->writeln('Do something in your code with the output class...');
//test the output:
$this->assertStringContainsString('expected string...', $output->fetch());
}
유료 제품이지만, 효과가 좋다고 생각합니다: Spatie의 Ray https://spatie.be/products/ray
그냥 이렇게 쓰세요.
ray'message')
그러면 메시지가 Ray 출력 창에 표시됩니다.
Larabel을 사용하는 경우 info() 등의 로깅 기능을 사용하여 스토리지/로그 아래에 있는 Larabel 로그 파일에 로깅할 수 있습니다.따라서 단말기가 아닌 로그 파일에 표시됩니다.
언급URL : https://stackoverflow.com/questions/7493102/how-to-output-in-cli-during-execution-of-php-unit-tests
'sourcecode' 카테고리의 다른 글
div 안의 요소로 스크롤하는 방법 (0) | 2022.11.06 |
---|---|
mysql 테이블의 컬럼 기본값을 변경하려면 어떻게 해야 합니까? (0) | 2022.11.06 |
jdbc:mariadb(Netbeans)에 적합한 드라이버를 찾을 수 없습니다. (0) | 2022.11.06 |
vue를 사용하여 lodash에 메서드를 전달하면 '예상된 기능'이 제공됩니다. (0) | 2022.10.27 |
Vue - 확인 메시지에서 스타일 사용자 입력(특정 html 태그 허용) (0) | 2022.10.27 |