如何在python中实现此功能?

时间:2016-05-23 20:23:12

标签: python selenium testing pytest

我在python中编写自动UI测试并由py.test运行。我试图让任何正在编写测试的人都尽可能简单。我想要实现的是这样的。

def test_set_feature_example(self, fix_web_ui)
     A = fix_web_ui["features"]
     A.features.example = 'somestring' # What this should achieve is using selenium, set the text with the id 'features.example' with 'somestring'. 

这应该实现的是使用selenium,使用id'features.example'和'somestring'设置文本。 UI中的ID与上面提到的相同。如果我可以覆盖运算符'=',这是可能的。既然这是不可能的,还有其他方法可以实现这种功能。我认为另一种方法是在fix_web_ui的终结器中添加这些功能,但这不起作用,因为这意味着将fix_web_ui限制为函数。有什么想法吗?希望我很清楚。

在将其标记为重复之前,我不会询问作业是否可以重载。我问的是一个架构,在这个架构中,编写测试的人可以编写与此类似的东西

A.features.example = 'somestring'

而不是

driver = webdriver.FireFox()
item  = driver.find_elements_by_id('features.example')
item.send_keys('somestring')
driver.close()

1 个答案:

答案 0 :(得分:1)

我认为您可以在http://pytest.org/latest/fixture.html#overriding-fixtures-on-various-levels

使用灯具覆盖功能

所以如果你的fix_web_ui是一个更高级别的fixture(scope =" session")那么你可以在模块级别覆盖它。你的fix_web_ui fixture必须是一个可变对象。

# conftest.py

@pytest.fixture
def fix_web_ui():
    class Feature1(object):
        def __init__(self):
            self.example = "example1"
    return {"features": Feature1()}
# test_feature.py

import copy

@pytest.fixture
def fix_web_ui(fix_web_ui):
     # here it depends how you want to handle this:
     # 1) modify original fixture values - that will persist for the outer scope too
     # 2) or make a copy of a the outer scope fixture and override it's attributes like this:
     fix_web_ui2 = copy.deepcopy(fix_web_ui)
     fix_web_ui2.example = "overridden"
     return fix_web_ui2

def test_feature_functionality(fix_web_ui):
    assert fix_web_ui.example == "overridden"