Pytest知识整合小记(四、fixture测试夹具)
一句话介绍:
fixture是在测试函数运行前后,由pytest执行的外壳函数。
示例:
@pytest.fixture()
def mydata():
return 30
def test_mydata(mydata):
assert mydata==30
如上所示:测试用例中的参数包含了fixture名mydata,pytest会以该名称优先搜索fixture,然后搜索conftest.py.
fixture(scope="function", params=None, autouse=False, ids=None, name=None)
小疑问:功能和之前的setup、teardown有点像,区别在哪?
答:setup、teardown作用于全局,fixture更灵活。
一、conftest.py
一句话介绍:
上述的fixture和测试文件共存,需要用到多个fixture或者多个文件都共享这个fixture时,可以把fixture写在conftest.py中,conftest中的fixture可以供所在目录及其子目录下测试使用。
特点:不需要import,自动检测。
二、yield
一句话介绍:
fixture包含yield时,fixture内的执行会在yield之前停止,等测试函数执行完后再执行yield之后的内容,类似于teardown()
示例:
@pytest.fixture(scope="module")
def login():
print("登录")
yield
print("执行teardown!")
print("最后关闭浏览器")
三、fixture调用的三种方法:
1.如开头示例,直接在函数参数中加入。
2.使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例
示例:
@pytest.fixture(scope="function")
def myzhan():
print('\n-----开始执行function----')
@pytest.mark.usefixtures("myzhan")
class Test_zhan():
def test_zhan01(self):
print('~用例01~')
def test_zhan02(self):
print('~用例02~')
3.设置默认自动调用@pytest.fixture(scope="function", autouse=True)
四、fixture传参
1.request的使用
一句话说明:fixture参数列表中的request是pytest内建fixture之一,代表fixture调用状态。
示例:
test_data = ["admin", "test123"]
@pytest.fixture(scope="module")
def login(request):
user = request.param
print("登录账户为:%s"%user)
return user
@pytest.mark.parametrize("login", test_data, indirect=True)
def test_login(login):
'''登录用例'''
a = login
print("测试用例中login的返回值:%s" % a)
assert a != ""
添加indirect=True参数是为了把login当成一个函数去执行,而不是一个参数
2.多参数传参
示例:
test_data = [{"user": "admin", "password": "111111"},
{"user": "test123", "password": ""}]
@pytest.fixture(scope="module")
def login(request):
user = request.param["user"]
psw = request.param["password"]
print("登录账户:%s" % user)
print("登录密码:%s" % password)
if psw:
return True
else:
return False
@pytest.mark.parametrize("login", test_data, indirect=True)
def test_login(login):
'''登录用例'''
a = login
print("测试用例中login的返回值:%s" % a)
assert a, "失败原因是没输入密码"
3.多个fixture一起使用
示例:
@pytest.mark.parametrize("user", user, indirect=True)
@pytest.mark.parametrize("password", password, indirect=True)
def test_login(input_user, input_password):
'''登录用例'''
a = user
b = password
print("测试数据a-> %s, b-> %s" % (a,b))
assert b
假设user和passwor都有2条数据的情况下,会进行组合执行,一共执行4条用例。

浙公网安备 33010602011771号