上一章中,文末留下了一个坑待填补,疑问是这样的:

目前从官方文档中看到的是

We have to be careful though, because pytest will run that finalizer once it’s been added,
even if that fixture raises an exception after adding the finalizer.

一旦添加了终结器,pytest便会执行。

但是,当我尝试在setup代码中进行抛错,终结器的代码却并没有执行。

尝试搜索外网暂时也没得到有效的帮助,只能在GitHub上向pytest提了issue了,这里算是埋下一个坑,待后续解决。

一、问题回顾

其实说到底还是我理解的不对,可能当时自己处在疑问中难免就会陷入进死循环,后来在github上经过别人提点方才醒悟。

先来看下当时我尝试演示出上述结果的代码,也就是:setup代码中进行抛错,终结器的代码却并没有执行。

代码分为2部分,一个是fixture函数代码,另一个则是测试用例。代码是不能直接copy出来运行的,是我在项目的用例中

进行改造的,在这里仅仅帮助说明意思。

# content of conftest.py

@pytest.fixture()
def init_data_allot_task(request):
query_sql = """
SELECT id FROM `sm_purchase_allot` WHERE `status`!=5
"""
db = DB()
data = db.fetch_one(query_sql)
db.close() def demo_finalizer():
print("running finalizer code...")
request.addfinalizer(demo_finalizer)
return data
# content of testcase
...
def test_allot_detail(init_data_allot_task):
""" """
payload = {
"allotId": init_data_allot_task[0]
}
r = requests.post(QA_URL + API_URL, json=payload, headers=HEADER)
result = r.json() assert result["result"] == "ok"
assert result["errmsg"] == "success"
assert len(result["row"]["taskListOfPage"]["resultData"]) > 0

最开始我想做的是,在fixture函数中,让代码db = DB()抛出一个mysql连接超时的错误,

然后就能在控制台中看到"running finalizer code..."的输出。

但是我执行后,并没有看到预期的输出,说明setup代码抛错后,addfinalizer代码并没有执行。

最后经过github上朋友指点后,发现还是我自己理解错了。

二、问题解决

还是来看下官方的原文:

We have to be careful though, because pytest will run that finalizer once it’s been added,
even if that fixture raises an exception after adding the finalizer.

这句话意思其实是说,当finalizer 一旦添加成功后,pytest就会去执行它。就算是fixture函数在添加了finalizer之后

抛出了异常。

按照这样理解的话,那我在fixture函数中的代码就有问题了。因为db = DB()代码在request.addfinalizer(demo_finalizer)

之前就抛错了,那么实际上并没有执行到添加终结器的这行代码,所以终结器都还没添加成功,又怎么会去执行呢?

终于我明白过来了,于是调整了代码顺序,把request.addfinalizer(demo_finalizer)放到前面去,然后再接上fixture的代码:

# content of conftest.py
@pytest.fixture()
def init_data_allot_task(request):
query_sql = """
SELECT id FROM `sm_purchase_allot` WHERE `status`!=5
"""
def demo_finalizer():
print("running finalizer code...")
request.addfinalizer(demo_finalizer)
print("running setup code...") db = DB()
data = db.fetch_one(query_sql)
db.close()
return data

如此来看,我们会先看到"running setup code..."的输出,然后看到mysql抛错,

最后仍然可以看到"running setup code..."的输出。

运行代码验证一下:

这下就对了。

