使用PyCharm和pytest进行调试出现问题

96
10个回答

159

15
py.test test_dir --no-cov - madzohan
6
pytest.ini 文件在哪里? - silver est
1
@silverest 请自行创建,您可以查看 https://docs.pytest.org/en/latest/customize.html#finding-the-rootdir。 - Cloud
1
这也解决了PyDev中的同样问题(因为两者都使用pydevd)。值得注意的是,还应该寻找pytest.ini或类似文件,可能会强制执行覆盖率报告。 - saaj
@madzohan和joaoricardo000的答案我认为是最好的。因为这可以作为附加参数应用于调试配置中,而无需更改pytest.ini文件,后者很可能处于版本控制中。 - chumbaloo
通常当我遇到这个问题时,我会添加--no-cov并解决它,但这次不行。还有其他人遇到过这个问题吗? - Lost Crotchet

79

根本问题是如果默认启用覆盖率(通常在pytest.ini上)则调试无法正常工作。

要在Pycharm上禁用,则只需在“运行/调试配置”中的“附加参数”中添加--no-cov
更新模板-> Python测试-> pytest,以便每个新测试都使用此配置。
完成后,请删除当前的调试设置并重新进行调试。

进入图片描述

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


2
谢谢,这对我很有效。这比在pytest.ini中禁用覆盖率更可取,正如被接受的答案所建议的那样。现在从命令行运行测试或在CI构建期间运行测试仍会生成覆盖率报告。 - roskakori
3
问题已解决。但是由于我对PyCharm不熟悉,花费了很长时间才找到如何进入“运行/调试配置”(导航栏被隐藏了,而我不知道...)。请参考链接:https://www.jetbrains.com/help/pycharm/creating-and-editing-run-debug-configurations.html - Austen Hoogen
3
我必须安装pytest-cov来尝试这个。然而,对我来说它并没有起作用。 - n1000
1
在 Pycharm Pro 2020.2 中,它位于“文件”菜单下的“新项目设置”中的“为新项目运行配置模板”,或者当在运行菜单中按下“添加配置”时可以找到它。 - Shani Shalgi
2
我在一个Kedro项目的pyproject.toml文件中添加了--no-cov,问题得到了解决。谢谢! - Daniel Ben Zaken

13

这里和其他地方提到的解决方法都没用。

我有同一项目的多个副本在不同的文件夹中,一些副本正常,另一些出现以下情况:

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

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

对我有效的解决方法(4 个已损坏的代码库并计数):

从您无法进行调试的测试模块所在的目录开始,删除项目中__pycache__文件夹中的内容。首先删除带有无法进行调试模块名称的.pyc文件。如果这不起作用,请查找测试中使用的任何特定导入,然后定位并删除它们的__pycache__/.pyc。 (注意:使用像文件资源管理器这样的文件浏览工具,因为 Pycharm 在项目视图中不显示这些目录。)

如果您仍然没有运气,或者只是懒惰(就像我一样),可以删除存储库中所有__pycache__文件夹。您可以通过命令行/终端实现这一点,只需导航到存储库文件夹,然后执行以下操作:

编辑: 在最近的发现后对描述进行了详细说明,并添加了一个快速擦除提示。之后注意到@mcsj120已经在Antonin的帖子中提出了这个建议,所以向他致敬!


2
运行命令以递归方式删除 __pycache__ 解决了问题。 - Tonatio
这是对我有效的解决方案。我认为这是因为我将项目从另一台计算机复制过来,现在一些缓存信息不一致了。 - Tom Johnson
删除 pycache 对我也有效 - SILENCE

8

简而言之:在“构建、执行、部署”->“Python调试器”中禁用“Gevent兼容”标志。

似乎我在某个时候启用了pycharm中的“Gevent兼容”调试器,自那以后pytest-pycharm就停止工作了。禁用它将使pytest-pycharm再次工作。希望这能解决一些人的问题。


3
我有 PyCharm 2018.2.1,该选项已默认禁用。 - Emer
我相信我启用了这个选项是为了解决以前版本中的一个警告或错误,并且升级后很少有断点会起作用(仅在我的main.py中)。取消选择它可以恢复预期的操作。 - Mark
1
非常感谢Alessio,这解决了我的问题。是的,这个标志确实默认情况下被禁用,但是例如我需要启用它以调试使用PyTorch的大型深度学习模型(https://dev59.com/VlkS5IYBdhLWcg3w25zq#47801392)。因此,了解何时启用/禁用它非常重要。 - Ursin Brunner

4

我知道你的方法是正确的,但是对我而言将默认测试运行工具设置为pytest就解决了这个问题。 在PyCharm中: Settings -> Python Integrated Tools -> Testing section -> Default test runner -> 从下拉菜单中选择pytest -> 应用即可。然后它就可以立即运行。


3

我想补充一下,在PyCharm中只启动单个测试函数时,这些修复似乎不起作用。

我还没有在网上找到解决方案,以激活单个测试函数调试时的断点,如果有人有解决方案,我会很感兴趣。如果我自己找到了解决方法,我会尝试更新这篇文章。


3
我遇到了同样的问题,一个单独的文本装置不会在断点处停止,使用了 @mrbattle 的方法,通过使用命令 find。 -name __pycache__ -type d - exec rm -rf {} \; (Mac)删除了所有的__pycache__文件夹,之后就能够触发断点了。 - mcsj120

2

对于我来说,解决方案就是在测试文件夹中创建一个空的pytest.ini文件。这样做后,我也可以为特定函数启动调试。


1
我已经尝试了上述所有方法,但都没有起作用。
我意识到我使用的是“模块名称”目标,而不是一个答案中上面显示的“脚本路径”目标。
我更改为脚本路径并指定目标 - 这很重要,因为测试可以在没有它的情况下工作,但断点无法正常工作。
另外,由于某种原因,现有的断点不起作用,但新的却可以(所以我只需刷新现有的即可使其正常工作)。

使用脚本路径


0

对我来说,当我安装了模块pytest-cov之后就有效了。在此之前,Pycharm不会在断点处中断。

pip install pytest-cov

0
这听起来有点愚蠢,但我使用了PyCharm的“python”配置(而不是“Python测试”配置),并运行了相当于的代码。
python -m unittest tests.my_test

通过运行一个“模块”(单元测试)并提供“参数”(“tests.my_test”)来执行。
在下面的图片中,“my_test”是“test_importer”。

Configuration

我在“参数”部分中提供了测试路径。

options

我正在使用 PyCharm 2023.2。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接