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'])