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条用例。

posted @ 2025-05-14 15:23  寻虫测试  阅读(35)  评论(0)    收藏  举报