【pytest官方文档】解读fixtures - 8. yield和addfinalizer的区别(填坑)的更多相关文章

  1. 【pytest官方文档】解读fixtures - 3. fixtures调用别的fixtures、以及fixture的复用性

    pytest最大的优点之一就是它非常灵活. 它可以将复杂的测试需求简化为更简单和有组织的函数,然后这些函数可以根据自身的需求去依赖别的函数. fixtures可以调用别的fixtures正是灵活性的体 ...

  2. 【pytest官方文档】解读fixtures - 1.什么是fixtures

    在深入了解fixture之前,让我们先看看什么是测试. 一.测试的构成 其实说白了,测试就是在特定的环境.特定的场景下.执行特定的行为,然后确认结果与期望的是否一致. 就拿最常见的登录来说,完成一次正 ...

  3. 【pytest官方文档】解读fixtures - 2. fixtures的调用方式

    既然fixtures是给执行测试做准备工作的,那么pytest如何知道哪些测试函数 或者 fixtures要用到哪一个fixtures呢? 说白了,就是fixtures的调用. 一.测试函数声明传参请 ...

  4. Cuda 9.2 CuDnn7.0 官方文档解读

    目录 Cuda 9.2 CuDnn7.0 官方文档解读 准备工作(下载) 显卡驱动重装 CUDA安装 系统要求 处理之前安装的cuda文件 下载的deb安装过程 下载的runfile的安装过程 安装完 ...

  5. 【pytest官方文档】解读fixtures - 7. Teardown处理,yield和addfinalizer

    当我们运行测试函数时,我们希望确保测试函数在运行结束后,可以自己清理掉对环境的影响. 这样的话,它们就不会干扰任何其他的测试函数,更不会日积月累的留下越来越多的测试数据. 用过unittest的朋友相 ...

  6. 【pytest官方文档】解读fixtures - 10. fixture有效性、跨文件共享fixtures

    一.fixture有效性 fixture有效性,说白了就是fixture函数只有在它定义的使用范围内,才可以被请求到.比如,在类里面定义了一个fixture, 那么就只能是这个类中的测试函数才可以请求 ...

  7. 【pytest官方文档】解读- 插件开发之hooks 函数(钩子)

    上一节讲到如何安装和使用第三方插件,用法很简单.接下来解读下如何自己开发pytest插件. 但是,由于一个插件包含一个或多个钩子函数开发而来,所以在具体开发插件之前还需要先学习hooks函数. 一.什 ...

  8. 【pytest官方文档】解读- 开发可pip安装的第三方插件

    在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了.今天继续跟着官方文档学习更多知识点. 一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件 ...

  9. FluentValidation:C#后端输入验证框架的官方文档解读

    参照 FluentValidation 的官方文档写的例子,方便日后查看和使用. 原文:https://github.com/JeremySkinner/FluentValidation/wiki H ...

随机推荐

  1. HDU2732 Leapin' Lizards 最大流

    题目 题意: t组输入,然后地图有n行m列,且n,m<=20.有一个最大跳跃距离d.后面输入一个n行的地图,每一个位置有一个值,代表这个位置的柱子可以经过多少个猴子.之后再输入一个地图'L'代表 ...

  2. 2019-2020 ACM-ICPC Brazil Subregional Programming Contest Problem M Maratona Brasileira de Popcorn (二分)

    题意:有\(n\)袋爆米花,某个队伍有\(c\)个队员,每个队员每秒做多可以吃\(t\)粒爆米花,但一袋爆米花只能由一个队员吃完,并且一个队员只能吃连续的一袋或几袋,不能隔着吃某一袋,求将所有爆米花吃 ...

  3. vlc音视频开发(一)环境搭建(qt篇)

    来源:微信公众号「编程学习基地」 目录 简介 qt配置vlc环境 simple_libvlc_qt_player 项目地址 简介 VLC 是一款自由.开源的跨平台多媒体播放器及框架,可播放大多数多媒体 ...

  4. 02、Scrapy 安装、目录结构及启动

    1.从豆瓣源去快速安装Scrapy开发环境 C:\Users\licl11092>pip install -i https://pypi.douban.com/simple/ scrapy 2. ...

  5. SpringBoot引入openfeign 报错:spring-cloud-starter-openfeign:unknown

    现象: 1.maven报错:Cannot resolve org.springframework.cloud:spring-cloud-starter-openfeign:unknown 解决: 在h ...

  6. Linux-字符处理命令

    目录 1.sort(排序) 2.uniq(不相邻的两行重复不会去除) 3.cut(取列,截取字段) 4.wc(统计行.单词.字符数) 1.sort(排序) 选项: -t # 指定分隔符 -k # 指定 ...

  7. history-back

    ;!function(pkg, undefined){ //此声明函数在xback.js文件里有,在app.js里必须再声明一次,不然监听返回事件失败 var STATE = 'x-back'; va ...

  8. L3-015. 球队“食物链”【DFS + 剪枝】

    L3-015. 球队"食物链" 时间限制 1000 ms 内存限制 262144 kB 代码长度限制 8000 B 判题程序 Standard 作者 李文新(北京大学) 某国的足球 ...

  9. 计算机网络 part1 TCP

    一.TCP协议 references:newcoder TCP/IP协议,TCP和UDP的区别及特点 1.四层模型 应用层:载有应用程序,将数据发送给传输层.主要协议有HTTP.SMTP.FTP.DN ...

  10. Dockfile搭建极简LNMP环境

    最近才发现ThinkPHP6.0和CI4.x都要求php版本为7.1以上了,本机的php版本还停留在7.0.3x,又懒得升级,于是考虑使用Docker来运行一个lnmp环境. 常规环境搭建的方式有两种 ...