PHPUnit 分段错误

2022-08-30 16:24:56

当PHPUnit测试在我的开发盒(Linux Mint)上正常失败时,它会导致我的Continous Integration box(Centos)上出现“分段错误”。两台计算机都运行相同版本的 PHPUnit。我的开发盒运行的是 PHP 5.3.2-1ubuntu4.9,CI 是 PHP 5.2.17。我宁愿将升级PHP作为最后的手段。

根据这个线程:PHPUnit得到分段错误,我已尝试停用/重新安装Xdebug。我没有安装 inclue.so。

在CI框中,我目前只有两个扩展处于活动状态:来自php-xml的dom(phpunit需要)和memcache(我的框架需要),所有其他扩展都已关闭。


答案 1

除了 cweiske 建议的,如果升级 PHP 不是你的选择,并且你很难找到 segfault 的源代码,你可以使用调试器来了解更多信息。

您可以通过这种方式启动 gdb 来调试 PHPUnit 会话:

gdb --args php /usr/bin/phpunit quiz_service_Test.php

然后键入以运行程序和/或首先设置环境变量。r

set env MALLOC_CHECK_=3
r

您还可以考虑在系统上安装 PHP 的调试符号,以获得更好的调试结果。gdb在启动时为您检查这一点,并留下如何执行此操作的通知。


答案 2

我遇到了PHPUnit segfaulting的问题,并且很难找到答案,所以希望这可以帮助以后遇到同样问题的人。

PHPUnit 是 segfaulting,但只有:

  • 如果存在错误(或多个错误)
  • 在所有测试运行之后,但在打印错误之前

过了一会儿,我意识到这是由于使用数据提供程序的测试失败,特别是对于传递具有大量递归引用的对象的数据提供程序。一个铃铛终于响了,我做了一些挖掘:问题是,当你使用数据提供者并且测试失败时,PHPUnit会尝试为失败描述创建提供的参数的字符串表示,以告诉你失败的原因,但是当其中一个参数具有一些无限递归时,这是有问题的。事实上,PHPUnit 在(大约第 1612 行)所做的是打印出数据提供者使用 提供的所有参数,当 PHP 尝试创建无限递归对象的字符串表示时,这会导致 segfault。PHPUnit_Framework_TestCase::dataToString()print_r

我得出的解决方案是:

  1. 为我的所有测试类使用单个基类(幸运的是,我已经在这样做了)
  2. 在我的测试基类中重写,以检查数据数组中的这些类型的对象(在我的情况下是可能的,因为我知道这些对象的样子)。如果对象存在,我将返回一些特殊值,如果没有,我只是将其传递给父方法。dataToString()

推荐