pytest fixture是什么,pytest yield
本文主要介绍pytest官方解读fixtures中yield和addfinalizer的区别。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
00-1010前言一、问题回顾二。问题的解决
目录
在最后一章中,文章的结尾留下了一个有待填补的漏洞。问题是这样的:
目前从官方文件中我们可以看到的是
但是我们必须小心,因为一旦添加了终结器,pytest就会运行它,即使fixture在添加终结器后引发了异常。
一旦添加了终结器,pytest将被执行。
然而,当我试图在安装代码中抛出一个错误时,终止符代码没有执行。暂时尝试搜索外网没有得到任何有效的帮助,只好在GitHub上向pytest提出issue,这是一个以后要解决的坑。
前言
其实说到底是我理解的不对。可能我当时就在怀疑,难免会陷入死循环。后来在github上被别人问醒了。我们来看看我当时尝试演示上述结果的代码,也就是在设置代码中抛出了错误,但是没有执行终止符代码。
代码分为两部分,一部分是fixture功能代码,另一部分是测试用例。副本不能直接复制运行,但是我在项目的用例中修改了。在这里,它只帮助解释意思。
# conftest . py的内容
@pytest.fixture()
定义初始化数据分配任务(请求):
query_sql=
从“sm_purchase_allot”中选择id,其中“status ”!=5
db=DB()
data=db.fetch_one(query_sql)
db.close()
def demo_finalizer():
打印(运行终结器代码.)
request . add finalizer(demo _ finalizer)
返回数据
#测试案例的内容
.
定义测试分配详细信息(初始化数据分配任务):
有效负载={
allot id : init _ data _ allot _ task[0]
}
r=requests.post(QA_URL API_URL,json=payload,headers=HEADER)
result=r.json()
断言结果[result]==ok
断言结果[errmsg]==成功
assert len(result[ row ][ taskListOfPage ][ result data ])gt;0
我最开始想做的是,在fixture函数中,让代码db=DB()抛出一个mysql连接超时错误,然后就可以看到‘正在运行finalizer代码……’的输出了在控制台里。
但是,在我执行它之后,我没有看到预期的输出,这表明在安装程序代码抛出错误之后,addfinalizer代码没有执行。
最后在github上被朋友指出后,发现自己也误解了。
一、问题回顾
还是看一下官方原文:
但是我们必须小心,因为一旦添加了终结器,pytest就会运行它,即使fixture在添加终结器后引发了异常。
这句话实际上的意思是,一旦成功添加了终结器,pytest就会执行它。即使fixture函数在添加终结器后抛出异常。
按照这种理解,我的fixture函数代码有问题。因为db=DB()代码在请求前抛出错误。add finalizer (demo _ finalizer),这行添加终结器的代码实际上并没有执行,所以没有成功添加终结器。如何执行它们?
我终于明白了,于是调整了代码顺序,把request . add finalizer(demo _ finalizer)放在前面,然后连接fixture的代码:
# conftest . py的内容
@pytest.fixture()
定义初始化数据分配任务(请求):
query_sql=
从“sm_purchase_allot”中选择id,其中“status ”!=5
def demo_finalizer():
打印(运行终结器代码.)
request . add finalizer(demo _ finalizer)
打印(运行安装代码.)
db=DB()
data=db.fetch_one(query_sql)
db.close()
返回数据
这样,我们将首先看到“运行安装代码.”的输出,然后看到mysql抛出的错误,最后还是看到‘运行安装代码.’的输出。
运行代码进行验证:
没错。
这就是pytest对fixtures中yield和addfinalizer区别的解释细节。更多关于yield和addfinalizer的区别,请关注盛行的IT软件开发工作室的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。