行为中如何控制全局计数器?

问题描述 投票:0回答:2

我正在尝试使用

behave
中的环境文件函数来维护计数器变量。我的实现如下所示:

def before_all(context):
    context.counter = -1

def before_scenario(context, scenario):
    print(context.counter)

def after_scenario(context, scenario):
    context.counter += 1

我有一个包含多个

.feature
scenario
文件。但每个
scenario
总是获得相同的值。我该如何解决?

python python-3.x bdd gherkin python-behave
2个回答
1
投票

简短的答案很简单:你不能在 Behave 中这样做,执行期间修改的值在连续的场景中不会持久。

解释:这是一个非常危险的想法,因为你正在创建“依赖”场景。您始终必须设计独立的场景,以便您可以按任何顺序执行其中任何一个场景。 我给你举个例子:你有两个连续的相互依赖的场景:

Scenario 1: Given I get the counter with value -1 When I sum 1 to the counter Then The counter's value is 0 Scenario 2: When I sum 1 to the counter again Then The counter's value is 1

这里有一个非常危险的依赖关系,因此您必须始终在场景 2 之前执行场景 1。您应该按以下方式更改实现:

Scenario 1: Given I get the counter with value -1 When I sum 1 to the counter Then The counter's value is 0 Scenario 2: Given I get the counter with value -1 And I sum 1 to the counter When I sum 1 to the counter again Then The counter's value is 1

如您所见,我在场景 2 中重复了场景 1 中的一些步骤,但通过这种方式我实现了两个场景的独立性。


0
投票

SCENARIO_COUNTER = 0 def after_scenario(context, scenario): global SCENARIO_COUNTER # pylint: disable=global-statement SCENARIO_COUNTER += 1 # ... a use-case specific to Playwright: video_path = context.page.video.path() video_path_new = f'{SCENARIO_COUNTER:05}__' video_path_new += scenario.status.name + '__' # passed or failed video_path_new += scenario.filename.split('/')[-1] + '__' video_path_new += scenario.name.replace(' ', '_') + '.' video_path_new += video_path.split('.')[-1] # extension os.rename(video_path, video_path_new)

虽然通常最好不要跨场景共享任何全局状态,以便保持每个场景可重复且独立于其他场景运行,但这仍然是一个有效的用例,它允许我通过场景序列号为每个输出视频文件名添加前缀并让您可以轻松准确地理解 
behave

期间发生的事情,甚至无需查看任何日志。

    

© www.soinside.com 2019 - 2024. All rights reserved.