pytest- fixture个人理解总结
pytest fixture超级灵活 缺乏百度文档学习,很多骚操作(继承、共享……),面试也爱问,多看多写。
前后置条件公式:
@pytest.fixture #无参则默认为函数级别,可带参数 加上:(scope=”class”/”module”/”session”, auto=True)
Def fun1():
前置条件执行体
Yield 返回值
后置条件执行体
#用例方法要调用前后置条件时:
@pytest.mark.usefixtures(“fun1”)
def test_add(self, fun1): #要用前置条件函数中返回值时,此处用例方法才需传参,参数名一定同fixture函数名
XXX
XXX
Fixture骚操作---fixture的继承
如下图代码,init_driver 是 login_web的 一部分,两个都是函数级别的前后置条件,可以使用继承来优化Login_web。
自己理解:此处继承其实更像调用,先执行别人的代码,再执行自己的代码,如果要用到别人的返回值,仍用别人的函数名接收返回值直接使用。
继承了其他的前后置,其实是先执行一遍其它前后置函数中的语句。所以说省代码!
使用继承后 login_web函数改为如下:
# 访问网站并且登陆成功
@pytest.fixture
def login_web(init_driver):#login_web函数继承了init函数,或者叫调用了init函数,因为执行login_web时会先执行下init函数
# login_web 调用了init—_web(就像用例方法调用前置条件一样来调用,直接加前置条件的函数名),并用init_driver接收了它的返回值
LoginPage(init_driver).login(CD.user, CD.passwd)#init的返回值是driver,所以driver都换成了init
yield init_driver
fixture骚操作--全局共享conftest.py
使用pytest时,如果多处测试用例想共享一个前置、后置条件,则把fixture写在一个叫conftest.py的文件中。
1.固定名字,因为pytest有个机制会自动去conftest.py中搜索fixture, 而在用例文件当中,也不需要去引入conftest.py
2.作用域:当前conftest文件所在目录及N级子目录下的用例,均可直接调用此文件当中的 fixtures.
3.如果fixture出现重名。就近原则,优先使用自己文件下的,其次找父目录下的共享文件中的即同一爸爸的,其次才会去爷爷那去找。.