pytest的学习过程

本篇章为pytest的学习过程,仅是个人的观点

1、unittest和pytest的介绍

核心对比内容如下:

1、安装与版本管理:

  • unittest:作为 Python 的内置标准库,它无需额外安装,但无法灵活升级或降级
  • pytest:是一个第三方库,需要手动安装,可以自由指定、升级或降级到任何需要的版本

2、代码风格与易用性:

  • unittest:代码风格被描述为类似 Java 语言(需要创建类、继承、使用特定断言方法,代码稍显繁琐)
  • pytest:代码风格更 "Pythonic",语法更简洁,可以用简单的 assert 语句进行断言,减少了大量的样板代码

3、插件生态与扩展性(核心优势):

  • unittest:插件生态非常有限,扩展能力弱
  • pytest:拥有一个极其强大的插件生态,覆盖了报告、异步、Web测试、性能等方方面面,扩展性极强

4、兼容性与维护:

  • unittest:由 Python 官方直接维护,是官方标准
  • pytest:一个关键优势是它完全兼容用 unittest 编写的测试用例,使得从 unittest 迁移到 pytest 的成本非常低

2、如何快速上手?

需要安装pytest:pip install pytest

升级到最新版:pip install pytest -u

对于pytest来说有三种启动方式:

1、命令:需要在终端上输入pytest【推荐使用】

2、代码:需要新建一个main.py的文件,在main里面启动【推荐使用】

import pytest

pytest .main()

3、鼠标【不推荐】:这种操作方式是由pycham提供的,不是pytest提供的

3、如何看懂结果?

1、执行环境:版本、根目录、用例数量

2、执行过程:文件名称、用例结果、执行速度

3、失败详情:用例内容、断言提示

4、整体摘要:结果情况、结果数量、花费时间

用例结果的缩写:

. : passed (通过)

F: failed (失败:用例执行时报错)

E: error (出错:fixture执行时报错)

s: skipped (跳过)

X: xpassed (预期外的通过:不符合预期)

x: xfailed (预期内的失败:符合预期)

4、用例规则

分为两部分:用例发现规则,用例内容规则

1、用例发现规则:测试框架在识别、加载用例的过程

pytest的用例发现步骤:

1、遍历所有的目录,例外:venv,. 开头的目录

2、打开python文件,test_ 开头或者**_test**结尾

3、遍历所有的Test开头类

4、收集所有的test_开头的函数或者方法

2、用例内容规则:pytest 8.4增加了一个强制要求

pytest对用例的要求:

1、可调用的(函数、方法、类、对象)

2、名字test_开头

3、没有参数(参数有另外含义)

4、没有返回值(默认为None)

参数self:函数本身的变量

5、配置框架

配置可以改变pytest的默认规则:

  • 命令参数
  • ini配置文件

所有的配置方式,可以一键获取:pytest -h

配置文件可以使用 pytest.ini 来命名,一般介绍有哪些配置,分别使用什么方式等

常用的参数有:

  • -v:增加详细程度
  • -s:在用例中正常的使用输入输出
  • -x:快速退出,当遇到失败的用例停止执行
  • -m:用例筛选

6、标记mark

标记可以让用例与众不同,进而可以让用例被区别对待

**1、用户自定义标记:**用户自定义标记只能实现用例筛选

操作步骤:

  • 先注册
  • 再标记
  • 后筛选
复制代码
class TestAdd:
    @pytest.mark.api
    def test_int(self):
        res = add(2, 3)
        assert res == 5

    @pytest.mark.web
    def test_str(self):
        res = add("hello", "world")
        assert res == "helloworld"

    @pytest.mark.ut
    def test_list(self):
        res = add([1, 2, 3], [4, 5, 6])
        assert res == [1, 2, 3, 4, 5, 6]

运行的时候可以使用:pytest -m ut 来筛选特定的运行结果

2、框架内置标记

框架内置标记为用例增加特殊的执行效果

和用户自定义标记区别:

1、不需注册,可以直接使用

2、不仅可以筛选,还可以增加特殊效果

3、不同的标记,增加不同的特殊效果

  • skip:无条件跳过
  • skipif:有条件跳过
  • xfail:预期失败
  • parametrize:参数化
  • ousefixtures:使用fixtures

7、数据驱动测试参数

数据文件,驱动用例执行数量,内容

data.csv文件:

a,b,c
1,1,2
2,3,5
3,3,6
4,4,7

复制代码
@pytest.mark.ddt
@pytest.mark.parametrize(
    "a,b,c",
     read_csv("../data.csv")
                         )
def test_ddt(self, a, b, c):

    res = add(int(a), int(b))
    assert res == int(c)

8、夹具fixture

夹具:在用例执行之前、执行之后,自动运行代码

  • 之前:加密参数/之后:解密结果
  • 之前:启动浏览器/之后:关闭浏览器
  • 之前:注册、登录账号/之后:删除账号

1、创建夹具fixture:

复制代码
@pytest.fixture

def f():
    # 前置操作
    yield
    # 后置操作
复制代码
1、创建函数
2、添加装饰器
3、添加yield关键字

2、使用fixture:

  • 在用例的参数列表中,加入fixture名字即可
  • 给用例加上usefixtures标记
复制代码
def test_1(f):
    pass
    
@pytest.mark.usefixtures("f")
def test_2():
    pass

从Python的角度来看,函数中可以有多个yield ,但是pytest中只能有一个yield

3、高级用法:

1、自动使用

