为单元和功能测试重用Python的行为特征文件

时间:2014-03-24 07:23:54

标签: bdd gherkin python-behave

以下Gherking测试定义了我的某个服务器的所需行为:

  Scenario Outline: Calling the server with a valid JSON
     Given A GIS update server
     When I call /update with the json in the file <filename>
     Then the response status code is <status_code>
     And the response is a valid JSON
     And the response JSON contains the key status
     And the response JSON contains the key timestamp
     And the response JSON contains the key validity

  Examples:
  | filename                    | status_code |
  | valid_minimal.json          | 200         |
  | valid_minimal_minified.json | 200         |
  | valid_full.json             | 200         |
  | valid_full_minified.json    | 200         |
  | valid_full_some_nulls.json  | 200         |
  | valid_full_all_nulls.json   | 200         |

我为Flask服务器的单元测试编写了这段代码。 steps文件解释了Gherkin指令,打开一个测试客户端并进行必要的调用和断言:

@given(u'A GIS update server')
def step_impl(context):
    context.app = application.test_client()

功能文件与单元和功能测试类似。唯一的区别在于几个步骤文件,它必须进行HTTP调用而不是调用测试客户端的方法。

通过将参数传递给步骤文件,重用此behave要素文件的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

扩展Parva的评论,我建议通过命令行发送参数,这些参数将在步骤定义中检测到,并调整单位与功能测试的行为(决定是否将设备与功能测试分开以保持清晰度取决于你;)。

Debug on error周围的Behave文档中给出了一个示例,它给出了在修改步骤方法执行时使用环境属性的一个很好的示例:

# -- 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)

您可以更改它以检测命令行传递的变量,例如UNIT_TESTING,并使其命中不同的端点或执行测试的备用功能。

答案 1 :(得分:1)

要求:表现&gt; = 1.2.5

我认为,test stage概念可以帮助您满足您的需求。它允许您为不同的测试阶段使用不同的步骤实现。

behave --stage=functional

如果您的更改很小,请使用userdata概念将标记传递给您的步骤实现,例如:

behave -D test_stage=unit …
behave -D test_stage=functional …