如何理解pytest的参数化fixture,fixture工厂怎么用
Admin 2022-08-04 群英技术资讯 1028 次浏览
这篇文章主要讲解了“如何理解pytest的参数化fixture,fixture工厂怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解pytest的参数化fixture,fixture工厂怎么用”吧!fixture有个params参数,允许我们传递数据。
语法格式:
# conftest.py文件
# fixture的params参数
# 取value1时,会把依赖此fixture的用例执行一遍。
# 取value2时,会把依赖此fixture的用例执行一遍。
# 取value3时,会把依赖此fixture的用例执行一遍。
# params有几个参数,就会将依赖此fixture的用例执行几遍。
@pytest.fixture(params=[value1, value2, value3..])
def fix_name():
# do something
当我们需要多次调用fixture时,则可以用到fixture的参数化功能。
但它并不是并发的,是串行执行的。
比如,测试对象有多种配置方式,那么参数化可以帮我们在多种配置方式下执行用例。
接下来,以网页自动化为案例。
需求:要在google、firefox浏览器下执行测试用例,用例为打开百度搜索pytest。
1)先在conftest.py当中,定义fixture,并设置params=["google", "firefox"]
# conftest.py
# params设置为google和firefox
@pytest.fixture(params=["google", "firefox"])
def browser_fix(request):
if request.param == "google":
driver = webdriver.Chrome()
elif request.param == "firefox":
driver = webdriver.Firefox()
else:
driver = None
yield driver
if driver:
driver.quit()
2)在测试用例文件test_baidu_action.py中,编写测试用例,并调用browser_fix
# test_baidu_action.py
@pytest.mark.usefixtures("browser_fix")
def test_baidu(browser_fix):
driver = browser_fix
driver.get("https://www.baidu.com/")
driver.find_element(By.ID, "kw").send_keys("pytest", Keys.ENTER)
loc = (By.XPATH, '//h3')
WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
3)运行2)中的用例,会依次在google浏览器中执行完成,然后在firefox浏览器中执行完成。一共是2条测试用例。

当我们在一个用例当中,需要多次调用fixture时,就可以使用fixture工厂
利用的是装饰器的方式
在fixture内部,定义一个函数。fixture返回的是函数。
以下案例来自官网:
@pytest.fixture
def make_customer_record():
def _make_customer_record(name):
return {"name": name, "orders": []}
return _make_customer_record
# 用例内部,多次调用了fixture.
def test_customer_records(make_customer_record):
customer_1 = make_customer_record("Lisa") # 第1次调用
customer_2 = make_customer_record("Mike") # 第2次调用
customer_3 = make_customer_record("Meredith") # 第3次调用
如果工厂创建的数据需要管理,那么fixtue可以如下处理:
@pytest.fixture
def make_customer_record():
# 管理工厂的数据。在前置中创建。在后置中销毁
created_records = []
def _make_customer_record(name):
record = models.Customer(name=name, orders=[])
# 前置中添加数据
created_records.append(record)
return record
yield _make_customer_record # 返回内部函数
# 销毁数据
for record in created_records:
record.destroy()
# 测试用例
def test_customer_records(make_customer_record):
customer_1 = make_customer_record("Lisa")
customer_2 = make_customer_record("Mike")
customer_3 = make_customer_record("Meredith")
pytest内置的名为requests的fixture,主要功能: 提供请求fixture的测试用例/测试类的信息的。
我们定义fixture之后,通常都是测试用例/测试类,来请求fixture。
而request fixture就会记录 测试用例/测试类 相关信息。
request fixture是通过FixtureRequest来实现的,有以下属性(列举部分)可以使用:
更多的请查阅官网:https://docs.pytest.org/en/stable/reference.html
既然requests是fixture,那么我们定义的fixture,就可以直接把requests作为函数参数来用。
下面,以简单案例来演示。
定义一个fixture,将requests作为参数。
import pytest
@pytest.fixture(params=[1,2])
def init(request):
print("用例名称:", request.function)
print("fix参数 ", request.param)
print("fix的作用域 ", request.scope)
print("用例所在的类 ", request.cls)
定义一个测试类,直接请求名为init的fixture:
@pytest.mark.usefixtures("init")
class TestABC:
def test_hello(self):
print("-------------------------")
执行结果如下:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在接口测试中,接口通常是GET请求或者POST请求。以下是对接口测试中常见的四种Post请求数据方式进行一个详细的讲解
这篇文章主要为大家详细介绍了Python实现环形链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
既然在Pathlib库中提到了glob()函数,那么我们就专门用一篇内容讲解文件名的匹配。其实我们有专门的一个文件名匹配库就叫:glob。
ord() 函数是 chr() 函数(对于 8 位的 ASCII 字符串)的配对函数,它以一个字符串(Unicode 字符)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,这篇文章主要介绍了python 中内置函数ord()返回字符串的ASCII数值,需要的朋友可以参考下
前言:这个先来创建一个模块,名称为christmastree,在该模块中,首先定义一个全局变量,然后创建一个名称为fun_christmastree()的函数,最后再通过print()函数输出一写内容
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008