Phpunit: El aislamiento de procesos bajo phpdbg arroja excepciones

Creado en 30 nov. 2019  ·  3Comentarios  ·  Fuente: sebastianbergmann/phpunit

- No informe un problema para una versión de PHPUnit que ya no sea compatible. Una lista de las versiones actualmente compatibles de PHPUnit está disponible en https://phpunit.de/supported-versions.html. - No informe un problema si está utilizando una versión de PHP que no es compatible con la versión de PHPUnit que está utilizando. Una lista que muestra qué versión de PHP es compatible con qué versión de PHPUnit está disponible en https://phpunit.de/supported-versions.html. - Complete esta plantilla de acuerdo con su problema. - Mantenga la tabla que se muestra a continuación en la parte superior de su problema. - Incluya la salida de "composer info | sort" si instaló PHPUnit usando Composer. - Publique el código como texto (utilizando el marcado adecuado). No publique capturas de pantalla de código. - Visite https://phpunit.de/support.html si está buscando soporte. - Elimina este comentario antes de enviar tu problema.

| Q | A
| -------------------- | ---------------
| Versión PHPUnit | 8.4.3
| Versión PHP | 7.4.0 (phpdbg SAPI)
| Método de instalación | Compositor

Resumen

El uso del aislamiento de procesos arroja excepciones por debajo de phpdbg . Al principio pensé que esto era una regresión del # 3772, pero parece ser una causa separada.

Creo que pude rastrear el error hasta esta línea en TestCaseMethod.tpl (también hay un código similar en TestCaseClass.tpl ). Ambas líneas intentan leer desde STDOUT , sin verificar primero si es un flujo legible.

Si pongo una declaración de depuración usando stream_get_meta_data(STDOUT) , puede ver que STDOUT no se puede leer:

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

Ver también:

Comportamiento actual

Cualquier prueba que use aislamiento de proceso bajo phpdbg no se ejecuta y, en su lugar, arroja una excepción similar a: 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 .

Como reproducir

Ejecute esta prueba en phpdbg :

<?php

use PHPUnit\Framework\TestCase;

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

Y mira esta salida:

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

Comportamiento esperado

El aislamiento de procesos debería funcionar para phpdbg de la misma manera que lo hace para otros SAPI de PHP.

Salida de 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

Todos 3 comentarios

Confirmo.

No invertiré tiempo en depurar un problema que solo afecte a PHPDBG. Para ser honesto, estoy pensando en eliminar el soporte de php-code -cover, así como de PHPUnit.

Solo por el bien de un ejemplo, cuando se usa PHP normal, también informará que la transmisión no se puede leer:

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

Este problema apareció por primera vez en PHP 7.4.0 . Esto podría ser un error de PHP, pero no lo sé mejor.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

stephen-leavitt-sonyatv-com picture stephen-leavitt-sonyatv-com  ·  4Comentarios

keradus picture keradus  ·  4Comentarios

sebastianbergmann picture sebastianbergmann  ·  4Comentarios

gellis picture gellis  ·  4Comentarios

stof picture stof  ·  3Comentarios