簡體   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