面试的时候,面试官针对pytest会问些啥?

面试官在聊 pytest 时,通常会围绕“你是否真正会用、是否理解原理/细节、是否能解决常见坑”来提问。下面给你一份高频问题清单(附回答要点),你可以按面试方向挑着准备。


1)基础认知类(确认你会不会)

  1. pytestunittest 有什么区别?
    • 要点:pytest 采用“发现即执行”的约定(test 命名规则、简单写法)、更强的断言输出、fixture、插件生态;unittest 更偏类组织与 runner 风格。
  2. pytest 是怎么发现测试用例的?
    • 要点:默认匹配 test_*.pyTest*test_* 方法/函数;可通过配置/命令行改变。
  3. pytest 的执行顺序/作用域是什么?
    • 要点:收集阶段 vs 执行阶段;fixture 的作用域(function/module/class/session)。

2)Fixture 相关(最常被问、也最能体现水平)

  1. 什么是 fixture?@pytest.fixture 怎么用?
    • 要点:用于构造测试所需资源;支持依赖注入(fixture 参数)。
  2. fixture 的作用域有哪些?分别有什么区别?
    • 要点:function(每用例一次)、classmodulesession(全会话)。
  3. 如何做 fixture 的参数化?
    • 要点:@pytest.fixture(params=...) 或搭配 @pytest.mark.parametrize;也可用 request.param
  4. yield fixture 是什么?为什么用?
    • 要点:yield 前做 setup,yield 后做 teardown(用于资源释放,如临时文件/连接关闭)。
  5. fixture 返回值和作用域如何避免“状态污染”?
    • 要点:共享资源时要注意可变对象、深拷贝/重置,必要时缩小作用域或用 teardown 清理。

3)断言与输出(考你“会不会写好测试”)

  1. pytest 的断言为什么更好用?
    • 要点:自动解析 assert 表达式,给出更清晰的对比信息(diff)。
  2. 如何对复杂对象断言?
  • 要点:assert a == b + 自定义比较、或第三方断言库如 pytest-assume/deepdiff(看公司生态)。
  1. 当断言很多时怎么让失败信息更清楚?
  • 要点:合理拆分断言、使用 pytest.fail()、或在失败时输出关键上下文。

4)参数化(parametrize)与覆盖策略

  1. @pytest.mark.parametrize 怎么用?
  • 要点:给参数名列表和数据集;支持多维参数、组合。
  1. 如何给某些参数组合跳过?
  • 要点:在测试里用条件 if 跳过,或结合 pytest.param(..., marks=pytest.mark.skip/xfail)
  1. 如何实现“参数 ID”让报告更可读?
  • 要点:ids= 或对 pytest.param 指定 id。

5)跳过/期望失败(skip/xfail)

  1. skipskipif 有什么区别?
  • 要点:skip 直接跳;skipif 基于条件跳。
  1. xfailskip 的区别?
  • 要点:xfail 表示“失败是预期”,用来管理已知缺陷;strict=True 可让“意外通过”也算失败。
  1. 你怎么处理平台差异导致的差异测试?
  • 要点:用 sys.platform、环境变量或 marker 进行选择性执行。

6)命令行、配置与运行控制(很实用)

  1. 常见的 pytest 命令行参数有哪些?
  • 要点:-k(按关键字)、-m(按 marker)、-q/-v(日志)、-x(遇到失败立刻停止)、-s(不捕获输出)、--maxfail(最多失败次数)、--disable-warnings
  1. 怎么在 CI 里选择特定测试集?
  • 要点:-m + marker 分类(smoke/regression/slow)、或目录组织 + 表达式。
  1. pytest.ini / pyproject.toml / setup.cfg 怎么配置?
  • 要点:注册 markers、修改收集规则、报告选项等。

7)Hook / 插件(进阶面试常考)

  1. 你用过 pytest 的 hook 吗?比如 pytest_runtest_call
  • 要点:hook 可做日志、统计、拦截流程(一般了解并能讲用途)。
  1. 怎么做自定义插件?
  • 要点:写一个模块/类实现 hook;或通过 entry point/pytest_plugins 加载(看公司要求)。

8)报告与日志(工程化方向)

  1. 如何生成测试报告?如 HTML / JUnit XML?
  • 要点:pytest-html--junitxml=...;企业常用 Allure、ReportPortal 等。
  1. 失败时怎么保留截图/日志?
  • 要点:结合 fixture 的 teardown、或 pytest_runtest_makereport、或在失败时拿上下文输出。
  1. 如何在用例失败时打印更有用的调试信息?
  • 要点:使用 caplog/capsys fixture 捕获日志输出;或结构化日志。

9)并发与隔离(高级但高频坑)

  1. 如何并行执行 pytest?
  • 要点:常见 pytest-xdist-n auto),并发下注意资源竞争。
  1. 并发测试如何保证隔离?
  • 要点:避免写同一份共享数据/端口/文件;使用随机端口、临时目录、唯一测试数据;必要时加锁或禁用并发。

10)Mock/补丁(如果你也做接口自动化)

  1. pytest 里如何做 mock?和 unittest.mock 有何关系?
  • 要点:通常直接用 unittest.mock;或用 pytest-mock 提供 mocker fixture。
  1. 如何 mock 外部依赖(HTTP/DB/文件)让测试可重复?
  • 要点:依赖注入 + fixture 管理;用响应样本固定返回。

11)常见坑(面试官爱抓细节)

  1. fixture 返回可变对象会发生什么问题?怎么避免?
  • 要点:作用域扩大时容易状态污染;用深拷贝/重置/减小作用域/保证幂等。
  1. 为什么有时你写的变量改了但测试仍“看起来没变”?
  • 要点:fixture 缓存与作用域;或作用域对象复用导致的共享状态。
  1. 为什么测试通过/失败在本地与 CI 不一致?
  • 要点:环境变量、时区、并发竞争、依赖版本、随机性未固定、测试数据不一致。

建议你面试“背法”(快速拿分)

你可以用一句话总结你掌握程度:

  • “我熟悉 pytest 的用例收集、fixture 作用域、参数化、skip/xfail、marker 选择,以及常见报告/CI 集成;进阶上能讲并发隔离和自定义插件/钩子思路。”

如果你愿意,我可以按你的岗位方向(接口自动化/前端自动化/后端单元测试/运维脚本)再把问题收敛成“最可能被问的 10 个”,并给你对应的参考答案模板。你面试的是哪类岗位?