面试官在聊 pytest 时,通常会围绕“你是否真正会用、是否理解原理/细节、是否能解决常见坑”来提问。下面给你一份高频问题清单(附回答要点),你可以按面试方向挑着准备。
1)基础认知类(确认你会不会)
-
pytest和unittest有什么区别?- 要点:
pytest采用“发现即执行”的约定(test 命名规则、简单写法)、更强的断言输出、fixture、插件生态;unittest更偏类组织与 runner 风格。
- 要点:
-
pytest是怎么发现测试用例的?- 要点:默认匹配
test_*.py、Test*、test_*方法/函数;可通过配置/命令行改变。
- 要点:默认匹配
-
pytest的执行顺序/作用域是什么?- 要点:收集阶段 vs 执行阶段;fixture 的作用域(function/module/class/session)。
2)Fixture 相关(最常被问、也最能体现水平)
-
什么是 fixture?
@pytest.fixture怎么用?- 要点:用于构造测试所需资源;支持依赖注入(fixture 参数)。
-
fixture 的作用域有哪些?分别有什么区别?
- 要点:
function(每用例一次)、class、module、session(全会话)。
- 要点:
-
如何做 fixture 的参数化?
- 要点:
@pytest.fixture(params=...)或搭配@pytest.mark.parametrize;也可用request.param。
- 要点:
-
yieldfixture 是什么?为什么用?- 要点:yield 前做 setup,yield 后做 teardown(用于资源释放,如临时文件/连接关闭)。
-
fixture 返回值和作用域如何避免“状态污染”?
- 要点:共享资源时要注意可变对象、深拷贝/重置,必要时缩小作用域或用 teardown 清理。
3)断言与输出(考你“会不会写好测试”)
-
pytest的断言为什么更好用?- 要点:自动解析
assert表达式,给出更清晰的对比信息(diff)。
- 要点:自动解析
- 如何对复杂对象断言?
- 要点:
assert a == b+ 自定义比较、或第三方断言库如pytest-assume/deepdiff(看公司生态)。
- 当断言很多时怎么让失败信息更清楚?
- 要点:合理拆分断言、使用
pytest.fail()、或在失败时输出关键上下文。
4)参数化(parametrize)与覆盖策略
@pytest.mark.parametrize怎么用?
- 要点:给参数名列表和数据集;支持多维参数、组合。
- 如何给某些参数组合跳过?
- 要点:在测试里用条件
if跳过,或结合pytest.param(..., marks=pytest.mark.skip/xfail)。
- 如何实现“参数 ID”让报告更可读?
- 要点:
ids=或对pytest.param指定 id。
5)跳过/期望失败(skip/xfail)
skip和skipif有什么区别?
- 要点:
skip直接跳;skipif基于条件跳。
xfail和skip的区别?
- 要点:
xfail表示“失败是预期”,用来管理已知缺陷;strict=True可让“意外通过”也算失败。
- 你怎么处理平台差异导致的差异测试?
- 要点:用
sys.platform、环境变量或 marker 进行选择性执行。
6)命令行、配置与运行控制(很实用)
- 常见的 pytest 命令行参数有哪些?
- 要点:
-k(按关键字)、-m(按 marker)、-q/-v(日志)、-x(遇到失败立刻停止)、-s(不捕获输出)、--maxfail(最多失败次数)、--disable-warnings。
- 怎么在 CI 里选择特定测试集?
- 要点:
-m+ marker 分类(smoke/regression/slow)、或目录组织 + 表达式。
pytest.ini / pyproject.toml / setup.cfg怎么配置?
- 要点:注册 markers、修改收集规则、报告选项等。
7)Hook / 插件(进阶面试常考)
- 你用过 pytest 的 hook 吗?比如
pytest_runtest_call?
- 要点:hook 可做日志、统计、拦截流程(一般了解并能讲用途)。
- 怎么做自定义插件?
- 要点:写一个模块/类实现 hook;或通过 entry point/
pytest_plugins加载(看公司要求)。
8)报告与日志(工程化方向)
- 如何生成测试报告?如 HTML / JUnit XML?
- 要点:
pytest-html、--junitxml=...;企业常用 Allure、ReportPortal 等。
- 失败时怎么保留截图/日志?
- 要点:结合 fixture 的 teardown、或
pytest_runtest_makereport、或在失败时拿上下文输出。
- 如何在用例失败时打印更有用的调试信息?
- 要点:使用
caplog/capsysfixture 捕获日志输出;或结构化日志。
9)并发与隔离(高级但高频坑)
- 如何并行执行 pytest?
- 要点:常见
pytest-xdist(-n auto),并发下注意资源竞争。
- 并发测试如何保证隔离?
- 要点:避免写同一份共享数据/端口/文件;使用随机端口、临时目录、唯一测试数据;必要时加锁或禁用并发。
10)Mock/补丁(如果你也做接口自动化)
- pytest 里如何做 mock?和 unittest.mock 有何关系?
- 要点:通常直接用
unittest.mock;或用pytest-mock提供mockerfixture。
- 如何 mock 外部依赖(HTTP/DB/文件)让测试可重复?
- 要点:依赖注入 + fixture 管理;用响应样本固定返回。
11)常见坑(面试官爱抓细节)
- fixture 返回可变对象会发生什么问题?怎么避免?
- 要点:作用域扩大时容易状态污染;用深拷贝/重置/减小作用域/保证幂等。
- 为什么有时你写的变量改了但测试仍“看起来没变”?
- 要点:fixture 缓存与作用域;或作用域对象复用导致的共享状态。
- 为什么测试通过/失败在本地与 CI 不一致?
- 要点:环境变量、时区、并发竞争、依赖版本、随机性未固定、测试数据不一致。
建议你面试“背法”(快速拿分)
你可以用一句话总结你掌握程度:
- “我熟悉 pytest 的用例收集、fixture 作用域、参数化、skip/xfail、marker 选择,以及常见报告/CI 集成;进阶上能讲并发隔离和自定义插件/钩子思路。”
如果你愿意,我可以按你的岗位方向(接口自动化/前端自动化/后端单元测试/运维脚本)再把问题收敛成“最可能被问的 10 个”,并给你对应的参考答案模板。你面试的是哪类岗位?