Python 行为 - 如何从场景传递价值以在功能级别的装置中使用?

Python Behave - how to pass value from a scenario to use in a fixture on a feature level?

我有以下测试场景:

  1. 检查是否创建了具有特定名称的项目
  2. 编辑这个项目
  3. 验证是否已编辑
  4. 作为拆卸程序的一部分删除此项目

这是实现该目的的示例代码: 场景:

  @fixture.remove_edited_project
  @web
  Scenario: Edit a project data
    Given Project was created with the following parameters
      | project_name             |
      | my_project_to_edit       |
    When I edit the "my_project_to_edit" project
    Then Project is edited

将数据保存在某个变量中以用于拆卸函数(夹具)的步骤:

@step('I edit the "{project_name}" project')
def step_impl(context, project_name):
    # steps related to editing the project

    # storing value in context variable to be used in fixture
    context.edited_project_name = project_name

以及在场景之后删除项目的示例夹具函数:

@fixture
def remove_edited_project(context):
    yield
    logging.info(f'Removing project: "{context.edited_project_name}"')

    # Part deleting a project with name stored in context.edited_project_name

在这样的配置中,一切正常,项目在任何情况下都被固定装置删除(测试失败或通过)。没关系。

但是,当我想在功能级别上执行这样的功能时,意味着在功能关键字之前放置 @fixture.remove_edited_project 装饰器:

@fixture.remove_edited_project
Feature: My project Edit feature

,那这个不行。 我已经知道原因了 - context.edited_project_name 变量在每个场景后都会被清除,以后它不再可用于此夹具功能。

有什么好的方法可以将参数以某种方式传递给功能级别的固定装置吗?不知何故全球? 我试图使用全局变量作为一个选项,但这在这个框架中开始有点脏和有问题。

理想情况下应该是 @fixture.edited_project_name('my_project_to_edit')

因为上下文中清除了场景执行期间创建的变量,所以您需要一种在整个功能中持续存在的机制。一种方法是在设置夹具期间在上下文中创建一个字典或其他容器,以便它通过该功能持续存在。场景可以设置属性或添加到容器中,因为字典是在特性期间添加的,所以它在 fixture 销毁期间仍然存在。例如,

@fixture
def remove_edited_project(context):
    context.my_fixture_properties = {}
    yield
    logging.info(f'Removing project: "{context.my_fixture_properties['edited_project_name']}"')

@step('I edit the "{project_name}" project')
def step_impl(context, project_name):
    # steps related to editing the project

    # storing value in context variable to be used in fixture
    context.my_fixture_properties['edited_project_name'] = project_name