当前位置: 首页 > news >正文

PyTest核心教程(从入门到精通,实战版)

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程​​https://www.captainai.net/troubleshooter

这是一份最实用、最精简、可直接落地项目的 PyTest 核心教程,覆盖 90% 日常测试需求,适合自动化测试、单元测试、接口测试使用。

一、安装与基础运行

1. 安装

pip install pytest

2. 命名规则(必须遵守)

PyTest自动识别

  • 测试文件:test_*.py*_test.py
  • 测试函数 / 方法:test_*
  • 测试类:Test*(类内不能有__init__

3. 运行命令(最常用)

pytest # 运行所有测试 pytest -v # 详细输出(推荐) pytest -s # 显示 print 内容 pytest test_demo.py # 运行单个文件 pytest test_demo.py::test_func # 运行单个用例

二、最简单的测试用例

示例:test_demo.py

# 最简单的测试:函数形式 def test_add(): assert 1 + 2 == 3 # 测试类形式 class TestDemo: def test_sub(self): assert 5 - 2 == 3

运行:

pytest test_demo.py -v

PyTest 最大优势:只用原生 assert,不用任何复杂语法!

三、断言(核心)

PyTest 断言超级简单,全部用 Python 自带assert

1. 常用断言

assert 1 == 1 # 相等 assert 2 > 1 # 大小 assert "a" in "abc" # 包含 assert True # 布尔判断 assert [1,2] == [1,2] # 列表相等

2. 异常断言(必学)

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

import pytest def test_zero_division(): with pytest.raises(ZeroDivisionError): 1 / 0

3. 浮点数断言(必学)

assert 0.1 + 0.2 == pytest.approx(0.3)

四、Fixture(测试神器)

Fixture = 前置 + 后置 + 共享数据替代传统setup/teardown,是 PyTest 最核心功能。

1. 基础 Fixture

import pytest # 定义 fixture @pytest.fixture def user(): print("\n前置:准备用户数据") yield {"name": "test", "age": 18} # 返回数据给测试用例 print("\n后置:清理数据") # 测试用例直接使用(传参即可) def test_user(user): assert user["age"] == 18

2. Fixture 作用域(重点)

@pytest.fixture(scope="function") # 默认:每个函数执行一次 @pytest.fixture(scope="class") # 每个类一次 @pytest.fixture(scope="module") # 每个文件一次 @pytest.fixture(scope="session") # 整个测试会话一次(全局)

3. 自动执行 Fixture

@pytest.fixture(autouse=True) # 自动运行,不用传参 def setup(): print("每个用例自动执行前置")

4. conftest.py(全局共享)

项目根目录创建conftest.py所有测试文件都能使用里面的 fixture,无需导入。

五、参数化测试(数据驱动)

一组测试逻辑 + 多组测试数据 = 批量运行大幅减少重复代码。

1. 基础参数化

import pytest @pytest.mark.parametrize("a, b, expected", [ (1, 2, 3), (4, 5, 9), (0, 0, 0), ]) def test_add(a, b, expected): assert a + b == expected

2. 给用例起名字(清晰)

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

六、标记用例(skip/xfail/ 自定义)

1. 跳过用例

@pytest.mark.skip("暂时不执行") def test_skip(): assert 1 == 2

2. 条件跳过

import sys @pytest.mark.skipif(sys.platform == "win32", reason="Windows不支持") def test_linux_only(): pass

3. 预期失败(已知 Bug)

@pytest.mark.xfail(reason="Bug未修复") def test_known_fail(): assert False

4. 自定义标记(冒烟 / 回归)

@pytest.mark.smoke # 冒烟用例 def test_login(): assert True

运行:

pytest -m smoke

七、常用插件(必装)

1. 生成美观 HTML 报告

pip install pytest-html pytest --html=report.html

2. 测试覆盖率

pip install pytest-cov pytest --cov

3. 多进程并行运行(加速)

pip install pytest-xdist pytest -n auto

八、标准项目结构(企业级)

项目/ ├── conftest.py # 全局 fixture ├── pytest.ini # 配置文件 ├── src/ # 业务代码 └── tests/ # 测试目录 ├── test_api.py ├── test_db.py └── test_user.py

pytest.ini 示例

[pytest] testpaths = tests python_files = test_*.py python_classes = Test* python_functions = test_* markers = smoke: 冒烟测试 api: 接口测试

九、完整实战示例(可直接复制)

import pytest # Fixture @pytest.fixture def calc(): class Calc: def add(self, a, b): return a + b def div(self, a, b): return a / b return Calc() # 参数化 @pytest.mark.parametrize("a,b,expected", [(1,2,3), (4,5,9)]) def test_add(calc, a, b, expected): assert calc.add(a, b) == expected # 异常测试 def test_div_zero(calc): with pytest.raises(ZeroDivisionError): calc.div(1, 0) # 跳过用例 @pytest.mark.skip def test_skip(): assert 1 == 1

核心总结(记住这 6 点就够了)

  1. 文件 / 函数以 test_ 开头,自动识别
  2. 只用 assert断言,简单强大
  3. Fixture做前置 / 后置 / 数据共享
  4. @parametrize实现数据驱动
  5. mark标记:skip/xfail/smoke
  6. 插件:报告、覆盖率、并行执行
http://www.jsqmd.com/news/654370/

相关文章:

  • 前端技术中的框架选择工程化建设与性能监控
  • 小语种支持卡点突破:基于LoRA+LangChain+CC100的轻量化多语言微调方案(已交付17家出海客户)
  • 【AI模型】助手-低代码平台
  • Nmap扫描策略盲测:用Zenmap对比6种预设模板的实战效果
  • Protocol Buffers(Protobuf)深度解析
  • 告别混乱:用FatFS为你的ESP32物联网项目构建可靠的文件存储方案
  • 从约束到方程:三次多项式轨迹生成的数学推导与工程实现
  • 雷军再次回应“1300 公里中间只充一次电”
  • 别再纠结GDI+和Qt了!聊聊Windows下那些被低估的2D绘图库:Cairo和Skia实战对比
  • 2026 计算机专业怎么选?18 个细分方向 + 就业前景全整理
  • YOLOv11最新进展尝鲜:在PyTorch 2.8环境中编译与测试
  • 6层高速PCB设计实战:BGA布局与阻抗匹配关键解析
  • Clang编译器前端深度解析
  • TMS320F280049C ADC实战:从软件触发到ePWM同步采样的工程化解析
  • 老板裁员后很奇怪:原先 100 个人干 50 个人的活,裁掉一半后,剩下 50 人干 25 个人的活,但好像并没有提高工作效率
  • 3分钟掌握百度网盘直链解析:突破限速的技术革新方案
  • 基于EasyCode插件的SpringBoot和Mybatis框架快速整合以及PostMan的使用
  • 从原理到优化:深入剖析ItemCF协同过滤算法及其工程实践
  • 【生成式AI错误处理黄金法则】:20年架构师亲授5大高频故障拦截与自愈机制
  • 月薪 3 万去草原给 DeepSeek 守机房
  • A级数据中心建设运营汇报方案:A级数据中心建设、A级数据中心运营、数据中心节能
  • 网安核心知识点:Web / 软件 / 安卓 / APP 逆向全汇总
  • Cogito混合推理模型避坑指南:新手部署与调用中的5个关键问题
  • QGIS源码探秘——从模块构成到分层架构的深度解析
  • Android虚拟定位终极指南:FakeLocation如何解决你的位置隐私痛点
  • 北交所功率半导体第一股,诞生!
  • Pixel Language Portal入门指南:理解混元转码核心与跨维度语义保持机制
  • 百度网盘直链解析技术:突破限速壁垒的工程实现方案
  • 2026百元蓝牙耳机技术参数横向对比:基于蓝牙5.4/ENC/续航等核心指标的实测分析
  • OpenGL渲染与几何内核那点事-项目实践理论补充(一-3-(3):GPU 着色器进化史:从傻瓜相机到 AI 画师,你的显卡里藏着一场战争)