pytest 框架用法总结

一、核心用法速览

测试发现

文件:test_*.py*_test.py

函数:test_开头

类:Test开头

自动递归搜索测试文件和函数,无需继承基类

基本断言

assert expression

支持智能错误提示(如列表/字典差异)

Fixture

@pytest.fixture

def setup_db(): return db_conn

管理测试资源(如数据库连接、临时文件),支持依赖注入

参数化测试

@pytest.mark.parametrize("a,b,expected", [(1,2,3), (4,5,9)])

同一测试函数运行多组数据

测试标记

@pytest.mark.slow

@pytest.mark.skip(reason="...")

分类筛选测试用例(如冒烟测试、性能测试)

异常断言

with pytest.raises(ExceptionType): ...

验证代码是否抛出预期异常

二、典型示例

1. Fixture 管理资源
# conftest.py(自动加载)
import pytest

@pytest.fixture(scope="session")  # 整个测试会话只创建一次
def database():
    db = connect_db()  # 连接数据库
    yield db           # 返回数据库对象给测试函数
    db.close()         # 测试结束后清理

# test_db.py
def test_user_count(database):
    assert database.query(User).count() > 0

2. 参数化与标记结合
import pytest

@pytest.mark.parametrize(
    "user, password, expected",
    [
        ("admin", "correct", True),
        ("admin", "wrong", False),
        pytest.param("guest", "any", False, marks=pytest.mark.xfail),  # 预期失败
    ]
)
def test_login(user, password, expected):
    result = login(user, password)
    assert result == expected

