使用异常断点时如何在PhpStorm堆栈中对库进行黑匣子

时间:2019-03-22 06:44:07

标签: php phpstorm xdebug

我正在通过Codeception使用PHPUnit运行一些单元测试,并且当断言失败时,我想着重于断言失败的测试类中的那一行。

通常,我必须从终端输出中复制类名和行号,并同时使用PhpStorm的搜索,然后使用“转到行”来查找停止的位置。重复(整天TDD)重复这样做很累。

我尝试在PhpStorm中启用“异常断点”,因此IDE停止在引发异常的行。通常,这很好,但是在这种情况下,它位于assert库的深处。我希望IDE自动将堆栈移到我的文件中,并集中精力在那。我可以在堆栈框架面板中手动进行此操作,这当然是正确的做法,但是它又是重复性的,因此很累人。

我知道有用于Xdebug的黑盒工具:“跳过的路径”和“步骤过滤器>跳过的路径”,但是这些似乎并不影响捕获的异常的集中。

我乐观地希望,如果我对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不会像使用常规断点那样成为前台焦点,而且内部焦点位于代码面板中,而不是通常的堆栈框架面板中。因此,我将注意力集中在外部“终端”窗口(而不是内置的IDE终端)上。如果它确实聚焦于IDE窗口,并且默认情况下聚焦于堆栈面板,那么我可以按向下箭头键三下。我可以忍受那种水平的RSI。

MacOS 10.12.6
PhpStorm 2018.3.5

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

PHPStorm(2018.3)在搜索框中支持file:line格式,因此您无需使用搜索然后转到行。这可节省大量时间。

因此,我只需要从终端中堆栈跟踪的中间复制TestSessionTest.php:93并进行两次移位,然后将其粘贴到IDE中即可。它直接跳到文件中的行。