Pytest 框架快速入门

Pytest 框架常用功能介绍

一、简介

Pytest 是一个功能强大的 Python 测试框架,具有简单易用、测试用例清晰易读、支持参数化、可运行由 Nose 和 unittest 编写的测试用例、拥有丰富的第三方插件且可自定义扩展、支持重复执行失败的用例以及方便与持续集成工具集成等特点。

二、快速入门

  1. 安装 :使用 pip3 install pytest 命令进行安装。
  2. 查看版本 :通过 Pytest --version 查看版本。
  3. 快速入门示例 :
    • 导入 pytest。
    • 定义测试用例方法和测试函数,使用 assert 进行断言。
    • 通过 pytest.main(["-s", "test_sample.py"]) 执行测试。

三、基础使用

  1. 用例前置和后置执行
    • unittest :通过 setUp 和 tearDown 在每个用例执行前后执行,通过 setUpClass 和 tearDownClass 在类里面所有用例执行前后执行。
    • pytest :函数级别为 setup/teardown,运行于测试方法的始末,每个测试用例运行一次;类级别为 setup_class/teardown_class,运行于测试类的始末,一个测试内只运行一次。
  2. 默认运行规则
    • 测试文件以 test_*.py 开头或 *_test.py 结尾。
    • 测试类以 Test 开头,且不能带有 __init__ 方法。
    • 测试函数以 test_ 开头。
    • 运行参数:
      • -v:用于显示每个测试函数的执行结果。
      • -q:只显示整体测试结果。
      • -s:用于显示测试函数中 print() 函数输出。
  3. 自定义运行规则
    • 在 pytest.ini 文件中配置,如 addopts(运行参数)、testpaths(测试目录)、python_files(测试文件)、python_classes(测试类)、python_functions(测试方法)等。
  4. 断言
    • 使用标准的 Python assert 断言语句,如 assert xx(判断 xx 为真)、assert not xx(判断 xx 不为真)、assert a in b(判断 b 包含 a)、assert a == b(判断 a 等于 b)、assert a!= b(判断 a 不等于 b)。

四、标记(mark)使用

  1. 标记
    • 一个测试函数可以有多个标记,一个标记也可以标记多个测试函数。
    • 运行参数:pytest -m test01 或 pytest -m "test01 or test02"。
  2. 跳过测试
    • skip:标记 skip 表示跳过该测试用例,运行不执行,可使用 skip(reason=None)。
    • skipif:条件判断验证是否忽略不执行,判断条件为表达式 skipif(condition, reason=None)。

五、数据参数化

  1. 传入单个参数 :pytest.mark.parametrize(argnames, argvalues),argnames 为参数名,argvalues 为参数对应值,类型必须为可迭代类型,一般使用 list。
  2. 传入多个参数 :@pytest.mark.parametrize(("username", "password"), [("xiaoming", "123456"), ("xiaohong", "456789")]),list 的每个元素都是一个元组,元组里的每个元素和按参数顺序一一对应。

六、常用插件

  1. pytest-html :用于生成测试报告,安装命令为 pip3 install pytest-html,在配置文件中的命令行参数中增加 --html=用户路径/report.html。
  2. pytest-rerunfailures :当失败后尝试再次运行,安装命令为 pip3 install pytest-rerunfailures,在配置文件中的命令行参数中增加 --reruns n,如果期望加上出错重试的等待时间,可使用 --reruns-delay。

七、Fixture

  1. 作用 :setup、teardown 针对整个脚本全局生效,而 fixture 可以让我们自定义测试用例的前置条件。
  2. 优势 :
    • 命名方式灵活,不局限于 setup 和 teardown。
    • 在 conftest.py 配置里可以实现数据共享,不需要 import 就能自动找到 fixture。
    • scope="session" 可实现多个 .py 跨文件使用一个 session 来完成多个用例。
  3. 如何使用 :
    • 将 fixture 名称作为测试用例函数的输入参数:@pytest.fixture。
    • 测试用例加上装饰器:@pytest.mark.usefixtures(fixture_name)。
    • fixture 设置:@pytest.fixture(autouse=True)。
  4. scope :fixture 的作用域,默认为 function(函数级别),排序为:session > module > class > function。
  5. autouse :默认 False,手动调用该 fixture;如果是 True,所有作用域内的测试用例都会自动调用该 fixture。
  6. name:默认装饰器的名称。
  7. 实例化顺序 :
    • function(函数级):每一个函数都会调用。
    • class(类级别):每个测试类只运行一次。
    • module(模块级):每一个 .py 文件调用一次。
    • session(会话级):每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法,是针对 .py 级别。
相关推荐
Marst Code34 分钟前
上位机开发日记 · 第 12 篇 · 测试:设备模拟器是核心资产
python
坊钰1 小时前
【LangGraph框架入门级】4. 支持联网搜索的智能代理系统
python·ai编程·langgraph
运维@小兵1 小时前
安装Pycharm并破解
ide·python·pycharm
冬、不眠的夜1 小时前
Nuitka 将 python 程序编译成 exe 指南
开发语言·python
范中勤2 小时前
Python Asyncio 协程与 LLM 异步并发原理技术文档(与 Java 对比|彻底澄清所有误区)
python·llm·协程·并发编程·asyncio
Dmz丶2 小时前
前端转 AI 100 天 Day 21:FastAPI 入门——从命令行到 HTTP 服务
python
QQ14220784492 小时前
基于 Flask 的「自动任务控制台」设计与踩坑实录
后端·python·flask
吴佳浩 Alben2 小时前
一文讲透推理引擎性能指标:TTFT、TPOT、KV命中率、并发,到底对应 vLLM / SGLang 的哪个参数?
人工智能·python·语言模型·架构·ai编程·vllm·sglang
用户298698530142 小时前
Python 实现 Word 转 XPS、PostScript 与 OFD 格式
后端·python·api
Patrick在香港2 小时前
你写的「比较 token」函数,正在用 36 纳秒泄露密码:时序攻击实测
python·安全·标准库·时序攻击·常量时间