尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

pytest 实战:三步跑通第一个 Python 测试用例,让每次失败都有据可查

pytest 实战:三步跑通第一个 Python 测试用例,让每次失败都有据可查 pytest 实战三步跑通第一个 Python 测试用例让每次失败都有据可查【免费下载链接】pytestThe pytest framework makes it easy to write small tests, yet scales to support complex functional testing项目地址: https://gitcode.com/GitHub_Trending/py/pytest测试用例挂了终端里只剩一行AssertionError你说不清是输入错了、逻辑错了还是环境错了——这种场景你大概率经历过。pytest 是目前最流行的 Python 测试框架它会在导入测试模块时重写你的assert语句这叫断言重写失败时打印出指向具体差异位置的对比让你一眼看清错在哪一步。这篇文章聚焦 pytest 的核心能力跑通第一个用例看懂参数化和 fixture 这两个高频机制并在源码里迷路时知道该去哪找。一分钟认识Python 测试框架 pytest 是什么、谁在维护pytest 是一个既能写小型测试、又能撑住大规模功能测试的 Python 测试框架由开源社区维护三条信息讲清它是什么一个开源测试框架核心是三件套——断言重写、fixture夹具系统、插件生态。谁维护pytest-dev 开源社区核心成员包括 Holger Krekel、Bruno Oliveira 等MIT 协议要求 Python 3.10 及以上。适合谁写纯 Python 库或应用、希望测试代码里没有样板代码的人。项目起源于 2006 年德国弗莱堡的一场开发者大会现在由全球开发者共同维护。三步跑通第一个 pytest 测试用例读完这一节你能在一个空目录里跑起第一个测试用例全程约 2 分钟。第一步安装 pytestpip install pytest第二步在当前目录新建test_sample.py写第一个用例def test_add(): assert 1 1 2第三步直接运行pytest输出结尾会看到类似1 passed in 0.01s的汇总行。你不需要做任何注册pytest 默认自动收集以test_开头的文件以及文件里以test_开头的函数。当你要用多组输入验证同一逻辑pytest 参数化怎么写这一节解决同一套逻辑要跑多组输入的问题把用例复制 N 份不如用一个装饰器展开。import pytest pytest.mark.parametrize(a, b, expected, [ (1, 2, 3), (-1, 1, 0), (0, 0, 0), ]) def test_add(a, b, expected): assert a b expected运行pytest -v你会看到test_add[1-2-3]、test_add[-1-1-0]、test_add[0-0-0]三个独立用例各自单独报通过或失败——第 2 组挂了第 3 组照常执行失败定位精确到具体参数。当你不想重复写同一段准备代码pytest fixture 怎么用fixture夹具相当于测试用例的准备助手写一次需要的用例声明参数名就能拿到结果。import pytest pytest.fixture def csv_file(tmp_path): p tmp_path / data.csv p.write_text(name,age\nalice,30\n) return p def test_read_csv(csv_file): assert csv_file.read_text().startswith(name,age)其中tmp_path是 pytest 内置的临时目录夹具用例跑完自动清理不用你操心垃圾文件。给 fixture 加上scopesession整个测试会话只执行一次适合数据库连接这类昂贵资源。核心代码在哪看src/_pytest 下 5 个模块速览想弄清 pytest 内部怎么工作、或者要写自己的插件先看这 5 个模块模块职责路径config命令行解析、ini 配置、插件加载src/_pytest/config/assertionassert 重写与失败差异输出src/_pytest/assertion/fixturesfixture 定义、作用域与依赖解析src/_pytest/fixtures.pyrunner用例收集、执行与报告生成src/_pytest/runner.pyterminal终端输出与报告格式化src/_pytest/terminal.pypytest 常见坑 4 个从命名规则到 fixture 作用域下面 4 个坑都是真实高频问题按现象→原因→解法说明用例被静默忽略。你写了testFoo()或把代码放在sample_test.py里运行提示没有测试。原因默认只收集test_开头或_test.py结尾的文件与test_开头的函数。解法改名命名有特殊要求就在pytest.ini里配python_files。断言重写失效报错只剩assert False。常见于用python -O优化模式运行或模块没走 pytest 进程导入。解法检查入口始终用pytest或python -m pytest启动。两个同名测试文件引发导入错误。不同目录各有一个test_sample.py且都没有__init__.pypytest 会报 import file mismatch。解法给目录加__init__.py明确包边界或让文件名全局唯一。--cov、--html报未知选项。这两个不是内置功能要先pip install pytest-cov pytest-html。遇到unknown option先检查是否缺对应插件——pytest 的很多能力由插件生态提供。pytest 适合什么场景什么场景别硬上选测试框架不看热度看项目匹配度。适合上 pytest 的场景纯 Python 库的单元测试断言语法比 unittest 少一半样板失败输出直接指向差异位置。需要筛选与中断的大测试套件pytest -m not slow排除慢用例-x首败即停。建议缓一手的场景团队已有成熟 unittest 套件全部重写的维护成本大于收益——pytest 能直接收集和运行 unittest 用例不需要强行迁移。核心诉求是性能压测pytest 打印的单用例耗时只是参考值基准测试要上专门工具。相对标准库 unittestpytest 的优势在免类断言与更灵活的 fixture 作用域相对更早的 nose它的维护活跃度远超后者是当前主流选择。读完就能做pytest 上手 5 件事以下 5 件事 15 分钟内可全部完成本地即可验证跑一遍pip install pytest写出 3 行用例并跑绿。用pytest -v观察失败输出确认它指向具体差异。把一个用例改成 parametrize一次验证多组输入。把重复的准备代码抽成一个 fixture。翻一翻src/_pytest/assertion/的重写逻辑搞懂 pytest 报错为什么比裸 assert 好读。接下来要写 Python 测试pytest 是最值得先动手的一个起步成本只花两分钟生态会替你解决后面的事。【免费下载链接】pytestThe pytest framework makes it easy to write small tests, yet scales to support complex functional testing项目地址: https://gitcode.com/GitHub_Trending/py/pytest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表