跳转到主要内容

进入PDB后事分析Nameko工作异常

项目描述

nameko-worker-postmortem

在使用pytest和--pdb标志时,你是否曾对Nameko服务的行为感到沮丧?

如果你的Nameko服务抛出工作异常,--pdb将不会在异常被反序列化回入口点的调用者之前中断。

nameko-worker-postmortem是一个pytest插件,它将跟踪点插入得更早,这样你就可以看到更有用的堆栈跟踪。

示例

以下是一个会失败的测试示例

# test.py

from nameko.web.handlers import http

class BadRequest(Exception):
    pass

class Service:
    name = "service"

    @http("GET", "/resource")
    def resource(self, request):
        param = request.args.get('param')
        if param == "good":
            return 200, "OK"
        raise BadRequest()


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 == 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.1
rootdir: /private/tmp, inifile:
plugins: nameko-2.11.0, nameko-worker-postmortem-0.0.1
collected 1 item

test.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_worker
    result = method(*worker_ctx.args, **worker_ctx.kwargs)
  File "/private/tmp/test.py", line 14, in resource
    raise BadRequest()
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 == 200
E       assert 500 == 200
E        +  where 500 = <Response [500]>.status_code

test.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++)

待办事项

  • 修复覆盖率收集
  • 添加pre-commit钩子
  • 自动禁用捕获,这样你就不必每次都指定-s
  • 尝试使导航向上向下堆栈跟踪正常工作,就像它们使用pdb.set_trace()一样(目前,up不会带你向上堆栈,而是进入插入断点的nameko-worker-postmortem代码。)

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪一个,请了解更多关于 安装软件包 的信息。

源分发

nameko_worker_postmortem-1.0.0.tar.gz (3.7 kB 查看哈希值)

上传时间

构建分发

nameko_worker_postmortem-1.0.0-py2.py3-none-any.whl (4.2 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者