Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Process Isolation does not work when using PHPUnit from PHAR #2467

Closed
s3b4stian opened this issue Feb 3, 2017 · 3 comments
Closed

Process Isolation does not work when using PHPUnit from PHAR #2467

s3b4stian opened this issue Feb 3, 2017 · 3 comments
Assignees
Labels
type/bug Something is broken

Comments

@s3b4stian
Copy link

Good evening, I have this problem

phpunit not executes tests when @runInSeparateProcess annotation is used

I thought that the problem was from my virtual machine but updating of phpunit on travis, gave same result.

phpunit.xml

<phpunit  colors="true" verbose="true">
    <testsuites>
        <testsuite name="Test Suite">
            <directory suffix="Test.php">tests/issue</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist>
            <directory suffix=".php">src</directory>
        </whitelist>
    </filter>
</phpunit>

Test

<?php

declare(strict_types=1);

use PHPUnit\Framework\TestCase;

class issueTest extends TestCase
{
    public function testIssue()
    {
        $this->assertEquals(true, true);
    }
}

Output

sebastian@ubuntuvirtual1604:/var/www/html/framework$ phpunit
PHPUnit 6.0.2 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.15-1+deb.sury.org~xenial+1 with Xdebug 2.5.0
Configuration: /var/www/html/framework/phpunit.xml

.                                                                   1 / 1 (100%)

Time: 240 ms, Memory: 8.00MB

OK (1 test, 1 assertion)

All OK,

After adding annotation phpunit not starts tests, using strict_types=1 is indifferent

Test

<?php

declare(strict_types=1);

use PHPUnit\Framework\TestCase;

class issueTest extends TestCase
{
    /**
     * @runInSeparateProcess
     */
    public function testIssue()
    {
        $this->assertEquals(true, true);
    }
}

Output (ctrl+c after some time)

sebastian@ubuntuvirtual1604:/var/www/html/framework$ phpunit
PHPUnit 6.0.2 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.15-1+deb.sury.org~xenial+1 with Xdebug 2.5.0
Configuration: /var/www/html/framework/phpunit.xml


^C
sebastian@ubuntuvirtual1604:/var/www/html/framework$
@hollodotme
Copy link

I have the same issue.

  • Ubuntu 16.04.1 LTS
  • PHP 7.1.0-2+deb.sury.org~xenial+1
  • Xdebug v2.5.0
  • PHPUnit 6.0.2 via PHAR file

Test:

class InSeparateTest extends \PHPUnit\Framework\TestCase
{
	/**
	 * @runInSeparateProcess
	 */
	public function testCanRunInSeparateProcess()
	{
		$this->assertTrue( true );
	}
}

The execution prints:

vendor/bin/phpunit.phar tests/Unit/InSeparateTest.php
PHPUnit 6.0.2 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 491 ms, Memory: 8.00MB

There was 1 error:

1) IceHawk\IceHawk\Tests\Unit\InSeparateTest::testCanRunInSeparateProcess
PHPUnit\Framework\Exception: PHPUnit 6.0.2 by Sebastian Bergmann and contributors.

Usage: phpunit [options] UnitTest [UnitTest.php]
       phpunit [options] <directory>

# ... whole PHPUnit help ... #

Caused by
ErrorException: unserialize(): Error at offset 0 of 4989 bytes in phar:///vagrant/vendor/bin/phpunit.phar/phpunit/Util/PHP/AbstractPhpProcess.php:300
Stack trace:
#0 [internal function]: PHPUnit\Util\PHP\AbstractPhpProcess->PHPUnit\Util\PHP\{closure}(8, 'unserialize(): ...', 'phar:///vagrant...', 300, Array)
#1 phar:///vagrant/vendor/bin/phpunit.phar/phpunit/Util/PHP/AbstractPhpProcess.php(300): unserialize('PHPUnit 6.0.2 b...')
#2 phar:///vagrant/vendor/bin/phpunit.phar/phpunit/Util/PHP/AbstractPhpProcess.php(205): PHPUnit\Util\PHP\AbstractPhpProcess->processChildResult(Object(IceHawk\IceHawk\Tests\Unit\InSeparateTest), Object(PHPUnit\Framework\TestResult), 'PHPUnit 6.0.2 b...', '')
#3 phar:///vagrant/vendor/bin/phpunit.phar/phpunit/Framework/TestCase.php(865): PHPUnit\Util\PHP\AbstractPhpProcess->runTestJob('<?php\nuse Sebas...', Object(IceHawk\IceHawk\Tests\Unit\InSeparateTest), Object(PHPUnit\Framework\TestResult))
#4 phar:///vagrant/vendor/bin/phpunit.phar/phpunit/Framework/TestSuite.php(739): PHPUnit\Framework\TestCase->run(Object(PHPUnit\Framework\TestResult))
#5 phar:///vagrant/vendor/bin/phpunit.phar/phpunit/TextUI/TestRunner.php(514): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult))
#6 phar:///vagrant/vendor/bin/phpunit.phar/phpunit/TextUI/Command.php(206): PHPUnit\TextUI\TestRunner->doRun(Object(PHPUnit\Framework\TestSuite), Array, true)
#7 phar:///vagrant/vendor/bin/phpunit.phar/phpunit/TextUI/Command.php(135): PHPUnit\TextUI\Command->run(Array, true)
#8 /vagrant/vendor/bin/phpunit.phar(458): PHPUnit\TextUI\Command::main()
#9 {main}
ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

