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
任何要使用该值的地方。
我不太熟悉 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
任何要使用该值的地方。