Phpunit: Prozessisolation unter phpdbg löst Ausnahmen aus

Erstellt am 30. Nov. 2019  ·  3Kommentare  ·  Quelle: sebastianbergmann/phpunit

- Bitte melden Sie kein Problem für eine Version von PHPUnit, die nicht mehr unterstützt wird. Eine Liste der aktuell unterstützten Versionen von PHPUnit finden Sie unter https://phpunit.de/supported-versions.html. - Bitte melden Sie kein Problem, wenn Sie eine PHP-Version verwenden, die von der von Ihnen verwendeten PHPUnit-Version nicht unterstützt wird. Eine Liste, welche PHP-Version von welcher PHPUnit-Version unterstützt wird, finden Sie unter https://phpunit.de/supported-versions.html. - Bitte füllen Sie diese Vorlage entsprechend Ihrem Anliegen aus. - Bitte halten Sie die unten stehende Tabelle am Anfang Ihres Problems. - Bitte fügen Sie die Ausgabe von "composer info | sort" hinzu, wenn Sie PHPUnit mit Composer installiert haben. - Bitte Code als Text posten (mit dem richtigen Markup). Posten Sie keine Screenshots von Code. - Besuchen Sie https://phpunit.de/support.html, wenn Sie Unterstützung suchen. - Bitte entfernen Sie diesen Kommentar, bevor Sie Ihr Problem absenden.

| Q | EIN
| --------------------| --------------
| PHPUnit-Version | 8.4.3
| PHP-Version | 7.4.0 (phpdbg-SAPI)
| Installationsmethode | Komponist

Zusammenfassung

Die Verwendung der Prozessisolation löst Ausnahmen unter phpdbg . Zuerst dachte ich, dies sei eine Regression von #3772, aber es scheint eine separate Ursache zu sein.

Ich glaube, ich konnte den Fehler bis zu dieser Zeile in TestCaseMethod.tpl aufspüren (es gibt auch ähnlichen Code in TestCaseClass.tpl ). Beide Zeilen versuchen, von STDOUT zu lesen, ohne zuerst zu prüfen, ob es sich um einen lesbaren Stream handelt.

Wenn ich eine Debug-Anweisung mit stream_get_meta_data(STDOUT) einfüge, können Sie sehen, dass STDOUT nicht lesbar ist:

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"
}

Siehe auch:

Aktuelles Verhalten

Jeder Test, der die Prozessisolation unter phpdbg verwendet, wird nicht ausgeführt und löst stattdessen eine ähnliche Ausnahme aus: 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 .

So reproduzieren Sie

Führen Sie diesen Test unter phpdbg :

<?php

use PHPUnit\Framework\TestCase;

class ReproTest extends TestCase
{
    /**
     * <strong i="20">@doesNotPerformAssertions</strong>
     * <strong i="21">@runInSeparateProcess</strong>
     */
    public function testProcessIsolation()
    {
    }
}

Und sehen Sie sich diese Ausgabe an:

$ 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.

Erwartetes Verhalten

Die Prozessisolation sollte für phpdbg genauso funktionieren wie für andere PHP-SAPIs.

Ausgabe von 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

Alle 3 Kommentare

Ich bestätige.

Ich werde keine Zeit in das Debuggen eines Problems investieren, das nur PHPDBG betrifft. Um ehrlich zu sein, denke ich darüber nach, die Unterstützung dafür aus der PHP-Code-Abdeckung sowie aus PHPUnit selbst zu entfernen.

Nur als Beispiel: Wenn Sie normales PHP verwenden, wird der Stream auch als nicht lesbar gemeldet:

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

Dieses Problem trat erstmals in PHP 7.4.0 auf . Dies könnte ein PHP-Bug sein, aber ich weiß es nicht besser.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen