pytest框架之fixtrue详细使用。

1.fixture配合yield使用:appium自动化多终端测试经常会用到

import pytest
@pytest.fixture(params=[1,2,3])#params传可迭代对象,就会将所有的参数都进行迭代。
def add(request):
    i = request.param #获取传进来的的参数,就是迭代对象的参数
    print(f'我是第{i}次的开始执行')
    yield i #相当于return yield i 就是返回i,但是yield前面的代码是调用方法执行前先执行,yield后面的代码是,调用方法执行完成后在进行执行
    print(f'我是第{i}次的最后执行')

def test_add(add):
    print(f'我是第{add}次测试方法')
if __name__ == '__main__':
    pytest.main(['test001.py','-s'])

运行结果如下:

 多参形式:

import pytest
@pytest.fixture(params=[('a',1),('b','2'),('c',3)])#params传可迭代对象,就会将所有的参数都进行迭代。
def add(request):
    name=request.param[0]
    i = request.param[1] #获取传进来的的参数,就是迭代对象的参数
    print(f'我是{name}第{i}次的开始执行')
    yield i #相当于return yield i 就是返回i,但是yield前面的代码是调用方法执行前先执行,yield后面的代码是,调用方法执行完成后在进行执行
    print(f'我是{name}第{i}次的最后执行')

def test_add(add):
    print(f'我是第{add}次测试方法')
if __name__ == '__main__':
    pytest.main(['test001.py','-s'])

2。fixtrue结合pytest.mark.parametrize传递参数其实@pytest.mark.parametrize('add_one',data,indirect=True)就相当于@pytest.fixture(params=data)一样

两种传参形式。上面还有这一种都是为了给fixtrue修饰的函数传递参数。

@pytest.fixture()
def  add_one(request):
    return request.param[0]+request.param[1]

data=[(1,2),(2,3),(3,4)]
@pytest.mark.parametrize('add_one',data,indirect=True)
def test_add_one(add_one):
    print(f'我的结果是{add_one}')


if __name__ == '__main__':
    pytest.main(['test001.py','-s'])

 3.fixtrue不需要传参,测试方法调用

@pytest.fixture()
def add_two():
    lis=[]
    for i in range(3):
        lis.append(i)
        print(f'我是{i}')
    return lis
def test_add_two(add_two):
    print(add_two)
    print('我是测试方法')


if __name__ == '__main__':
    pytest.main(['test001.py','-s'])

 4.多个fixture互相使用

  4.1不需要传递参数形式

#多个fixture与fixture相互调用
@pytest.fixture()
def first():
    print("获取用户名")
    a = "yoyo"
    return a

@pytest.fixture()
def sencond(first):
    '''psw调用user fixture'''
    a = first
    print(a)
    b = "123456"
    return (a, b)

def test_1(sencond):
    '''用例传fixture'''
    print("测试账号:%s, 密码:%s" % (sencond[0], sencond[1]))

    assert sencond[0] == "yoyo"
if __name__ == '__main__':
pytest.main(['test_fixtrue.py'])
 

   4.2需要传递参数的形式

@pytest.fixture()
def A(request):
    param = request.param
    print(param)
    return param['username']
@pytest.fixture()
def B(A):
    new_name = A+'新的'
    return new_name
data = [{'username':'zxb','pwd':234}]
@pytest.mark.parametrize('A',data,indirect=True)
def test_AB(B):
    print(f'我得到的新名称是{B}')


if __name__ == '__main__':
    pytest.main(['test_fixtrue.py'])

原文地址:https://www.cnblogs.com/zhuxibo/p/14257211.html