gpt4 book ai didi

python - 我如何在相同的场景中使用相同的步骤,但在 pytest-bdd 中使用不同的参数?

转载 作者:行者123 更新时间:2023-12-04 16:46:06 32 4
gpt4 key购买 nike

假设我有一个类似的场景:

    Scenario Outline: Example scenario
Given the subprocess is running
When I generate the input
And I add <argument1> to the input
And I add <argument2> to the input
And this input is passed to the subprocess
Then the output should match the <output> for <argument1> and <argument2>
我非常想重用“何时”步骤,例如 And I add <argument> to the input ,但不想使用示例表,因为我希望装置在步骤定义/conftest 文件中动态生成。我目前正在使用 @pytest.mark.parametrize像这样参数化场景大纲:
import pytest
from pytest_bdd import scenario
from functools import partial
from some_lib import test_data, utils

@pytest.fixture(scope='module')
def context():
return {}

scenario = partial(scenario, '../features/example.feature')

@pytest.mark.parametrize(
[argument1, argument2],
[(test_data.TEST_ARGUMENT[1], test_data.TEST_ARGUMENT[2]),],
)
@scenario('Example scenario')
def test_example_scenario(context, argument1, argument2):
pass
我希望能够以某种方式在相同的场景中使用不同的参数重用相同的步骤定义,例如
@when('I add <argument> to the input')
def add_argument(context, argument):
context['input'] = utils.add_argument(context['input'], argument)
而不是必须有两个步骤定义,例如
@when('I add <argument1> to the input')
def add_argument(context, argument1):
context['input'] = utils.add_argument(context['input'], argument1)

@when('I add <argument2> to the input')
def add_argument(context, argument2):
context['input'] = utils.add_argument(context['input'], argument2)
pytest-bdd documentation似乎表明这是可能的,但我无法完全理解如何在不使用示例表的情况下完成此任务。

Often it’s possible to reuse steps giving them a parameter(s). This allows to have single implementation and multiple use, so less code. Also opens the possibility to use same step twice in single scenario and with different arguments! [sic] (Emphasis my own)


有没有人对我如何实现这一点有任何想法?
一如既往地感谢您的时间!

最佳答案

我认为pytest-bdd文档更像是建议由于步骤定义中的变量而不是硬编码值而重新使用步骤......所以我认为文档没有为您的问题提供任何解决方案。
无论如何,我使用了一个解决方案,它动态地获取 step 变量的值。 Pytest-bdd将创建一个 pytest-fixture对于您在步骤中定义的每个变量,您可以通过调用 request.getfixturevalue(name_of_fixture) 来获取 fixture 的值。 ,只要你知道灯具的名称。
对于你的情况,我会使用 parsers.parse()用于步骤定义,以便变量 argument1argument2将保存设备的名称而不是它们的值。
例子

@when(parsers.parse('I add {argument1} to the input'))
def add_argument(request, context, argument1):
# Remove angle brackets, because they are not part of the fixture name
argument1 = argument1.replace('<', '').replace('>', '')
argument_value = request.getfixturevalue(argument1)
context['input'] = utils.add_argument(context['input'], argument_value)

关于python - 我如何在相同的场景中使用相同的步骤,但在 pytest-bdd 中使用不同的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68408712/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com