2、依赖使用:

  • linux:使用linux进行编译
  • git:使用git进行版本控制
  • fixture:使用fixture进行前后置自动操作

3、返回内容:接口自动化封装:接口关联

4、范围共享:

9、插件管理

pytest插件生态是pytest特别的优势之处

插件分成两类:

  • 不需要安装:内置插件
  • 需要安装:第三方插件

插件的使用方式:

  • 参数
  • 配置文件
  • fixture
  • mark

10、常用的插件

1、pytest-html

用途:生成HTML测试报告

安装:pip install pytest-html

使用:--html=report.html --self-contained-html

2、pytest-xdist

用途:分布式执行

安装:pip install pytest-xdist

使用:-n N(N指的是次数)

只有在任务本身耗时较长,超出调用成本很多的时候,才有意义

3、pytest-rerunfailures

用途:用例失败之后,重新执行

安装:pip install pytest-rerunfailures

使用:-reruns 5 --reruns-delay 1

pytest 有140+插件:https://docs:pxtest.org/en/stable/reference/plugin_list.html

11、企业级测试报告

allure是一个测试报告框架

安装:pip install allure-pytest

配置:--alluredir=temps --clean-alluredir

生成报告:allure generate -0 report -c temps

allure支持对用例进行分组和关联(敏捷开发术语)

  • @allure.epic :史诗 / 项目
  • @allure.feature:主题 / 模块
  • @allure.story:故事 / 功能
  • @allure.title:标题 /用例
复制代码
@allure.epic("自动化")
@allure.feature("测试用例")
@allure.story("测试用例1")
@allure.title ("测试用例1标题")
@pytest.mark.ut
def test_a():
    pass

@allure.epic("自动化")
@allure.feature("测试用例")
@allure.story("测试用例2")
@allure.title("测试用例2标题")
@pytest.mark.ut
def test_b():
    pass

12、Web自动化测试

pytest仅进行用例管理,不会控制浏览器,需要借助新的工具:Selenium

安装:pip install pytest-selenium

同时也提供不使用Selenium插件的方法:

复制代码
@pytest.fixture()
def selenium():
    d = webdriver.chrome
    yield d
    d.quit()

13、测试框架要封装什么

封装:

  • 隐藏细节
  • 增加功能
  • 优化功能

接口自动化封装:

  • 使用yaml作为用例,降低自动化门槛
  • 自动请求接口、断言接口
  • 自动在日志记录HTTP报文
  • 自动生成allure测试报告

14、yaml文件格式

一句话:YAML完全兼容ISON格式,并且支持Python相似写法

重点:

  • YAML完全兼容ISON
  • 是数据格式,不是变成语言
  • 像Python一样容易编辑和阅读

编写yaml文件

1、#作为注释符号

2、缩进:使用2个空格

3.、成员表示

    • 表示列表成员
  • :表示字典成员

4、完全兼容ISON

复制代码
数字:
  -123
字符串:
  - "hello world"
空值:
  - null
列表:
  - [1, 2, 3]
字典:
  - {name: "Alice", age: 25}

加载yaml文件

复制代码
import yaml

def read_yaml(file_path):
    f = open(file_path, encoding="utf-8")  # 打開文件
    s = f.read()  # 读取文件内容

    data = yaml.safe_load(s)
    return data

15、接口自动化测试

设计测试用例

1、名字:请求首页数据接口

2、标记【可选】

3、步骤

  • 请求接口:GET https://www.baidu.com
  • 响应断言:status_code ==200
  • 提取变量:json() ['code']

1、请求接口

使用外部工具:requests

安装:pip install requests

从HTTP协议抓包角度,请求由三部分组成:

  • 行:方法+地址(必填)
  • 头:请求头(键值对)
  • 体:参数内容
复制代码
# 请求行
url='https://baidu.com'
# GET方法
requests.get(url)
# POST方法
requests.post(url)

# 任意方法
requests.request('MOVE',url)

2、断言相应

  • 响应里有什么
  • 响应如何断言

从HTTP协议抓包角度,响应由三部分组成:

  • 行:状态码
  • 头:响应头(键值对)
  • 体:响应内容

3、变量提取

基本原则:

  • JSON:JSONPATH
  • HTML:XPATH
  • 字符串:RE

进一步完善:

1、YAML用例测试文件上传?

2、YAML用例进行数据去掉测试?

3、YAML用例进行自定义的断言

4、YAML用例进行数据库查询?

相关推荐
学电子她就能回来吗20 分钟前
深度学习速成:损失函数与反向传播
人工智能·深度学习·学习·计算机视觉·github
半壶清水2 小时前
[软考网规考点笔记]-软件开发、项目管理与知识产权核心知识与真题解析
网络·笔记·压力测试
tq10862 小时前
先探索,后设计
笔记
hnult2 小时前
2026 在线培训考试系统选型指南:核心功能拆解与选型逻辑
人工智能·笔记·课程设计
AI视觉网奇2 小时前
ue 角色驱动衣服 绑定衣服
笔记·学习·ue5
三水不滴3 小时前
计网ping原理
经验分享·笔记·计算机网络
prog_61033 小时前
【笔记】思路分享:各种大模型免费当agent后台
笔记·大语言模型·agent·cursor
凯尔萨厮3 小时前
Maven(Windows下载安装)
笔记·maven
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [drivers][input]serio
linux·笔记·学习
菩提小狗5 小时前
小迪安全2023-2024|第5天:基础入门-反弹SHELL&不回显带外&正反向连接&防火墙出入站&文件下载_笔记|web安全|渗透测试|
笔记·安全·web安全