鹤壁市网站建设_网站建设公司_GitHub_seo优化
2026/1/11 22:15:54 网站建设 项目流程

本篇章为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、范围共享:

  • 默认范围:function
  • 全局范围:session
  • 使用conftest.py

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用例进行数据库查询?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询