在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
  • 尝试使导航updown堆栈跟踪的工作方式与pdb.set_trace()相同(此时,up不会占用堆栈,而是插入插入断点的nameko-worker-postmortem代码。)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
具有未知数量条件的java If语句   java如何在Spark中使用两个“条件”进行过滤?   雅加达ee为ColdFusion提供的最佳Java ee服务器   java如何在jersey的MessageBodyWriter方法中获取writeTo中的anotations值?   java从脚本文件调用jar文件中的函数   java在执行insert语句后,如何获得id值为的语句?   在OS X上设置OpenCV Java绑定   java使用for循环遍历数组x。以字符串形式返回x的元素,其中每个元素由一个空格分隔   ApacheiClientBuilder为Algolia Java创建的APIClient是线程安全的吗?   java在DFS/BFS算法中获取邻居时避免内存分配?   java使用AES/CBC/PKCS5P加密大文件(2GB)   允许保存/加载列布局的Java DB网格组件   队列大小为1的java Spring调度   跑步带有Java参数的exe   java正则表达式将所有“<”和“>”标记替换为“&lt;”及“&gt;”在<<![CDATA]>标签?   java何时同步变量?