使用异常断点时如何黑盒 PhpStorm 堆栈中的库

How to blackbox libraries in the PhpStorm stack when using exception breakpoints

我正在 运行 一些单元测试,通过 Codeception 使用 PHPUnit,当断言失败时,我想关注我的测试 class 断言失败的行。

通常我必须从终端输出中复制 class 名称和行号,然后使用 PhpStorm 的搜索然后 "goto line" 找到它停止的地方。重复这样做很累人(整天 TDD)。

我尝试在 PhpStorm 中启用 "Exception Breakpoints",因此 IDE 在抛出异常的行停止。这通常很好,但在这种情况下,它位于 assert 库的深处。我希望 IDE 自动将堆栈反转到我的文件并将我的注意力集中在那里。我可以在堆栈框架面板中手动执行此操作,当然它位于正确的行,但它又是重复的,因此很累人。

我知道有 Xdebug 黑盒工具:"Skipped Paths" 和 "Step Filters > Skipped Paths",但这些似乎不会影响捕获异常的焦点。

我乐观地希望,如果我将 PHPUnit 库文件黑盒化,异常停止点可能必须向上冒泡,直到它找到一个未黑盒化的文件。

例如

Test  tests/src/Domain/TestSession/TestSessionTest.php:testStart
'2019-03-22 17:05:15' does not match expected type "object".
mylib/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php:135   << It halts here
mylib/vendor/phpunit/phpunit/src/Framework/Assert.php:2060
mylib/vendor/phpunit/phpunit/src/Framework/Assert.php:485
mylib/tests/src/Domain/TestSession/TestSessionTest.php:93   << I want it to halt here in MY code
mylib/vendor/phpunit/phpunit/src/Framework/TestCase.php:1062
mylib/vendor/phpunit/phpunit/src/Framework/TestCase.php:913
mylib/vendor/phpunit/phpunit/src/Framework/TestResult.php:686
mylib/vendor/phpunit/phpunit/src/Framework/TestCase.php:868
mylib/vendor/phpunit/phpunit/src/Framework/TestSuite.php:733
mylib/vendor/codeception/phpunit-wrapper/src/Runner.php:110
mylib/vendor/codeception/codeception/src/Codeception/SuiteManager.php:158
mylib/vendor/codeception/codeception/src/Codeception/Codecept.php:192
mylib/vendor/codeception/codeception/src/Codeception/Codecept.php:159
mylib/vendor/codeception/codeception/src/Codeception/Command/Run.php:384
mylib/vendor/symfony/console/Command/Command.php:255
mylib/vendor/symfony/console/Application.php:953
mylib/vendor/symfony/console/Application.php:248
mylib/vendor/symfony/console/Application.php:148
mylib/vendor/codeception/codeception/src/Codeception/Application.php:108
mylib/vendor/codeception/codeception/codecept:43

我想看到问题所在的相关代码:

    $this->assertEquals($now, $ts->datetimeStarted);
at
mylib/tests/src/Domain/TestSession/TestSessionTest.php:93

不是断言机制中的这个无关代码:

        throw new PHPUnit_Framework_ExpectationFailedException(
            trim($description . "\n" . $f->getMessage()),
            $f
        );
at
mylib/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php:138

另一个奇怪的是,在启用异常断点的情况下,IDE 不会像普通断点那样进入前台焦点,而且内部焦点位于代码面板中,而不是堆栈框架面板中通常。所以我只关注外部终端 window(而不是内置的 IDE 终端)。如果它确实聚焦 IDE window,并且默认聚焦在堆栈面板,那么我只需按三下向下箭头即可。我可以忍受那种水平的 RSI。

MacOS 10.12.6
PhpStorm 2018.3.5

步进过滤器用于逐步执行程序,它不影响断点。这是一个请求跳过的路径以支持异常断点:https://youtrack.jetbrains.com/issue/WI-43959

我找到了我的一个子投诉(第二段)的子解决方案,它减少了对完整解决方案的需求。

PHPStorm (2018.3) 搜索框支持file:line格式,无需先搜索再上线。这可以节省很多时间。

所以我只需要从终端中的堆栈跟踪中间复制 TestSessionTest.php:93 并双移,然后将其粘贴到 IDE 中。它直接跳转到文件中的行。