如何解决在 Pytest 中参数化静态 webdriver 夹具和生成器?
我正在构建一个自动化测试,以查找 WP 插件中任何可能的死链接。为此,我有两个辅助函数。
第一个启动 Selenium 网络驱动程序:
@pytest.fixture(scope='session')
def setup():
d = webdriver.Firefox()
site = os.getenv('TestSite')
d.get(site)
login = d.find_element_by_id('user_login')
d.implicitly_wait(5)
user,pw = os.getenv('TestUser'),os.getenv('TestPw')
d.find_element(By.ID,'user_login').send_keys(user)
d.find_element(By.ID,'user_pass').send_keys(pw)
d.find_element(By.ID,'wp-submit').click()
yield d,site
d.quit()
第二个读取 JSON 文件,挑选出文件中的每个页面,然后将其交给第三个函数:
def page_generator() -> Iterator[Dict[str,Any]]:
try:
json_path = '../linkList.json'
doc = open(json_path)
body = json.loads(doc.read())
doc.close()
except FileNotFoundError:
print(f'Did not find a file at {json_path}')
exit(1)
for page in body['pages']:
yield page
第三个函数是测试的肉和土豆,跑遍页面,寻找每一个链接。我的目标是参数化每个页面,我的函数标题目前看起来像......
@pytest.mark.parametrize('spin_up,page',[(setup,p) for p in page_generator()])
def test_links(spin_up,page):
driver,site = spin_up
# Do all the things
不幸的是,运行这个结果是 TypeError: cannot unpack non-iterable function object
。是将 yield d,site
放入某种循环以将函数变成可迭代的唯一选择,还是有办法告诉 test_links
迭代地提取与其 spin_up
相同的设置函数价值?
解决方法
有一种简单的方法可以做您想做的事情,那就是将 setup
固定装置直接指定为 test_links
的参数。请注意,pytest
足够聪明,可以确定 setup
参数指的是夹具,而 page
参数指的是参数化:
@pytest.mark.parametrize('page',page_generator())
def test_links(setup,page):
driver,site = setup
您也可以看看parametrize_from_file
。这是我编写的一个包,用于帮助从 JSON/YAML/TOML 文件加载测试用例。它的作用与您的 page_generator()
函数基本相同,但更简洁(也更一般)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。