3. 并行测试(需安装 pytest-xdist
pytest -n 4  # 4个进程并行执行

三、框架亮点

1.简洁灵活:

无需继承 TestCase,用纯函数和类编写测试

支持自然语言断言(如 assert a == b)

2.强大的 Fixture 系统:

支持参数化 fixture(同一 fixture 返回多组数据)

支持依赖嵌套(fixture 可依赖其他 fixture)

作用域灵活(function/class/module/session)

3.丰富的插件生态

pytest-html:生成美观的 HTML 报告

pytest-mock:轻松 mock 外部依赖

pytest-rerunfailures:失败用例自动重试

pytest-xdist:多进程/分布式执行

4.测试生命周期钩子

通过自定义 pytest_collection_modifyitems 等 hook 函数,灵活控制测试流程

四、面试高频问题

1.pytest 与 unittest 的区别?

pytest 语法更简洁,无需继承基类;

unittest 是 Python 内置库,更适合简单场景。pytest 支持更强大的 fixture 和参数化,插件生态丰富。

2.如何处理测试用例的依赖关系?

使用 pytest-dependency 插件标记依赖关系:

@pytest.mark.dependency()
def test_login(): ...

@pytest.mark.dependency(depends=["test_login"])
def test_logout(): ...

3.Fixture 的作用域有哪些?

function(默认)、class、module、session,控制 fixture 的创建和销毁时机。

4.如何优化测试执行速度?

使用 pytest-xdist 并行执行测试通过 pytest -k "keyword" 筛选特定测试使用 pytest --lf 只运行上次失败的测试

5.如何实现测试数据与代码分离?

从 JSON/CSV 文件读取数据:

import json

@pytest.mark.parametrize("data", json.load(open("test_data.json")))
def test_api(data):
    assert request_api(data) == data["expected"]

五、实战技巧

1.生成测试覆盖率报告

pytest --cov=src --cov-report=html  # 生成 HTML 格式覆盖率报告

2.自定义标记在 pytest.ini 中注册标记:

[pytest]
markers =
    smoke: 冒烟测试
    regression: 回归测试

3.失败时自动调试

pytest --pdb  # 失败时进入 PDB 调试模式

4.结合 Allure 生成美观报告

pytest --alluredir=./allure-results
allure serve allure-results  # 生成交互式报告

六、总结

pytest 以其 简洁的语法强大的 Fixture 系统丰富的插件生态,成为 Python 测试的首选框架。掌握参数化测试、Fixture 管理和插件使用,可大幅提升测试效率和质量。在面试中,重点突出其灵活性、可扩展性和解决实际问题的能力。

测试开发知识汇总 文章被收录于专栏

一些面试当中总结的知识点和测试框架技术选型以及AI赋能测试的内容

全部评论
很全面
点赞 回复 分享
发布于 06-27 17:18 北京

相关推荐

欢聚一面面试题:自我介绍请介绍你们公司的测试周期流程如果研发说需求自测即可,不需要经过测试验证,你会怎么评判这件事情?Code review,你们会关注什么?我现在给你一个具体的测试场景,订单支付(只考虑支付)请设计出具体的测试用例。你们系统框架是怎样的?消息队列你会怎样考虑测试场景以及消息队列的结构是怎样的?Radis缓存,你会怎么考虑测试场景?数据库的多表查询有哪几种?倒序查询前十条数据那如果只要第二名的数据呢?数据脏读,你怎么验证?你们公司的自动化框架怎么区别不同环境的自动化测试?接口自动化的脏数据怎么清理?接口自动化断言会关注哪一些数据?接口返回较为复杂的嵌套结构,你怎么验证数据?怎么实现异步接口数据检查AI自动化,你们是怎么使用落地的?UI自动化和接口自动化的区别UI自动化点击按钮,偶尔不生效,你会怎么排查?显示等待和隐式等待的区别是怎样的?介绍一下你们公司性能测试流程性能测试你会关注哪些指标?在做压测时,你怎么判断是否有达到瓶颈?Tps压不上去,但是CPU和内存都是正常的你有没有遇到让你印象比较深刻的性能缺陷?Python怎么实现多线程?Python深拷贝和浅拷贝的区别你们公司代码覆盖率平台是怎么搭建的?以及你们会怎么检查?
查看30道真题和解析
点赞 评论 收藏
分享
06-22 11:35
门头沟学院 Java
1. 重写和重载的区别?2. 值传递和引用传递了解吗?3. Java中是值传递还是引用传递?4. 常见的异常有哪些?检查性异常了解吗?检查性异常有哪些?5. 空指针异常在什么情况下会发生?如何避免?6. finally块是否一定会执行?7. String、StringBuffer的区别?8. 什么时候用StringBuilder?9. equals方法和==的区别?什么情况用哪个?10. 常见的集合类有哪些?11. Map属于集合类吗?常见的Map实现类?12. HashMap的常用方法是如何工作的?13. List和Set的区别?14. ArrayList和LinkedList的区别?各自适用场景?在知道某个值的情况下哪个检索快?15. 进程和线程的区别?16. 线程问题是什么?如何解决线程问题?17. 在Java中一般发生在类属性还是方法变量?18. 内存泄漏是什么?如何避免?19. ThreadLocal的内存泄漏问题?20. HTTPS和HTTP的区别?21. HTTPS的加密过程?要使用https要怎么做?22. 主键和外键的区别?23. 主键是否只能有一个?24. 什么是事务?事务的应用场景?单表?多表?25. 数据库索引的设计原则?26. Redis了解吗?你们用在什么场景?27. 如何保证Redis和数据库的数据一致性?队列同步时间间隔怎么设置?28. 是否用过消息中间件?消息队列在项目中的具体应用?29. 是否了解微服务(如Spring Cloud)?30. 多表查询怎么做?31. 内连接和外连接的区别?32. 实际开发中是否用过连接查询?最多几张表?33. DTO、VO的区别?34. 整个请求从前端到后端处理哪里用到了DTO,哪里VO?35. MyBatis-Plus了解吗?他的常见函数?36. 是否使用过IDEA的调试功能?讲讲当时的场景?37. Postman了解吗?38. 如果现在让你实现一个多表查询的接口,从controller到service到mapper到postman调试能完成多少?39. Vue的生命周期?40. Vue组件之间如何通讯?41. 是否能盲打?42. 作息习惯?43. 阅读过的经典技术书籍?
点赞 评论 收藏
分享
小红书那边发了一遍,这边同时转一份,感谢牛客的牛油们的面经给到我的帮助。主要写一下从机考到最后技术面的流程和自己面试被问到的一些问题。6.18 机考 目标院校167低分通过最优投资方式 0AI处理器组合 55最佳的出牌方法 566.19 性格测试 通过这个很简单,跟着hr发的资料去做就行,网上也能找到一模一样的题库和答案。6.24 资格面试 通过简单聊聊就行,想挂很难。6.30 开发技术一面 挂上来深扒我项目,给他讲完算法流程,又开始问我细节和公式,后看我学了计组和数据结构,开始穿插问我408和python八股,最后手撕一道mid。手撕做出来了结果还是给我挂了,等了两天才上传结果,耽误时间,真是难绷。7.4 转测试换部门资格面试 通过同上次资格面,基本没有技术内容。7.12 测试技术一面 通过测试一面是我投递部门的主管来面试我,之前资格面后还通过一次电话,总体感觉还算轻松,就是手撕题目的时候回溯有点忘了导致做了三十多分钟才写完。上来先自我介绍一下,然后聊天框里给了我一道题,力扣上没找到,模版类似分割回文串,输入ababccc,返回5,分割方式为a,b,ab,c,cc,不能有重复的子串,写完后讲了一下思路,问我主要卡在哪边了。接下来问我了解了哪些关于测试的知识,大致讲了一下,然后问了问我的项目,可能之前资格面就拿到过我的简历了,后面更新的简历没有看到,介绍了下本科毕设项目(算法方面,和测试无关),然后我自己提到课设做过一些自动化测试和性能测试,简单聊了一下,让我举个例子说说测试方法,我就举了登陆窗口密码,等价类划分和边界值分析说了一下。后面可能因为是部门主管,还问了我一些场景题,团队协作方面的,没准备到导致可能回答的比较差,问了问我的薪资要求,秋招春招为什么没找到工作,为什么选择华为od,实话实说。反问问了下进去后有多久的缓冲期,以及部门要求的可信考试要达到的等级。最后就是说之后会录入面评,让我保持电话畅通等消息。7.14 测试技术二面 通过面了20分钟不到就结束了,八股问的很简单项目也问的很浅,手撕10分钟不到撕出来了,最后讲了下代码问我有没有问题就结束了。手撕题目大致是pattern=abba,s=dog cat cat dog,这种输出true,pattern里的每个字母对应s里的一个词,如果规律不一样就输出false,字典就可以解决,很简单。最后写点我的感受吧,机考的时候遇到三道没见过的题目,怎么输出还忘了,一直在调第一题的输出没调好,最后一题只剩半小时,写完提交分数刚好够,一看时间还剩一分钟,手都在抖,考完机考那天晚上一夜没睡,担心自己会不会没提交上,重复率会不会出问题,等到第二天hr告诉我结果才好好睡了一觉。后面开发技术一面挂的时候真的感觉天塌了,特别是等了两天才出结果还没过,心态直接崩了,还好hr一直告诉我没事的,测试很好过,慢慢心态才调节回来,专心准备测试的技术面,最后也是很顺利的通过了。回想起来真是太坎坷了,感觉每次都是背水一战,差一点就过不了的那种。最后结果也算不错吧,在大学里没怎么认真学习过,考研也没什么自控力最后差了好多分没进复试,能有这份工作算是最后的慰藉吧。
华为开奖709人在聊
点赞 评论 收藏
分享
一笑而过2222:4. Redis缓存更新机制 核心策略: - 过期删除:通过 expire 设置键的过期时间,到期后由后台线程(惰性删除+定期删除)处理。 - 惰性删除:客户端访问时检查是否过期,过期则删除。 - 定期删除:每隔一段时间随机检查部分键,删除过期键(通过配置 hz 控制检查频率)。 - 主动更新:应用主动调用 set / del 等命令更新缓存,常见场景: - 数据变更时(如数据库更新后),同步更新缓存。 - 缓存失效前(如提前30秒),后台线程主动刷新(“缓存预热”)。 - 淘汰策略:当内存不足时,按策略淘汰旧数据(如LRU、LFU、随机等,见第5点)。 5. Redis的LRU机制(Least Recently Used) 原理: - 近似LRU:Redis并非严格实现LRU,而是采样少量键(默认5个),淘汰其中最久未使用的键,通过 maxmemory-samples 参数调整采样数量。 - 实现方式:每个键维护 lru 字段(记录最后一次访问时间),淘汰时比较采样键的 lru 值。 - 优化策略: - Redis 4.0引入LFU(最不常用) 策略,结合访问频率和时间淘汰数据。 - 可通过 maxmemory-policy 配置淘汰策略,如 allkeys-lru (所有键中使用LRU)、 volatile-lru (仅过期键中使用LRU)。 6. Redis集群 核心架构(以Redis Cluster为例): - 分片机制: - 数据按哈希槽(Hash Slot)分布,共16384个槽,每个节点负责部分槽。 - 键通过 CRC16(key) % 16384 计算归属的槽,路由到对应节点。 - 节点角色: - 主节点(Master):负责读写操作,维护数据和槽信息。 - 从节点(Slave):复制主节点数据,主节点故障时可自动选举为新主(通过Raft协议)。 - 高可用机制: - 自动故障转移:当主节点下线,从节点通过投票成为新主,保证服务不中断。 - 数据冗余:每个主节点至少有一个从节点,避免单点故障。 - 集群通信: - 节点间通过Gossip协议交换状态信息(如节点存活、槽分配),维护集群拓扑。 - 典型部署: - 至少3个主节点(每个主带1个从),形成3主3从架构,保证容错性(最多允许1个主节点故障)。 补充:Redis集群的优缺点 - 优点: - 支持海量数据(通过分片扩展内存)。 - 高可用性(故障自动转移)。 - 读写分离(从节点可承担读请求)。 - 缺点: - 不支持多键事务(跨节点键无法原子操作)。 - 客户端需处理分片路由(或通过中间件如Codis、Twemproxy)。 - 集群扩展时需迁移数据(通过 redis-trib 工具自动迁移槽)。
字节跳动二面531人在聊
点赞 评论 收藏
分享
评论
3
14
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务