我试图使用pdb(Python调试器)调试我的测试,同时使用bazel运行它们。
这是我的一个测试样本:
class TestMembersResource(TestCase):
def test_get(self):
response = self.client.get('/api/v1/members/')
import ipdb; ipdb.set_trace()
self.assertEqual(response.status_code)
字符串
当我尝试用bazel test ...
运行它时,我得到以下输出:
Traceback (most recent call last):
File "/root/.cache/bazel/_bazel_root/ae988d93859d448ae36776fcb135b36c/execroot/__main__/bazel-out/k8-fastbuild/bin/webserver/members/api/tests/test_members_resource.runfiles/__main__/webserver/members/api/tests/test_members_resource.py", line 22, in test_get
self.assertEqual(response.status_code, 200,
File "/root/.cache/bazel/_bazel_root/ae988d93859d448ae36776fcb135b36c/execroot/__main__/bazel-out/k8-fastbuild/bin/webserver/members/api/tests/test_members_resource.runfiles/__main__/webserver/members/api/tests/test_members_resource.py", line 22, in test_get
self.assertEqual(response.status_code, 200,
File "/usr/lib/python2.7/bdb.py", line 49, in trace_dispatch
return self.dispatch_line(frame)
File "/usr/lib/python2.7/bdb.py", line 68, in dispatch_line
if self.quitting: raise BdbQuit
BdbQuit
型
如果没有PDB,一切都运行得很顺利。
有没有一种方法可以获得一个交互式shell,并使用标准的pdb命令与bazel test?
谢谢你,谢谢
4条答案
按热度按时间iih3973s1#
您可以使用--run_under标志来完成此操作,如前所述。需要注意的是,您需要指向pdb.py以进行python安装。要找到指向的位置,您可以执行以下操作:
检查你的python版本安装在哪里,应该使用python2.7或python3.6,而不仅仅是python3或python3,因为它们通常只是符号链接。
字符串
请注意,这是二进制文件所在的位置,而我们想要指向一个库文件。为此,将最后一个bin替换为lib,并指定所需的文件,类似于以下内容:
型
现在你可以像这样运行你的目标:
型
91zkwejq2#
使用
--run_under
:字符串
hfyxw5xn3#
除了使用bazel的
--run_under
,你也可以在任何地方设置一个breakpoint()
(内置函数,不需要导入),然后执行一个普通的bazel run
。当解释器命中断点时,它将打开pdb
。可选但非常有用:使用pudb通过
字符串
eyh26e7m4#
不幸的是,
bazel test
不支持gdb
或pdb
等交互式工具。请参阅此处的讨论和解决方法:https://github.com/bazelbuild/bazel/issues/11371#issuecomment-692298389