Exception PHPUnit_框架_例外

Exception PHPUnit_框架_例外,exception,phpunit,Exception,Phpunit,我正在用PHPUnit编程一些测试,最近,我遇到了标志选项:--进程隔离在阅读了它在一个单独的PHP进程中运行每个测试后,我认为在执行TestSuite时使用这个标志可能会有所帮助。但是,它不断引发例外情况,例如: PHPUnit_Framework_Exception: stty: Standard Input: Invalid Argument 或者有时: PHPUnit_Framework_Exception: Notice: Constant PEAR_ERROR_RETURN alr

我正在用PHPUnit编程一些测试,最近,我遇到了标志选项:--进程隔离在阅读了它在一个单独的PHP进程中运行每个测试后,我认为在执行TestSuite时使用这个标志可能会有所帮助。但是,它不断引发例外情况,例如:

PHPUnit_Framework_Exception: stty: Standard Input: Invalid Argument
或者有时:

PHPUnit_Framework_Exception: Notice: Constant PEAR_ERROR_RETURN already defined in /usr/share/php/PEAR.php on line 25
Notice: Constant PEAR_ERROR_PRINT already defined in /usr/share/php/PEAR.php on line 26
Notice: Constant PEAR_ERROR_TRIGGER already defined in /usr/share/php/PEAR.php on line 27
Notice: Constant PEAR_ERROR_DIE already defined in /usr/share/php/PEAR.php on line 28
Notice: Constant PEAR_ERROR_CALLBACK already defined in /usr/share/php/PEAR.php on line 29
Notice: Constant PEAR_ERROR_EXCEPTION already defined in /usr/share/php/PEAR.php on line 34
Notice: Constant PEAR_ZE2 already defined in /usr/share/php/PEAR.php on line 37
Notice: Constant OS_WINDOWS already defined in /usr/share/php/PEAR.php on line 44
Notice: Constant OS_UNIX already defined in /usr/share/php/PEAR.php on line 45
Notice: Constant PEAR_OS already defined in /usr/share/php/PEAR.php on line 46
第一个异常只有在我激活进程隔离标志时才会出现,而我没有,测试运行平稳,没有任何问题。 第二个例外,从第一方面来说,我认为可能是由于包含中存在冲突,但在仔细查看并将所有包含更改为包含_一次后,仍然会出现例外

任何帮助都将不胜感激。

尝试添加:

/**
 * @runInSeparateProcess
 * @preserveGlobalState disabled
 */

在您的测试之上调用PHPDoc,而不是使用命令行选项。该标志可能仍然保留测试之间的全局变量。

我已经深入研究了这个问题。我将在假设PHPUnit 3.7正在使用的基础上解释发生了什么

当您使用进程隔离时,PHPUnit仍然将全局状态注入子进程。在这一点上,我可能会听到一些反对者说,默认情况下保留GlobalState与运行独立进程的意图相矛盾。直到我意识到phpunit.xml有一个定义全局变量/常量/includePath的部分之前,我一直在以同样的方式思考-如果没有保留GlobalState,这些设置将永远不会进入子进程。所以现在我确信在大多数情况下需要将全局状态注入子进程:我们需要做的就是确保这个全局状态足够干净,可以运行测试

塞巴斯蒂安·伯格曼(Sebastian Bergmann)编写了一些代码,用于导出全局/常量/所需文件,并将其放入Smarty模板中,而Smarty模板又变成了chlid进程的PHP脚本。然而,他犯了一个小错误(在我看来):他在所需文件之前加载常量,而不是之后加载常量。这就大不一样了!下面是一个例子:

requiredfile.php:

<?php

define("SOME_CONSTANT", true);

class RequiredClass
 {
 }

?>

当父PHPUnit进程加载此文件时,它定义了常量,并将requiredfile.php添加到包含的文件列表中

然后PHPUnit为子对象生成PHP脚本,基本上如下所示:

<?php

define("SOME_CONSTANT", true);

require_once "requiredfile.php";

?>

当然,它会导致PHP触发错误(已定义常量),该错误由PHPUnit转换为异常,因为它不知道该错误不是由测试代码触发的,而是由PHPUnit生成的代码触发的

然而,这段代码中的常量定义有if(defined()),因此,如果我们只是将常量定义放在所需文件之后,则不会发生常量重新定义,因此不会出现错误

PHPT测试失败的罪魁祸首是PEAR.php,您无法避免它,因为PHPUnit使用PEAR中的RunTest。因此,除非您在PHPUnit 3.7中修复Smarty模板,否则您将无法运行任何PHPT测试以及任何使用流程隔离的测试


那你需要做什么呢?容易的!前往PHPUnit/Framework/Process/TestCaseMethod.tpl.dist并交换{constants}和{included_files}。对于每个人来说,这可能不是最好的解决方案,尤其是当您无法更改PHPUnit文件时。但我个人认为它是PHPUnice中的一个bug,因此这样的修复是有必要的。

您找到了解决方案吗?今天,相关的修复程序被引入PHPUnice 4.8及以上。