PHPUnit - 我能根据PHP版本运行测试吗?

10

我正在编写一个库,应该与PHP 5.3+兼容。我想使用生成器和闭包绑定,但这些功能要求5.5+和5.4+版本。大多数库可以在没有这些特性的情况下运行,因此我希望仅在PHP具有正确版本时运行某些单元测试。有简单的方法可以做到这一点吗?

我正在寻找类似于以下的解决方案:

/** @version 5.4+*/
public function testUsingClosureBind(){...}

/** @version 5.5+*/
public function testUsingGenerators(){...}

但我愿意接受任何建议...


你不应该依赖于版本来执行测试。例如,在开发和集成机器上,你可以使用5.5版本并通过测试,但在生产环境中,你只有5.4版本,代码就会失败。虽然你看起来已经为它们编写了测试,但如果你没有执行所有的测试用例,那么这真的很糟糕。在这种情况下,应该有不同的测试服务器,使用不同的PHP版本,并始终运行所有测试用例。 - PolishDeveloper
5个回答

7
自 PHPUnit 3.7(至少)起,支持@requires注释。
<?php

use PHPUnit\Framework\TestCase;

final class SomeTest extends TestCase
{
    /**
     * @requires PHP 5.3
     */
    public function testSome()
    {
    }
}

请参考文档了解更多信息。

7

实现这个的一种适当方式可以是根据功能所针对的版本,在测试中使用 @group 进行注释:

/**
 * @group 5.4
 */
public function testUsingClosureBind() {...}

/**
 * @group 5.5
 */
public function testUsingGenerators() {...}

现在您可以执行属于特定组的测试,或忽略某个组:
phpunit --group 5.5
phpunit --group 5.4
phpunit --exclude-group 5.5

PHPUnit网站上的文档


谢谢,这正是我要找的。 - inf3rno

5

你为什么在我之后30分钟发布了几乎相同的内容? - hek2mgl
嗯,仔细看了一下,你是对的,它们非常相似。抱歉,我没有仔细阅读你的内容,只是匆匆浏览找到了 version_compare() 函数。我想我可以在你的答案下面留个评论。 - PolishDeveloper
1
没事,我只是在问而已。通常来说,你说的评论是可以的。不过,你使用version_compare()看起来稍微好一些。+1..但下次你知道了!;) - hek2mgl
但是这只适用于您不依赖注释(例如预期的异常)的情况。 - Calamity Jane

3
我知道这不是PHP单元测试组织的最佳实践,但如果您能够根据所需的PHP版本将这些方法放在不同的文件中,您可以在XML配置文件中使用以下内容:
   <testsuites>
    <testsuite name="My Test Suite">
      <directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">/path/to/files</directory>
      <file phpVersion="5.3.0" phpVersionOperator=">=">/path/to/MyTest.php</file>
    </testsuite>
  </testsuites>

请参见http://phpunit.de/manual/3.7/en/appendixes.configuration.html#appendixes.configuration.testsuites

谢谢,我会检查一下。 - inf3rno
我尝试了一下,但是不起作用:php 5.3.28,phpunit 3.7.34。 - inf3rno
1
问题在于文件不应该放在同一个目录下,我只是将其包含了... 它只有包含模式,没有排除模式... 也许我应该为我想要使用更高版本的 PHP 进行测试的文件设置不同的后缀名... - inf3rno

0

根据Sebastian的说法, 我应该使用@requires注释来实现。不能使用组,因为我无法根据php版本自动排除它们。

顺便说一下,这并没有帮助,因为我总是遇到解析错误,因为使用了yield::class...

他建议将版本相关的代码移动到另一个文件中,并使用以下内容:

<testsuite name="My Test Suite">
  <directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">/path/to/files</directory>
  <file phpVersion="5.3.0" phpVersionOperator=">=">/path/to/MyTest.php</file>
</testsuite>

该文件不应该位于/path/to/files目录下,除非你想要它被包含在内...

最后,我为与更高版本的PHP相关的测试添加了2个新的后缀:

    <testsuite name="unit tests">
        <directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">test/unit</directory>
        <directory suffix="Test54.php" phpVersion="5.4.0" phpVersionOperator=">=">test/unit</directory>
        <directory suffix="Test55.php" phpVersion="5.5.0" phpVersionOperator=">=">test/unit</directory>
    </testsuite>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接