无法使用 pytest 在 pycharm 中进行调试

Unable to debug in pycharm with pytest

我无法使用 py.test 在 PyCharm 中 调试 。所有测试套件在 "Debug mode" 中 运行 正常,但它不会在断点处停止。

我也有 py.test 作为默认测试运行程序。

也许这并不重要,但在我的 Django 服务器中调试工作正常。

有什么想法吗?

picture of enable_breakpoints_and_the_mode_of_pycharm_is_debug

参考文献:

pycharm-enabling-disabling-and-removing-breakpoints

Run/Debug Configuration: py.test

对于我的情况,我发现问题是什么:

如果pytest.ini中有--cov,则pycharm中的断点将不起作用,将pytest.ini中的--cov全部删除后,断点在 pycharm 可以工作。

原因:

“覆盖模块和 pycharm 的调试器使用相同的跟踪 api (sys.settrace) - 它们不能一起工作。” -- https://github.com/pytest-dev/pytest-cov/issues/131

参考文献:

How to debug py.test in PyCharm when coverage is enabled

TL;DR:禁用 "Build, execution, Deployment" -> "Python Debugger" 中的 "Gevent compatible" 标志。

似乎在某个时候我在 pycharm 中启用了 "Gevent compatible" 调试器,从那时起 pytest-pycharm 停止工作。禁用它将使 pytest-pycharm 再次工作。我希望这能解决你们中的一些人的问题。

如果您默认启用覆盖(通常在 pytest.ini 上),则根本问题是调试不起作用。

要仅在 pycharm 上禁用,只需在 Run/Debug Configurations 上的 Additional Arguments 上添加 --no-cov
更新 Templates -> Python tests -> pytest,因此每个新测试都会获得此配置。
之后,删除您当前的调试设置并重新调试它。

Pycharm 2018.3.x(在 2020.x 中仍然有效)

我想在此对话中补充一点,如果在 PyCharm(而不是整个测试文件)中启动单个测试功能,这些修复似乎不起作用。

我还没有在网上找到在调试单个测试函数而不是整个文件时激活断点的解决方案,如果有人有解决方案,我会很感兴趣。如果我自己找到它,我会尝试更新这个post。

我知道你做对了,但对我来说,将默认测试运行程序设置为 pytest 解决了问题。 在 PyCharm 中:Settings -> Python Integrated Tools -> Testing section -> Default test runner -> 从下拉菜单中选择 pytest -> 应用。它立即生效。

对我来说,解决方案是在测试文件夹中创建空 pytest.ini 文件。完成此操作后,我还可以针对特定功能启动调试。

None 此处或其他地方提到的解决方案对我有用。

我在不同的文件夹中有同一个项目的多个副本。一些副本很好,其他副本表现出以下行为:

  • 调试器会忽略测试中的任何断点(无论这些断点是否 运行 作为单个函数、类、模块、批处理)

  • 在这些测试调用的实际代码中设置的断点被命中

什么对我有用(4 个损坏的 repos 并且还在计数):

删除项目中 __pycache__ 个文件夹的内容,从不可调试测试模块所在的目录开始。首先删除具有不可调试模块名称的 .pyc 文件。如果这没有帮助,请确定测试中使用的任何自己的导入,找到并删除它们的 __pycache__/.pyc。 (注意:使用像文件资源管理器这样的文件浏览工具,因为 Pycharm 不会在项目视图中显示这些目录。)

如果您仍然不走运或者只是懒惰(像我一样),请擦除存储库中的所有 __pycache__ 文件夹。您可以通过命令 line/terminal 执行此操作,只需导航到 repo 文件夹,然后:

  • find . -name __pycache__ -type d -exec rm -rf {} \; [linux, mac](参见 How to remove folders with a certain name
  • FOR /d /r . %d IN ("__pycache__") DO @IF EXIST "%d" rd /s /q "%d"[赢](见Batch command to delete all subfolders with a specific name

编辑: 根据最近的发现使描述更加详细,添加了快速擦除提示。后来注意到 @mcsj120 已经在 Antonin 的 post 中提出了这个建议,所以向他致敬!