Phpunit: phpdbgでのプロセス分離は例外をスローします

作成日 2019年11月30日  ·  3コメント  ·  ソース: sebastianbergmann/phpunit

-サポートされなくなったバージョンのPHPUnitの問題を報告しないでください。 現在サポートされているPHPUnitのバージョンのリストは、https://phpunit.de/supported-versions.htmlで入手できます。 -使用しているPHPUnitのバージョンでサポートされていないバージョンのPHPを使用している場合は、問題を報告しないでください。 どのバージョンのPHPがサポートされているかを示すリストは、https://phpunit.de/supported-versions.htmlで入手できます。 -問題に応じて、このテンプレートに記入してください。 -以下の表を問題の上部に置いてください。 -Composerを使用してPHPUnitをインストールした場合は、「composer info | sort」の出力を含めてください。 -コードをテキストとして投稿してください(適切なマークアップを使用)。 コードのスクリーンショットを投稿しないでください。 -サポートを探している場合は、https://phpunit.de/support.htmlにアクセスしてください。 -問題を送信する前に、このコメントを削除してください。

| Q | 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.
featurprocess-isolation typbug

全てのコメント3件

私が確認する。

PHPDBGにのみ影響する問題のデバッグに時間を費やすことはありません。 正直なところ、php-code-coverageとPHPUnit自体からサポートを削除することを考えています。

例として、通常のPHPを使用すると、ストリームが読み取り不能として報告されます。

php -r 'echo stream_get_meta_data(STDOUT)["mode"], "\n";' | cat
// Outputs: wb

この問題は、PHP7.4.0で最初に発生しました。 これはPHPのバグかもしれませんが、よくわかりません。

このページは役に立ちましたか?
0 / 5 - 0 評価