- ๋ ์ด์ ์ง์๋์ง ์๋ PHPUnit ๋ฒ์ ์ ๋ํ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ์ง ๋ง์ญ์์ค. ํ์ฌ ์ง์๋๋ PHPUnit ๋ฒ์ ๋ชฉ๋ก์ https://phpunit.de/supported-versions.html์์ ํ์ธํ ์ ์์ต๋๋ค. - ์ฌ์ฉ ์ค์ธ PHPUnit ๋ฒ์ ์์ ์ง์ํ์ง ์๋ PHP ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ์ง ๋ง์ญ์์ค. https://phpunit.de/supported-versions.html์์ ์ฌ์ฉํ ์ ์๋ PHPUnit ๋ฒ์ ์ด ์ง์๋๋ PHP ๋ฒ์ ์ ๋ณด์ฌ์ฃผ๋ ๋ชฉ๋ก์ ๋๋ค. - ๋ฌธ์ ์ ๋ฐ๋ผ ์ด ํ ํ๋ฆฟ์ ์์ฑํ์ญ์์ค. - ๋ฌธ์ ์๋จ์ ์๋ ํ๋ฅผ ์ ์งํ์ญ์์ค. - Composer๋ฅผ ์ฌ์ฉํ์ฌ PHPUnit์ ์ค์นํ ๊ฒฝ์ฐ "composer info | sort"์ ์ถ๋ ฅ์ ํฌํจํ์ญ์์ค. - ์ฝ๋๋ฅผ ํ ์คํธ๋ก ๊ฒ์ํ์ญ์์ค(์ ์ ํ ๋งํฌ์ ์ฌ์ฉ). ์ฝ๋ ์คํฌ๋ฆฐ์ท์ ๊ฒ์ํ์ง ๋ง์ญ์์ค. - ์ง์์ด ํ์ํ ๊ฒฝ์ฐ https://phpunit.de/support.html์ ๋ฐฉ๋ฌธํ์ญ์์ค. - ๋ฌธ์ ๋ฅผ ์ ์ถํ๊ธฐ ์ ์ ์ด ๋๊ธ์ ์ญ์ ํ์ธ์.
| ์ง๋ฌธ | NS
| --------------------| ---------------
| PHPUnit ๋ฒ์ | 8.4.3
| PHP ๋ฒ์ | 7.4.0(phpdbg SAPI)
| ์ค์น ๋ฐฉ๋ฒ | ์๊ณก๊ฐ
ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด phpdbg
์๋์์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฒ์์๋ #3772์ ํดํ์ธ ์ค ์์๋๋ฐ, ๋ณ๊ฐ์ ์์ธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
TestCaseMethod.tpl
์์ ์ด ์ค ๊น์ง ๋ฒ๊ทธ๋ฅผ ์ถ์ ํ ์ ์์๋ค๊ณ ์๊ฐํฉ๋๋ค ( TestCaseClass.tpl
์๋ ์ ์ฌํ ์ฝ๋๊ฐ ์์ต๋๋ค). ์ด ๋ ์ค์ ์ฝ์ ์ ์๋ ์คํธ๋ฆผ์ธ์ง ๋จผ์ ํ์ธํ์ง ์๊ณ STDOUT
์์ ์ฝ์ผ๋ ค๊ณ ํฉ๋๋ค.
stream_get_meta_data(STDOUT)
์ฌ์ฉํ์ฌ ๋๋ฒ๊ทธ ๋ฌธ์ ์
๋ ฅํ๋ฉด STDOUT
๋ฅผ ์ฝ์ ์ ์์์ ์ ์ ์์ต๋๋ค.
array(9) {
["timed_out"]=>
bool(false)
["blocked"]=>
bool(true)
["eof"]=>
bool(false)
["wrapper_type"]=>
string(3) "PHP"
["stream_type"]=>
string(5) "STDIO"
["mode"]=>
string(2) "wb"
["unread_bytes"]=>
int(0)
["seekable"]=>
bool(false)
["uri"]=>
string(12) "php://stdout"
}
๋ํ๋ณด์ญ์์ค:
phpdbg
์์ ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ํ
์คํธ๋ ์คํ๋์ง ์๊ณ ๋์ PHPUnit\Framework\Exception: Notice: stream_get_contents(): read of 8192 bytes failed with errno=9 Bad file descriptor in Standard input code on line 336
์ ์ ์ฌํ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
phpdbg
์๋์์ ์ด ํ
์คํธ๋ฅผ ์คํํฉ๋๋ค.
<?php
use PHPUnit\Framework\TestCase;
class ReproTest extends TestCase
{
/**
* <strong i="20">@doesNotPerformAssertions</strong>
* <strong i="21">@runInSeparateProcess</strong>
*/
public function testProcessIsolation()
{
}
}
๊ทธ๋ฆฌ๊ณ ์ด ์ถ๋ ฅ์ ๋ณด์ญ์์ค:
$ phpdbg -qrr vendor/bin/phpunit
PHPUnit 8.4.3 by Sebastian Bergmann and contributors.
E 1 / 1 (100%)
Time: 121 ms, Memory: 6.00 MB
There was 1 error:
1) ReproTest::testProcessIsolation
PHPUnit\Framework\Exception: Notice: stream_get_contents(): read of 8192 bytes failed with errno=9 Bad file descriptor in Standard input code on line 336
ERRORS!
Tests: 1, Assertions: 0, Errors: 1.
ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ๋ ๋ค๋ฅธ PHP SAPI์์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก phpdbg
์์ ์๋ํด์ผ ํฉ๋๋ค.
composer info | sort
์ถ๋ ฅdoctrine/instantiator 1.3.0 A small, lightweight utility to instantiate objects in PHP without invoking their constructors
myclabs/deep-copy 1.9.3 Create deep copies (clones) of your objects
phar-io/manifest 1.0.3 Component for reading phar.io manifest information from a PHP Archive (PHAR)
phar-io/version 2.0.1 Library for handling version information and constraints
phpdocumentor/reflection-common 2.0.0 Common reflection classes used by phpdocumentor to reflect the code structure
phpdocumentor/reflection-docblock 4.3.2 With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.
phpdocumentor/type-resolver 1.0.1 A PSR-5 based resolver of Class names, Types and Structural Element Names
phpspec/prophecy 1.9.0 Highly opinionated mocking framework for PHP 5.3+
phpunit/php-code-coverage 7.0.10 Library that provides collection, processing, and rendering functionality for PHP code coverage information.
phpunit/php-file-iterator 2.0.2 FilterIterator implementation that filters files based on a list of suffixes.
phpunit/php-text-template 1.2.1 Simple template engine.
phpunit/php-timer 2.1.2 Utility class for timing
phpunit/php-token-stream 3.1.1 Wrapper around PHP's tokenizer extension.
phpunit/phpunit 8.4.3 The PHP Unit Testing framework.
sebastian/code-unit-reverse-lookup 1.0.1 Looks up which function or method a line of code belongs to
sebastian/comparator 3.0.2 Provides the functionality to compare PHP values for equality
sebastian/diff 3.0.2 Diff implementation
sebastian/environment 4.2.3 Provides functionality to handle HHVM/PHP environments
sebastian/exporter 3.1.2 Provides the functionality to export PHP variables for visualization
sebastian/global-state 3.0.0 Snapshotting of global state
sebastian/object-enumerator 3.0.3 Traverses array structures and object graphs to enumerate all referenced objects
sebastian/object-reflector 1.1.1 Allows reflection of object attributes, including inherited and non-public ones
sebastian/recursion-context 3.0.0 Provides functionality to recursively process PHP variables
sebastian/resource-operations 2.0.1 Provides a list of PHP built-in functions that operate on resources
sebastian/type 1.1.3 Collection of value objects that represent the types of the PHP type system
sebastian/version 2.0.1 Library that helps with managing the version number of Git-hosted PHP projects
symfony/polyfill-ctype v1.13.0 Symfony polyfill for ctype functions
theseer/tokenizer 1.1.3 A small library for converting tokenized PHP source code into XML and potentially other formats
webmozart/assert 1.6.0 Assertions to validate method input/output with nice error messages.
ํ์ธํฉ๋๋ค.
PHPDBG์๋ง ์ํฅ์ ๋ฏธ์น๋ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐ ์๊ฐ์ ํฌ์ํ์ง ์์ต๋๋ค. ์์งํ ๋งํด์, PHPUnit ์์ฒด๋ฟ๋ง ์๋๋ผ php-code-coverage์์ ์ง์์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ผ๋ฐ PHP๋ฅผ ์ฌ์ฉํ ๋ ์คํธ๋ฆผ์ ์ฝ์ ์ ์๋ ๊ฒ์ผ๋ก ๋ณด๊ณ ํฉ๋๋ค.
php -r 'echo stream_get_meta_data(STDOUT)["mode"], "\n";' | cat
// Outputs: wb
์ด ๋ฌธ์ ๋ PHP 7.4.0์์ ์ฒ์ ๋ํ๋ฌ์ต๋๋ค . ์ด๊ฒ์ PHP ๋ฒ๊ทธ ์ผ ์ ์์ง๋ง ๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.