Following the trace this might be the problem:

#1 phar:///vagrant/vendor/bin/phpunit.phar/phpunit/Util/PHP/AbstractPhpProcess.php(300): unserialize('PHPUnit 6.0.2 b...')

@sebastianbergmann sebastianbergmann added 6.0 type/bug Something is broken labels Feb 3, 2017
@sebastianbergmann
Copy link
Owner

Confirmed: process isolation does not work when PHPUnit 6 is used from a PHAR:

$ cat Test.php 
<?php
declare(strict_types=1);

use PHPUnit\Framework\TestCase;

class Test extends TestCase
{
    /**
     * @runInSeparateProcess
     */
    public function testIssue()
    {
        $this->assertEquals(true, true);
    }
}
$ phpunit Test
PHPUnit 6.0.2 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 86 ms, Memory: 4.00MB

OK (1 test, 1 assertion)
$ php phpunit-6.0.phar Test                    
PHPUnit 6.0.2 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 126 ms, Memory: 8.00MB

There was 1 error:

1) Test::testIssue
PHPUnit\Framework\Exception: PHPUnit 6.0.2 by Sebastian Bergmann and contributors.

Usage: phpunit [options] UnitTest [UnitTest.php]
       phpunit [options] <directory>

Code Coverage Options:

  --coverage-clover <file>    Generate code coverage report in Clover XML format.
  --coverage-crap4j <file>    Generate code coverage report in Crap4J XML format.
  --coverage-html <dir>       Generate code coverage report in HTML format.
  --coverage-php <file>       Export PHP_CodeCoverage object to file.
  --coverage-text=<file>      Generate code coverage report in text format.
                              Default: Standard output.
  --coverage-xml <dir>        Generate code coverage report in PHPUnit XML format.
  --whitelist <dir>           Whitelist <dir> for code coverage analysis.
  --disable-coverage-ignore   Disable annotations for ignoring code coverage.

Logging Options:

  --log-junit <file>          Log test execution in JUnit XML format to file.
  --log-teamcity <file>       Log test execution in TeamCity format to file.
  --testdox-html <file>       Write agile documentation in HTML format to file.
  --testdox-text <file>       Write agile documentation in Text format to file.
  --testdox-xml <file>        Write agile documentation in XML format to file.
  --reverse-list              Print defects in reverse order

Test Selection Options:

  --filter <pattern>          Filter which tests to run.
  --testsuite <name,...>      Filter which testsuite to run.
  --group ...                 Only runs tests from the specified group(s).
  --exclude-group ...         Exclude tests from the specified group(s).
  --list-groups               List available test groups.
  --list-suites               List available test suites.
  --test-suffix ...           Only search for test in files with specified
                              suffix(es). Default: Test.php,.phpt

