繁体   English   中英

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

[英]BDD behave Python need to create a World map to hold values

我不太熟悉Python但是我已经使用Python行为设置了BDD框架,我现在想要创建一个包含数据的世界地图类,并且可以在所有场景中检索。

例如,我将有一个世界级,我可以使用:

World w 

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

在一个场景和另一个场景中,我可以使用:

World w

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

编辑:

或者,如果存在使用上下文或类似行为的内置方式,则可以保存属性,并且可以在所有方案中检索这些属性。

像生菜一样,你可以使用世界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:w中一步设置项目。 setitem ('key',响应)

在方案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,但可以看到它有一种在步骤之前运行代码的方法。 如何调用environment.py中的soap客户端调用,然后将其传递给特定步骤?

编辑:

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

它在python行为术语中被称为“上下文”。 步骤定义函数的第一个参数是behave.runner.Context类的一个实例,您可以在其中存储您的世界实例。 请参阅教程的相应部分。

您是否尝试过使用global var的简单方法,例如:

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

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

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

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

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

您正在寻找:
类变量 :由类的所有实例共享的变量。
Q中的代码使用Class Instance变量
阅读: 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
如果这对您有用,请回来并将您的问题标记为已回答,或者为什么不回复。

在before_all钩子中定义global var变量对我来说不起作用。 如@stovfl所述

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

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

context.your_variable_name = api.response ,只需在要使用该值的任何位置使用context.your_variable_name

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

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

然后检索它们像:

import config

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM