VSCode调试Pytest时测试方法内断点被跳过仅启动脚本断点可用如何解决
根因说明
ptvsd默认仅挂载启动时指定的入口进程,pytest运行测试用例会在独立的执行上下文(或子进程)中加载测试文件,调试器无法追踪到这部分进程空间,因此测试方法内的断点无法触发。
解决方案
方案1:直接通过ptvsd启动pytest(优先推荐)
跳过run_tests.py封装层,直接让调试器挂载pytest主进程,所有测试执行逻辑都会在同一个调试会话内运行,修改docker-compose.yml的entrypoint配置:
entrypoint: ["/usr/src/app/cvenv/bin/python3.8", "-m", "ptvsd", "--host", "0.0.0.0", "--port", "5678", "--wait", "-m", "pytest", "./integration_tests/"]
如果不需要保留run_tests.py中的自定义初始化逻辑,优先使用该方案。
方案2:开启ptvsd子进程调试(保留run_tests.py封装)
给ptvsd增加子进程追踪参数,让调试器自动挂载pytest拉起的所有子进程,修改docker-compose.yml的entrypoint,新增--enable-subprocess-debugging参数:
entrypoint: ["/usr/src/app/cvenv/bin/python3.8", "-m", "ptvsd", "--host", "0.0.0.0", "--port", "5678", "--wait", "--enable-subprocess-debugging", "./integration_tests/run_tests.py"]
同时修改run_tests.py中pytest.main的调用参数,关闭可能干扰调试的配置:
import pytest if __name__ == "__main__": # -s 关闭标准输出/错误捕获,--no-cov 关闭覆盖率插件避免字节码修改导致断点失效 pytest.main(['-s', '--no-cov', './integration_tests/'])
方案3:代码内显式初始化调试器
如果上述方案不生效,可以将ptvsd初始化逻辑放到run_tests.py中,显式开启子进程调试支持:
import ptvsd import pytest # 初始化调试器 ptvsd.enable_attach(address=("0.0.0.0", 5678), redirect_output=True) # 等待调试客户端连接 ptvsd.wait_for_attach() if __name__ == "__main__": pytest.main(['-s', '--no-cov', './integration_tests/'])
对应修改docker-compose.yml的entrypoint为直接启动脚本即可:
entrypoint: ["/usr/src/app/cvenv/bin/python3.8", "./integration_tests/run_tests.py"]
内容的提问来源于stack exchange,提问作者Matthias Herrmann
相关产品推荐
相关产品推荐

