代码之家  ›  专栏  ›  技术社区  ›  JOG

如何准确了解Behave中的错误

  •  17
  • JOG  · 技术社区  · 10 年前

    我们最近开始使用 Behave (github link) 新python web服务的BDD。

    问题

    当测试失败时,我们有没有办法获得有关失败原因的详细信息?他们扔 AssertionError ,但他们从未显示出到底出了什么问题。例如,进入断言的预期值和实际值。

    我们一直试图找到这样的现有功能,但我想它不存在。当然,这个问题的一个好答案是关于如何通过修改源代码实现这种行为的提示和提示,以及这个特性是否存在于其他类似的BDD框架中,如jBehave、NBehave或Cucumber?

    实例

    今天,当测试失败时,输出显示:

      Scenario: Logout when not logged in                  # features\logout.feature:6
        Given I am not logged in                               # features\steps\logout.py:5
        When I log out                                     # features\steps\logout.py:12
        Then the response status should be 401             # features\steps\login.py:18
          Traceback (most recent call last):
            File "C:\pro\venv\lib\site-packages\behave\model.py", line 1037, in run
              match.run(runner.context)
            File "C:\pro\venv\lib\site-packages\behave\model.py", line 1430, in run
              self.func(context, *args, **kwargs)
            File "features\steps\login.py", line 20, in step_impl
              assert context.response.status == int(status)
          AssertionError
    
          Captured stdout:
          api.new_session
          api.delete_session
    
          Captured logging:
          INFO:urllib3.connectionpool:Starting new HTTP connection (1): localhost
          ...
    

    我想要的东西更像:

      Scenario: Logout when not logged in                  # features\logout.feature:6
        Given I am not logged in                               # features\steps\logout.py:5
        When I log out                                     # features\steps\logout.py:12
        Then the response status should be 401             # features\steps\login.py:18
    
    ASSERTION ERROR
    Expected:   401
    But got:    200
    

    如您所见,我们的通用步骤中的断言清楚地打印

    `assert context.response.status == int(status)`
    

    但我宁愿有这样的功能

    assert(behave.equals, context.response.status, int(status)
    

    或者任何其他能够从失败的断言生成动态消息的东西。

    4 回复  |  直到 10 年前
        1
  •  17
  •   Verv jenisys    7 年前

    您可以使用另一个断言提供程序,如 PyHamcrest ,他们将为您提供所需的详细信息。 它会告诉你出了什么问题,比如:

    # -- file:features/steps/my_steps.py
    from hamcrest import assert_that, equal_to
    ...
        assert_that(context.response.status, equal_to(int(status)))
    

    另请参见:

        2
  •  4
  •   m4tx    9 年前

    根据 https://pythonhosted.org/behave/tutorial.html?highlight=debug,and 这个实现对我很有用。

    通过使用after_step()钩子,可以轻松地提供错误/故障调试功能。当步骤失败时,将启动调试器。

    一般来说,只在需要时(在交互模式下)启用此功能是一个好主意。在本示例中,这是通过使用环境变量实现的。

    # -- FILE: features/environment.py
    # USE: BEHAVE_DEBUG_ON_ERROR=yes     (to enable debug-on-error)
    from distutils.util import strtobool as _bool
    import os
    
    BEHAVE_DEBUG_ON_ERROR = _bool(os.environ.get("BEHAVE_DEBUG_ON_ERROR", "no"))
    
    def after_step(context, step):
        if BEHAVE_DEBUG_ON_ERROR and step.status == "failed":
            # -- ENTER DEBUGGER: Zoom in on failure location.
            # NOTE: Use IPython debugger, same for pdb (basic python debugger).
            import ipdb
            ipdb.post_mortem(step.exc_traceback)
    
        3
  •  1
  •   hi2meuk    5 年前

    不要忘记,您可以随时向 assert 陈述例如:

    assert output is expected, f'{output} is not {expected}'
    
        4
  •  -1
  •   Terrence Brannon    9 年前

    我发现使用pyhamcrest断言比标准Python断言产生更好的错误报告。