BDD behave Python 需要创建一个世界地图来保存值

BDD behave Python need to create a World map to hold values

我不太熟悉 Python 但我已经使用 Python behave 设置了 BDD 框架,我现在想创建一个世界地图 class 来保存数据并且是可在所有场景中检索。

例如,我将有一个世界 class,我可以在其中使用:

World w 

w.key.add('key', api.response)

在一种情况下,在另一种情况下,我可以使用:

World w

key = w.key.get('key'). 

编辑:

或者,如果有一种内置的方式使用上下文或类似的行为,在所有场景中保存和检索属性,那将是很好的。

就像可以使用 world 的 lettuce http://lettuce.it/tutorial/simple.html

我已经在不同场景之间尝试过这个,但它似乎没有接收到它

class World(dict):
    def __setitem__(self, key, item):
        self.__dict__[key] = item
        print(item)

    def __getitem__(self, key):
        return self.__dict__[key]

场景A一步设置item:w.setitem('key', response)

在场景B的另一个步骤中获取项目:w.getitem('key',)

不过这显示了一个错误:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python\lib\site-packages\behave\model.py", line 1456, in run
    match.run(runner.context)
  File "C:\Program Files (x86)\Python\lib\site-packages\behave\model.py", line 1903, in run
    self.func(context, *args, **kwargs)
  File "steps\get_account.py", line 14, in step_impl
    print(w.__getitem__('appToken'))
  File "C:Project\steps\world.py", line 8, in __getitem__
    return self.__dict__[key]
KeyError: 'key'

似乎世界在 运行 之间的步骤之间不保存值。

编辑:

我不确定如何使用 environment.py 但可以看到它有一种在步骤之前 运行ning 代码的方法。我如何允许调用 environment.py 内的 soap 客户端,然后将其传递给特定步骤?

编辑:

我已在 environment.py 中提出请求并对值进行硬编码,如何将变量传递给 environment.py 并返回?

在 python-behave 行话中称为 "context"。步骤定义函数的第一个参数是 behave.runner.Context class 的一个实例,您可以在其中存储您的世界实例。请参阅 the appropriate part of the tutorial.

你试过吗 简单的方法,使用 global var,例如:

def before_all(context):
    global response
    response = api.response

def before_scenario(context, scenario):
    global response
    w.key.add('key', response)

猜测feature可以从context访问,例如:

def before_feature(context, feature):
    feature.response = api.response

def before_scenario(context, scenario):
    w.key.add('key', context.feature.response)

您正在寻找:
Class 变量: class.
的所有实例共享的变量 Q 中的代码使用 Class 实例变量.
阅读:python_classes_objects

例如:

class World(dict):
    __class_var = {}

    def __setitem__(self, key, item):
        World.__class_var[key] = item

    def __getitem__(self, key):
        return World.__class_var[key]

# Scenario A
A = World()
A['key'] = 'test'
print('A[\'key\']=%s' % A['key'] )
del A

# Scenario B
B = World()
print('B[\'key\']=%s' % B['key'] )

输出

A['key']=test
B['key']=test  

测试 Python:3.4.2
如果这对您有用,请回来将您的问题标记为已回答,或者评论为什么不行。

为此我实际上使用了一个配置文件 [config.py] 然后我在其中添加了变量并使用 getattr 检索它们。见下文:

WSDL_URL = 'wsdl'
USERNAME = 'name'
PASSWORD = 'PWD'

然后像这样检索它们:

import config

getattr(config, 'USERNAME ', 'username not found')

在 before_all 钩子中定义 global var 对我不起作用。 正如@stovfl

所述

但是在我的一个步骤中定义全局变量是可行的。

相反,正如 Szabo Peter 提到的那样,使用上下文。

context.your_variable_name = api.response 只需使用 context.your_variable_name 任何要使用该值的地方。