Test Execution Options:

  --dont-report-useless-tests Do not report tests that do not test anything.
  --strict-coverage           Be strict about @covers annotation usage.
  --strict-global-state       Be strict about changes to global state
  --disallow-test-output      Be strict about output during tests.
  --disallow-resource-usage   Be strict about resource usage during small tests.
  --enforce-time-limit        Enforce time limit based on test size.
  --disallow-todo-tests       Disallow @todo-annotated tests.

  --process-isolation         Run each test in a separate PHP process.
  --globals-backup            Backup and restore $GLOBALS for each test.
  --static-backup             Backup and restore static attributes for each test.

  --colors=<flag>             Use colors in output ("never", "auto" or "always").
  --columns <n>               Number of columns to use for progress output.
  --columns max               Use maximum number of columns for progress output.
  --stderr                    Write to STDERR instead of STDOUT.
  --stop-on-error             Stop execution upon first error.
  --stop-on-failure           Stop execution upon first error or failure.
  --stop-on-warning           Stop execution upon first warning.
  --stop-on-risky             Stop execution upon first risky test.
  --stop-on-skipped           Stop execution upon first skipped test.
  --stop-on-incomplete        Stop execution upon first incomplete test.
  --fail-on-warning           Treat tests with warnings as failures.
  --fail-on-risky             Treat risky tests as failures.
  -v|--verbose                Output more verbose information.
  --debug                     Display debugging information.

  --loader <loader>           TestSuiteLoader implementation to use.
  --repeat <times>            Runs the test(s) repeatedly.
  --teamcity                  Report test execution progress in TeamCity format.
  --testdox                   Report test execution progress in TestDox format.
  --testdox-group             Only include tests from the specified group(s).
  --testdox-exclude-group     Exclude tests from the specified group(s).
  --printer <printer>         TestListener implementation to use.

Configuration Options:

  --bootstrap <file>          A "bootstrap" PHP file that is run before the tests.
  -c|--configuration <file>   Read configuration from XML file.
  --no-configuration          Ignore default configuration file (phpunit.xml).
  --no-coverage               Ignore code coverage configuration.
  --no-extensions             Do not load PHPUnit extensions.
  --include-path <path(s)>    Prepend PHP's include_path with given path(s).
  -d key[=value]              Sets a php.ini value.
  --generate-configuration    Generate configuration file with suggested settings.

Miscellaneous Options:

  -h|--help                   Prints this usage information.
  --version                   Prints the version and exits.
  --atleast-version <min>     Checks that version is greater than min and exits.

  --check-version             Check whether PHPUnit is the latest version.

Caused by
ErrorException: unserialize(): Error at offset 0 of 4989 bytes in phar:///home/sb/phpunit-6.0.phar/phpunit/Util/PHP/AbstractPhpProcess.php:300
Stack trace:
#0 [internal function]: PHPUnit\Util\PHP\AbstractPhpProcess->PHPUnit\Util\PHP\{closure}(8, 'unserialize(): ...', 'phar:///home/sb...', 300, Array)
#1 phar:///home/sb/phpunit-6.0.phar/phpunit/Util/PHP/AbstractPhpProcess.php(300): unserialize('PHPUnit 6.0.2 b...')
#2 phar:///home/sb/phpunit-6.0.phar/phpunit/Util/PHP/AbstractPhpProcess.php(205): PHPUnit\Util\PHP\AbstractPhpProcess->processChildResult(Object(Test), Object(PHPUnit\Framework\TestResult), 'PHPUnit 6.0.2 b...', '')
#3 phar:///home/sb/phpunit-6.0.phar/phpunit/Framework/TestCase.php(865): PHPUnit\Util\PHP\AbstractPhpProcess->runTestJob('<?php\nuse Sebas...', Object(Test), Object(PHPUnit\Framework\TestResult))
#4 phar:///home/sb/phpunit-6.0.phar/phpunit/Framework/TestSuite.php(739): PHPUnit\Framework\TestCase->run(Object(PHPUnit\Framework\TestResult))
#5 phar:///home/sb/phpunit-6.0.phar/phpunit/TextUI/TestRunner.php(514): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult))
#6 phar:///home/sb/phpunit-6.0.phar/phpunit/TextUI/Command.php(206): PHPUnit\TextUI\TestRunner->doRun(Object(PHPUnit\Framework\TestSuite), Array, true)
#7 phar:///home/sb/phpunit-6.0.phar/phpunit/TextUI/Command.php(135): PHPUnit\TextUI\Command->run(Array, true)
#8 /home/sb/phpunit-6.0.phar(458): PHPUnit\TextUI\Command::main()
#9 {main}
ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

@sebastianbergmann sebastianbergmann self-assigned this Feb 3, 2017
@sebastianbergmann
Copy link
Owner

sebastianbergmann commented Feb 3, 2017

Looks like process isolation assumes that PHPUnit PHAR can be used as a library. Which it cannot be used as since PHPUnit 6.0.

See #1926 and 5e6595f.

@sebastianbergmann sebastianbergmann changed the title phpunit 6.0.2 not executes tests when @runInSeparateProcess annotation is used Process Isolation does not work when using PHPUnit from PHAR Feb 3, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type/bug Something is broken
Projects
None yet
Development

No branches or pull requests

3 participants