10

我一直很高兴在我的 Ubuntu 机器上编码。这是一台具有大量 RAM 的强大机器。我正在研究 4 个新课程,边写边写和运行单元测试。在某些时候,我注意到,虽然单元测试完成得很好,但代码覆盖率却没有。

在消息“正在生成代码覆盖率报告......等等......”之后,我会收到一条消息说 zend_mm_heap 已损坏。我尝试了一些修复,包括:在我的 php.ini 中设置(apache2 和 cli),并从我的代码中output_buffering = On删除调用。unset()(我阅读了这些可能需要修复的内容)。

现在,无论我做什么,我似乎都在 zend_mm... 错误和分段错误(核心转储)错误之间交替出现。我注释掉测试,直到我缩小我认为导致问题的那个,并在那里进行一些更改,直到我得到一个干净的运行。然后我将取消所有测试的注释,只是为了发现故障仍然存在。

有任何想法吗?我可以使用什么工具或方法来收集更多信息?

我正在使用 PHP_CodeCoverage 1.2.6、PHP 5.3.10-1ubuntu3.5、PHPUnit 3.7.9。

编辑:

顺便说一句,我找不到任何核心转储文件。从我的两个物理磁盘的根目录中搜索,但没有运气。我已经阅读了关于核心的 man 条目,包括核心转储未创建文件的可能原因,但我认为这些都不适用。

4

3 回答 3

24

我最近有同样的问题。这似乎是 PHP 垃圾收集的问题。在 phpunit 运行期间禁用垃圾收集解决了我的问题。

添加:

zend.enable_gc=0 

到您的php.ini文件或从命令行使用:

phpunit -d zend.enable_gc=0
于 2013-02-01T01:12:01.753 回答
3

在运行具有代码覆盖率的 PhpUnit 时,有时很难理解 Segmentation fault 错误。我在 PHP 7.0.5 上遇到了带有 2 个版本的 PhpUnit 的分段错误。

最后,在我的情况下跟踪问题后,这样的事情导致了分段错误

$x = doSomething(doSomethingElse());

并将内部函数提取到变量中,如下所示:

$y = doSomethingElse();
$x = doSomething($y);

解决了这个问题。上面的代码当然是简化的代码,但是您应该了解有时代码中没有真正的错误,但是您应该修改它以使具有代码覆盖率的 PhpUnit 为您的代码工作。

于 2016-05-30T16:42:40.563 回答
1

我遇到了同样的问题并尝试使用 zend.enable_gc=0,但随后 phpunit 内存不足。为了解决这个问题,我基本上修改了我的覆盖白名单,使其更加细化。所以,在 phpunit.xml 中,我以前有这个:

<filter>
    <whitelist>
        <directory suffix=".php">../application/src</directory>
    </whitelist>
</filter>

我把它改成这样:

<filter>
    <whitelist>
        <directory suffix=".php">../application/src/module1</directory>
        <directory suffix=".php">../application/src/module2</directory>
        <directory suffix=".php">../application/src/module3</directory>
        <exclude>
            <directory>../application/src/module1/views</directory>
        </exclude>

    </whitelist>
</filter>

因此,只需尝试将过滤器限制为仅包含实际重要的文件。这仍然是一个错误,但现在我认为限制考虑进行覆盖率计算的文件数量将有助于防止此类问题。

于 2013-10-28T15:36:46.670 回答