【问题标题】:Disabling stack trace on PHPUnit exception在 PHPUnit 异常上禁用堆栈跟踪
【发布时间】:2013-05-24 06:03:05
【问题描述】:

当 PHPUnit 断言失败时,我不需要下面的堆栈跟踪,只需要我的自定义消息 ("Type: R Expected: 333.33333333333 Actual: 345") 和 PHPUnit 的失败消息 ("Failed assert that false is true")

除了将我的所有测试放在 try/catch 块中并在显示异常消息之前从异常消息中剥离堆栈跟踪之外,还有其他方法吗?

我真的不希望堆栈跟踪消失除 PHPUnit_Framework_ExpectationFailedException 以外的任何异常,但是如果这不可能,我可以处理在所有 PHPUnit 测试期间丢失堆栈跟踪。

SO 上的其他帖子似乎建议了针对相反问题的解决方案,当 xdebug 将其关闭时获取堆栈跟踪。

PHPUnit_Framework_ExpectationFailedException : Type: R Expected: 333.33333333333 Actual: 345
Failed asserting that false is true.
#0 /usr/share/php/PHPUnit/Framework/Constraint.php(91): PHPUnit_Framework_Constraint->fail(false, 'Type: R Expecte...')
#1 /usr/share/php/PHPUnit/Framework/Assert.php(2134): PHPUnit_Framework_Constraint->evaluate(false, 'Type: R Expecte...')
#2 /usr/share/php/PHPUnit/Framework/Assert.php(888): PHPUnit_Framework_Assert::assertThat(false, Object(PHPUnit_Framework_Constraint_IsTrue), 'Type: R Expecte...')
#3 /home/simon/Development/golfants/website/unit_tests/PostTest.php(33): PHPUnit_Framework_Assert::assertTrue(false, 'Type: R Expecte...')
#4 [internal function]: PostTest->testRandomAntTypeSelected()
#5 /usr/share/php/PHPUnit/Framework/TestCase.php(976): ReflectionMethod->invokeArgs(Object(PostTest), Array)
#6 /usr/share/php/PHPUnit/Framework/TestCase.php(831): PHPUnit_Framework_TestCase->runTest()
#7 /usr/share/php/PHPUnit/Framework/TestResult.php(648): PHPUnit_Framework_TestCase->runBare()
#8 /usr/share/php/PHPUnit/Framework/TestCase.php(776): PHPUnit_Framework_TestResult->run(Object(PostTest))
#9 /usr/share/php/PHPUnit/Framework/TestSuite.php(775): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult))
#10 /usr/share/php/PHPUnit/Framework/TestSuite.php(745): PHPUnit_Framework_TestSuite->runTest(Object(PostTest), Object(PHPUnit_Framework_TestResult))
#11 /usr/share/php/PHPUnit/TextUI/TestRunner.php(349): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false)
#12 /usr/share/php/PHPUnit/TextUI/Command.php(176): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array)
#13 /tmp/ide-phpunit.php(95): PHPUnit_TextUI_Command->run(Array, true)
#14 /tmp/ide-phpunit.php(434): IDE_PHPUnit_TextUI_Command::main()
#15 {main}

更新

看来这个问题是由 IDE(IntelliJ Idea 和可能的 PHPStorm)在单元测试时没有直接调用 PHPUnit 而是通过它自己的脚本 ide_phpunit.php 引起的。从命令行直接调用 PHPUnit 不会出现该问题。这个 ide_phpunit.php 脚本每次都是由 IDE 创建的,所以修改并不容易,也不喜欢被写保护以防止覆盖。可能有一个简单的解决方案,但我把这个放在“不值得努力”的篮子里。

【问题讨论】:

  • 我完全不明白你为什么要禁用堆栈跟踪?如果抛出异常并且未被捕获 - 这意味着某些东西被破坏了(你想看看它到底是什么)。另一方面,如果您的逻辑抛出异常——并且您想对其进行测试,您将使用 PHPUnit 的“setExpectedException”方法并且您不会遇到您所描述的问题。或者我错过了什么?
  • 即使在执行简单的 assertTrue(false) 时也会抛出此异常,因此我假设 PHPUnit 的行为是在断言失败时抛出此异常。 assertTrue(true) 不会引发异常。您是否建议这个异常表明一个更大的问题,而不仅仅是我的测试的断言没有被断言?
  • 嗯,是的,肯定有问题。你根本不应该看到这个异常。你有哪个版本的 PHPUnit?
  • PHPUnit 3.7.21 和 PHP5.3.10-1。我看到 PHPUnit 3.7 需要 PHP>=5.3.3 但强烈推荐 PHP>=5.4.7。我还不能升级 PHP,我会尝试降级 PHPUnit。
  • 我已经发布了答案,因为它更容易呈现代码 sn-p。如果仍有问题,请尝试我发布的测试。

标签: php exception-handling phpunit


【解决方案1】:

这只会在您启用 xdebug 并且 xdebug.show_exception_trace 设置为 1 时发生,要逆转此行为的影响,您可以禁用 xdebug(仅当您不生成覆盖率报告时)或将 xdebug.show_exception_trace 设置为 0。

xdebug_enable();
ini_set('xdebug.show_exception_trace', 0);

所以添加上述代码将为您禁用堆栈跟踪。

代码示例:

// below statements are given here just for illustration this should be added in
// proper places
xdebug_enable();
ini_set('xdebug.show_exception_trace', 0);

class FooTest extends PHPUnit_Framework_TestCase
{
    public function testBar()
    {
        $this->assertTrue(false);
    }
}
?>

参考:Why does PHPUnit hide my xdebug backtrace?

【讨论】:

  • 跟踪似乎来自 PHP 而不是 xdebug。我之前确实阅读了链接的帖子并明确关闭了 show_exception_trace (即使它默认关闭)但跟踪仍然存在。它甚至完全删除了 xdebug。
【解决方案2】:

我下载了 PHPUnit 3.7.21。我已经运行了这个测试:

class FooTest extends \PHPUnit_Framework_TestCase
{
    public function testBar()
    {
        $this->assertTrue(false);
    }
}

一切看起来都不错,这是我的输出:

./vendor/bin/phpunit ./test.php
Sebastian Bergmann 的 PHPUnit 3.7.21。

F

时间:0 秒,内存:2.50Mb

有 1 次失败:

1) FooTest::testBar 断言 false 为 true 失败。

/home/cypis/devel/phpunit/test.php:7

失败!测试:1,断言:1,失败:1。

您是否使用\PHPUnit_Framework_TestCase 类扩展了您的测试?

【讨论】:

  • 这个测试也因同样的问题而失败,但是我发现它(和我的测试)只是从我的 IDE 失败(它正在解析一个 ide-phpunit.php 脚本。运行你的测试和我的两个都可以与 PHPUnit 测试运行器(phpunit FooTest FooTest.php)一起工作。我会研究那个脚本。
  • 所以有一些进展 :) 哪个 IDE?
  • IDE 是 Idea 11,每次测试完成时都会动态创建这个 ide-phpunit.php 脚本。计划在它出现时升级到 13,所以暂时只能容忍这种情况。感谢您的帮助。
  • 我会在可能的情况下发布赏金并将其奖励给您的帮助。
  • 不需要赏金 - 真的 :) 但是谢谢。不幸的是,我无法提供更多帮助,因为我没有 Idea,所以我只希望解决问题好运。干杯!
猜你喜欢
  • 2011-01-05
  • 2017-08-06
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多