在nameko worker异常上执行pdb post mortem
nameko-worker-postmortem的Python项目详细描述
nameko工人死后
您是否曾经对pytest中使用--pdb
标志的nameko服务的行为感到沮丧?
如果nameko服务抛出一个工作异常,--pdb
在异常被序列化回入口点的调用方之前,不会用断点中断。
nameko-worker-postmortem
是一个pytest插件,它先前插入了跟踪点,因此您可以看到更有用的堆栈跟踪。
示例
下面是一个失败的测试示例:
# test.pyfromnameko.web.handlersimporthttpclassBadRequest(Exception):passclassService:name="service"@http("GET","/resource")defresource(self,request):param=request.args.get('param')ifparam=="good":return200,"OK"raiseBadRequest()deftest_service(container_factory,web_config,web_session):container=container_factory(Service,web_config)container.start()res=web_session.get('/resource?param=bad')assertres.status_code==200
与--pdb
使用--pdb
标志,在断言失败的地方设置断点,如果您希望看到工作进程引发的异常,则这并不是很有帮助:
$ py.test test.py============================= test session starts ==============================platform darwin -- Python 3.4.6, pytest-3.7.4, py-1.6.0, pluggy-0.7.1rootdir: /private/tmp, inifile:plugins: nameko-2.11.0, nameko-worker-postmortem-0.0.1collected 1 itemtest.py F>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> captured log >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>containers.py 399 ERROR error handling worker <WorkerContext [service.resource] at 0x1104a77f0>:Traceback (most recent call last): File "/Users/mattbennett/.virtualenvs/tmp-302905cac73c0a2/lib/python3.4/site-packages/nameko/containers.py", line 391, in _run_workerresult=method(*worker_ctx.args,**worker_ctx.kwargs) File "/private/tmp/test.py", line 14, in resourceraiseBadRequest()test.BadRequest>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> traceback >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>container_factory = <function container_factory.<locals>.make_container at 0x11022f620>web_config = {'WEB_SERVER_ADDRESS': '127.0.0.1:55934'}web_session = <nameko.testing.pytest.web_session.<locals>.WebSession object at 0x11047ac18> def test_service(container_factory, web_config, web_session): container = container_factory(Service, web_config) container.start() res = web_session.get('/resource?param=bad')> assert res.status_code == 200E assert 500 == 200E + where 500 = <Response [500]>.status_codetest.py:22: AssertionError>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> entering PDB >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[11] > /private/tmp/test.py(22)test_service()-> assert res.status_code == 200 6 frames hidden (try 'help hidden_frames')> /private/tmp/test.py(22) 17 def test_service(container_factory, web_config, web_session): 18 container = container_factory(Service, web_config) 19 container.start() 20 21 res = web_session.get('/resource?param=bad') 22 -> assert res.status_code == 200
带--worker-postmortem
将--pdb
替换为--worker-postmortem
(或--worker-pdb
),断点将插入到引发工作异常的位置。
请注意,还必须传递-s
以禁用输出捕获。
$ py.test test.py --worker-postmortem -s
============================= test session starts ==============================
platform darwin -- Python 3.4.6, pytest-3.7.4, py-1.6.0, pluggy-0.7.1
rootdir: /private/tmp, inifile:
plugins: nameko-2.11.0, nameko-worker-postmortem-0.0.1
collected 1 item
test.py [1] > /private/tmp/test.py(14)resource()
-> raise BadRequest()
> /private/tmp/test.py(14)
9 @http("GET", "/resource")
10 def resource(self, request):
11 param = request.args.get('param')
12 if param == "good":
13 return 200, "OK"
14 -> raise BadRequest()
(Pdb++)
待办事项
- 修复覆盖范围集合
- 添加预提交挂钩
- 自动禁用捕获,这样您就不必每次都指定
-s
- 尝试使导航
up
和down
堆栈跟踪的工作方式与pdb.set_trace()
相同(此时,up
不会占用堆栈,而是插入插入断点的nameko-worker-postmortem
代码。)