我在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()
答案 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"