【测试】Pytest

建议关注、收藏!

目录

  • 功能
  • pytest

自动化测试工具。

功能

  1. 单元测试:用于验证代码的最小功能单元(如函数、方法)的正确性。
    简单的语法:不需要继承特定类或使用复杂的结构。断言语句简化。
    自动发现测试:Pytest 会自动查找以 test_ 开头的函数或文件。
def add(a, b):return a + bdef test_add():assert add(1, 2) == 3def test_subtract():result = 10 - 5assert result == 5
pytest #运行
  1. 参数化测试
    @pytest.mark.parametrize 可以在一个测试函数中测试多组输入和输出
@pytest.mark.parametrize("a, b, expected", [(1, 2, 3),(2, 3, 5),(10, 5, 15)
])
def test_add(a, b, expected):assert add(a, b) == expected
  1. 功能测试、集成测试、回归测试
  2. 插件
    pytest-django:测试 Django 项目。
    pytest-flask:测试 Flask 应用程序。
    pytest-cov:生成测试覆盖率报告。
    pytest-xdist:支持并行运行测试,提高测试效率。
  3. 测试用例分组和标记
    @pytest.mark给测试用例添加标记,以便运行特定分组的测试。
@pytest.mark.slow
def test_slow_function():# 测试代码pass
pytest -m slow
  1. 灵活的前置与后置处理(Fixture)
    用于在测试前后进行环境的初始化与清理。
import pytest@pytest.fixture
def sample_data():return {"key": "value"}def test_with_fixture(sample_data):assert sample_data["key"] == "value"
  1. 错误重试与失败处理
    使用插件(如 pytest-rerunfailures)可以重试失败的测试用例。
    生成 HTML 测试报告(使用 pytest-html 插件)。
pytest --html=report.html
  1. 集成 CI/CD
    Pytest 易于与持续集成工具(如 Jenkins、GitLab CI/CD、GitHub Actions)集成,自动化测试流程。

pytest

支持简单单元测试及复杂功能测试
结合requests实现接口测试
结合selenium硒,appium实现自动化功能测试
结合allure继承到jenkins实现持续集成
支持315+种插件
报告、多线程、顺序控制
兼容python的unittest
定制化插件开发

#text.py
def inc(x):return x+1
def test_answer():assert inc(3)==5pip install pytest #安装到了base环境
#command里输入
pytest main.py

在这里插入图片描述
命名规则注意:文件名必须得是 test_ 开头 或者 _test 结尾;类要用Test_开头,方法用test_开头,这样行号会出现绿色运行箭头
测试类中不可以添加__init__构造函数,如果添加则不认为是测试类,所有测试方法都识别不到了

pycharm->setting->tools->python intergrated tools->default test runner:pytest

  • 断言:执行到这个位置,对应的断言应为真。当不为真时,程序终止执行并给出错误信息。
def test_x(self):
#测试步骤
#断言 实际结果对比预期结果assert ActualResult==ExpectedResultclass Testx:def setup(self):#资源准备passdef teardown(self):#资源销毁passdef test_x(self):#测试步骤#断言 实际结果对比预期结果assert ActualResult==ExpectedResult#断言用法
assert <表达式>
assert <表达式>,<描述>def test_a():assert 'abc' in 'abcd'
import sys
def test_b():assert ('linux' in sys.platform),"该代码只能在linux下运行"
  • setup/teardown
    相当于就是某个事件开始前的资源准备->setup;事件完成后的资源销毁->teardown;
    以下是各个层级的setup/teardown:
    在这里插入图片描述
#需要哪个层级的触发 就在哪个地方放哪个def setup_module():#全局的最多只会执行一次print("资源准备:setup module")
#setup teardown不需要成对出现,根据需求选择
def teardown_module():print("资源销毁:teardown module")
  • 参数化
    使定量信息变量化。可以对其进行不同的赋值。
    e.g. 对搜索框进行输入测试。这个输入可以设成一个变量,每次只需要调整搜索的输入。
    注意:
  1. 参数化的名字要与方法中的参数名一一对应
  2. 如果传递多个参数,要放在列表中,作为嵌套列表/元组
  3. ids的参数个数要==传递的参数个数
#单参数
import pytest
search_list=['appium','selenium','pytest']
@pytest.mark.parametrize('name',search_list)
def test_search(name):#这个name要和上述的name字段相等,对应上assert name in search_list
#多参数
params=[('3+5',8),('2+5',7),('6+5',12)]
@pytest.mark.parametrize("test_input,expected",params,ids=['p1','p2','p3'])
#用例重命名 ids
#ids是对params里面的每个参数进行重命名,可以用这个名字分别代表它们
def test_mark_more(test_input,expected):assert eval(test_input)==expected#笛卡尔积 在测试中叫全量测试 几乎不实际 过于浪费时间
#在排查不确定的问题时可以用
@pytest.mark.parametrize('wd',['appium','selenium','pytest'])
@pytest.mark.parametrize('code',['utf-8','gbk','gb2312'])
def test_dkej(wd,code):print(f"wd:{wd},code:{code}")
'''
print(f'.....')
注意:f后面一定要紧跟字符串,不能隔有空格,否则会报错
print语句中加入f就可以起到和format函数类似的作用。
'''
  • 标记测试用例
    只执行需要的一部分测试用例,可以把一个web项目划分成多个模块,制定模块名称执行。
    只需要在测试用例方法上加@pytest.mark.标签名
    -m 执行自定义标记的相关用例
pytest -s test_mark_zi_09.py -m=webtest #加不加=都可以
pytest -s test_mark_zi_09.py -m apptest
pytest -s test_mark_zi_09.py -m "not ios" #这个是指测试所有标签中不包括ios的用例
pytest -s test_mark_zi_09.py -vs -m apptest #-vs指打印详细日志
pytest -s test_mark_zi_09.py -m "str" #执行标签名为str的所有用例
#-k 可以进行部分匹配 只要标签名里包含这个 就执行
@pytest.mark.int #装饰器 不改变原有代码+增加相关功能 标记新标签"int"
def test_double_int():print('test_double_int')assert 2==double(1)#为了防止报出warning,虽然不影响执行
#新建pytest.ini
#这个文件中放入:
[pytest]
markers= str  #多个参数不要写在同一行,要换行且不顶格bignumfloatintzerominus
#顶格的换行参数会被认为是key 地位等同于markers#这样之后 pytest就可以识别出 def[test_double_标签名]这里面的标签名
#e.g. test_double_int 中的'int'/....它们注册成为了标签
  • 跳过及预期失败
    这是pytest的内置标签,可以处理特殊的测试用例
    skip:始终跳过
    skipif:如果…跳过
    xfail:如果…产生一个“期望失败”输出

使用场景:

  1. 调试时不想运行这个用例
  2. 标记无法在某些平台上运行的测试功能
  3. 在某些版本中执行,某些版本则跳过它
    e.g. 当前外部资源不可用时跳过
    如果测试数据是从数据库中取到的;连接数据库的功能,如果返回结果未成功则跳过;开发人员代码未写完;
#解决1:添加装饰器
@pytest.mark.skip 
@pytest.mark.skipif
#解决2:代码中添加跳过代码
pytest.skip(reason='代码未写完')#1.这些代码直接放在需要跳过的函数def的上一行。
#2.放在函数内部进行条件判断使用
def test_function():if not check_login():pytest.skip("unsupported configuration")print('end')import pytest
import sys
print(sys.platform)
@pytest.mark.skipif(sys.platform=='darwin',reason='does not run on mac')#mac在这里其实叫darwin
def test_case1():print('enter 1')assert 1==2@pytest.mark.skipif(sys.platform=='win',reason='does not run on windows')
def test_case2():print('enter 2')assert 1==1@pytest.mark.xfail #起到提示的作用,bug改完之后去掉
def test_aaa():print("test_xfail1 方法执行")assert 2==2 #打印为XPASS#assert 2==3 #打印为XFAILxfail=pytest.mark.xfail@xfail(reason="bug 404")
def test_sample404():assert 0@pytest.mark.xfail #起到提示的作用,bug改完之后去掉
def test_aaa():print("start")pytest.xfail(reason="have not done this")#这行之后的函数作用域将不会执行print("processing")
  • 运行用例
    运行某个/多个 用例包/用例模块/用例类/用例方法
  1. IDE的界面操作
    多个文件用command选中,右键->run
  2. 代码方式运行【选择这种,不容易出问题】
pytest -v #直接执行当前目录下的所有测试文件
pytest filename.py #test single file
pytest filename.py::ClassName #执行某个类
pytest filename.py::ClassName -v #打印显示具体执行了哪个用例
pytest filename.py::ClassName::test_demo1 -v #执行具体用例
pytest filename.py::test_demo1 -v#执行不属于类的用例#命令行参数 命令后面加上的...
-help
-x #用例error/fail 则立刻停止执行
'''
冒烟测试:不是全功能的测试,只是大概的测一下,只需要主要核心功能没问题。
'''--maxfail==num #用例达到多少停止
-m #标记用例 运行这一类的用例-k #执行包含某个关键字的测试用例
pytest test.py -v -k "str" #运行命名包含"str"的用例
#并告知deselected的个数
pytest test.py -v -k "not str" #运行命名不包含"str"的用例--collect-only #只收集统计测试用例但不运行 (测试平台,pytest自动导入功能)
--lf #(--last-failed) #只重新运行故障
--ff #(--failed-first)#先运行故障后运行其余的测试
-v #输出更加详细的运行信息
-s #输出调试信息 即print输出的信息
-vs #它俩的组合版
  • 运行结果分析
    常用:fail/error/pass
    特殊:warning/deselect
  1. error:代码写错、某种不正确的断言
  2. fail 样例不通过
  3. warning只是警告,不影响运行
  4. deselect没有被选中的用例
  • 代码执行pytest
    方式一:编写main函数,命令行中使用“python test_name.py ”
if __name__=='__main__':#运行当前目录下所有符合规则的用例,包括子目录里的pytest.main()#运行test_mark1.py::test_dkej模块中某一条用例pytest.main(['test_mark1.py::test_dkej','-vs'])#运行某个标签pytest.main(['test_mark1.py','-vs','-m','dkej'])
# 什么时候这里的__name__!='__main__',当该文件被其他文件导入时

方法二:不使用main,使用python -m pytest test_name.py
(用到jenkins持续集成)

  • 异常处理
    方法1:try…except
try:...
except (ValueError,ArithmeticError):...
except:...

方法2:
获取异常的细节(类型和信息),后面的代码不会继续执行

def test_raise():with pytest.raises((ZeroDivisionError,ValueError),match='must be 0 or None'):#如果有match匹配文字的需要,匹配后才能passraise ValueError("value must be 0 or None")#raise ZeroDivisionError("除数为0")
def test_raise1():with pytest.raises(ValueError) as exc_info:raise ValueError("value must be 42")assert exc_info.type is ValueErrorassert exc_info.value.args[0]=="value must be 42"
  • 数据驱动
    数据改变而驱动自动化测试进行。
    数据量小的测试用例使用代码参数化实现数据驱动。
    数据量大的测试用例使用一种结构化的文件(如yaml,json等)来对数据进行存储,在测试用例中读取这些数据。
    • 应用场景:app,web,接口自动化测试
  • 包含测试步骤的数据驱动、测试数据的数据驱动、配置的数据驱动
import pytest
import yaml #.yml是一种配置文件
class TestDemo:@pytest.mark.parametrize("env",yaml.safe_load(open("./env.yml")))#parametrize中如果传入的是dict类型,则只读取keydef test_demo(self,env):if "test" in env:print("this is test env")print(env)print(env["test"])#读取到ip 127.0.0.1 elif "dev" in env:print("this is develop env")#env.yaml
test:127.0.0.1 #这是字典格式#env.yaml
- #前面加一杠 转换成列表格式,里面的元素是{'test':'127.0.0.1 '}
test:127.0.0.1 
    • 读取excel文件
      第三方库:xlrd,xlwings,pandas,openpyxl
    • openpyxl
conda install openpyxl
pip install ...import openpyxl
book=openpyxl.load_workbook('path')#读取工作簿sheet=book.active#获取当前活跃的工作表#读取单元格的两种方式
cell_a1=sheet['A1']
cell_a3=sheet.cell(column=1,row=3)#读取多个连续的单元格
cells=sheet["A1":"C3"] #返回嵌套元组#获取单元格里的值
cell_a1.value
    • 读取csv文件
      cvs(comma-Separated Values) 以逗号分隔
      以纯文本形式储存
#读取数据
#采用内置函数
def get_csv():with open('demo.csv','r')as file:raw=csv.reader(file)for line in raw:print(line)values=[]for row in raw:values.append(line)return values #传入parametrize
    • 读取json文件
      json 是JS对象,javascript object notation
      json结构中对象是{“key”:value};数组是[value1,value2…]

json.loads() or json.load()
json.loads 从 JSON 字符串解析为 Python 对象。
json.load 从文件对象(如 .read() 的结果)解析 JSON 数据,输出字典dict。
data=json.loads(f.read())

#读取json
#内置函数open(),内置库json
#方法 json.loads() , json.dumps()def get_json():with open('demo.json','r')as f:data=json.loads(f.read())
#与 json.load(f) 相比,它多了一个中间步骤:
#先读取文件内容f.read()为字符串,再将字符串传递给 json.loads 进行解析。print(data) #type:dicts=json.dumps(data,ensure_ascii=False)#序列化 str->json#使得中文字符正常显示return list(data.values())
  • 工程目录结构
    在这里插入图片描述
#operation.py
def my_add(x,y):res=x+yreturn res# test_add.py
import openpyxl
import pytest
from mainfolder.func.operation import my_add
def get_excel():book=openpyxl.load_workbook('path')#读取工作簿sheet=book.activevalues=[]for row in sheet:line=[]for cell in row:line.append(cell.value)values.append(line)return valuesclass TestWithExcel:@pytest.mark.parametrize('x,y,expected',get_excel())def test_add(self,x,y,expected):assert my_add(int(x),int(y))==int(expected)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity性能优化---使用SpriteAtlas创建图集进行批次优化

在日常游戏开发中&#xff0c;UI是不可缺少的模块&#xff0c;而在UI中又使用着大量的图片&#xff0c;特别是2D游戏还有很多精灵图片存在&#xff0c;如果不加以处理&#xff0c;会导致很高的Batches&#xff0c;影响性能。 比如如下的例子&#xff1a; Batches是9&#xff0…

环境和工程搭建

1.案例介绍 1.1 需求 实现⼀个电商平台 该如何实现呢? 如果把这些功能全部写在⼀个服务⾥, 这个服务将是巨⼤的. 巨多的会员, 巨⼤的流量, 微服务架构是最好的选择. 微服务应⽤开发的第⼀步, 就是服务拆分. 拆分后才能进⾏"各⾃开发" 1.2 服务拆分 拆分原则 …

解决Jmeter HTTP Cookie管理器cookie不生效

解决Jmeter HTTP Cookie管理器cookie不生效问题 解决Jmeter HTTP Cookie管理器cookie不生效问题1、设置Jmeter HTTP Cookie管理器cookie后&#xff0c;发起的请求显示[no cookies]jmeter问题复现&#xff1a;这里同样使用postman进行重试&#xff0c;发现是可以正常获取数据的&…

操作系统课后习题2.2节

操作系统课后习题2.2节 第1题 CPU的效率指的是CPU的执行速度&#xff0c;这个是由CPU的设计和它的硬件来决定的&#xff0c;具体的调度算法是不能提高CPU的效率的&#xff1b; 第3题 互斥性&#xff1a; 指的是进程之间的同步互斥关系&#xff0c;进程是一个动态的过程&#…

二叉搜索树 平衡树(c嘎嘎版)

定义: 二叉搜索树是一种二叉树的树形数据结构,其定义如下: 空树是二叉搜索树。 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二叉搜索树的左右子树均为…

Everything搜索实现

最近编写NTFS文件实时搜索工具, 类似 Everything 这样, 速度快还小巧, 于是花了约3周进行研究, 总结下学习过程中一些经验 实现分3部分完成 一. 解析NTFS 主文件表(MFT) 这一步是获取文件数据的唯一迅速且可靠的来源 NTFS_MFT_Parse.h #pragma once #include "NTFS_Bas…

23.DDD与微服务

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 DDD与微服务的关系1. DDD可以用微服务实现&#xff0c;也可以不用微服务实现2. DDD是微服务拆分的必须参考项之一3. 微服务架构…

vscode 打开 setting.json

按下Ctrl Shift P&#xff08;Windows/Linux&#xff09;或Cmd Shift P&#xff08;Mac&#xff09;来打开命令面板。输入open settings&#xff0c;然后选择 Open User Settings(JSON)。打开settings.json文件 ------修改设置-----&#xff1a; 1、 html代码的行长度&am…

汽车电子元件的可靠性保障:AEC-Q102认证

AEC-Q102标准的起源与价值 随着汽车电子系统的日益复杂&#xff0c;电子器件必须能够在极端的温度、湿度、振动和电磁干扰等恶劣条件下保持性能。AEC-Q102标准由汽车电子委员会&#xff08;AEC&#xff09;制定&#xff0c;专门针对LED、激光二极管和光电二极管等光电器件&…

RK3576 Android14,内存大于4G时UVC应用无法申请内存

最近有个项目需要将Linux虚拟成UVC摄像头&#xff0c;开发过程中遇到一个奇怪的事情&#xff0c;通过V4l2框架接口申请内存时&#xff0c;相同的板子&#xff0c;只是内存一个4G一个8G。4G的内存可以申请成功&#xff0c;8G就不行。提示“内存不足” 内存更大反而内存不足&…

RK356X camera 配置

目录 一、RK356x camera硬件 Mipi接口 DVP接口 二、软件链路 三、dts配置 DVP MIPI sensor->dphy->isp_vir 一、RK356x camera硬件 RK356X包含RK3566和RK3568,在camera方面,两颗芯片的软硬件是兼容的,共有两种硬件连接方式:DVP和MIPI。 Mipi接口 图一 如图…

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…

批量合并多个Excel到一个文件

工作中&#xff0c;我们经常需要将多个Excel的数据进行合并&#xff0c;很多插件都可以做这个功能。但是今天我们将介绍一个完全免费的独立软件【非插件】&#xff0c;来更加方便的实现这个功能。 准备Excel 这里我们准备了两张待合并的Excel文件 的卢易表 打开的卢易表软件…

GLM4模型详解 - 智谱AI开源大模型全面解析

&#x1f4da; 2024年6月5日,智谱AI在开发者大会上正式开源GLM-4-9B系列大模型。本文将全面解析GLM4的技术特点、部署方案和应用场景。 GLM-4-9B 模型具备了更强大的推理性能、更长的上下文处理能力、多语言、多模态和 All Tools 等突出能力。 “All Tools” 一、模型概述 1.…

ssm-day04 mybatis

mybatis是一个持久层框架&#xff0c;针对的是JDBC的优化 简化数据库操作&#xff0c;能进行单表、多表操作&#xff0c;在这个框架下&#xff0c;需要我们自己写SQL语句 Mapper接口和MapperXML文件就相当于Dao和Dao层的实现 通常将xml文件放在resources包下 &#xff0c;放在…

观测云亮相 Doris Summit,展示流式聚合创新技术

01 技术亮点&#xff1a;重新定义流式聚合的效率与体验 在演讲中&#xff0c;熊豹详细介绍了 GuanceDB 如何支撑观测云的全量业务场景&#xff0c;并分享了 SelectDB 在处理复杂查询中的应用与挑战。从动态表结构管理到函数下推优化&#xff0c;观测云通过灵活的架构设计有效解…

qt中tr的使用

在 Qt 中使用 tr 函数对字符串进行翻译时&#xff0c;通常会通过 Qt Linguist 工具来处理翻译。以下是一个基本的步骤说明&#xff0c;展示如何将 QPushButton *btnnew QPushButton(tr("Hello World"),this); 翻译成其他语言&#xff0c;比如中文&#xff1a; 1.创建…

基于X410的LabVIEW FPGA跳频通信系统开发

跳频通信系统是一种高效的无线通信技术&#xff0c;通过在多个频率间快速切换&#xff0c;提高抗干扰能力和信号安全性。以NI USRP X410为硬件平台&#xff0c;利用LabVIEW FPGA实现一个实时跳频通信系统&#xff0c;涵盖信号生成、触发控制、接收检测及实时数据处理。 系统架构…

校园交友app/校园资源共享小程序/校园圈子集合二手物品交易论坛、交友等综合型生活服务社交论坛

多客校园社交圈子系统搭建 校园交友多功能系统源码: 1、更改学校为独立的模块。整体UI改为绿色&#xff0c;青春色&#xff0c;更贴近校园风格。2、圈子归纳到学校去进行运营。每个学校可建立多个圈子。和其他学校圈子互不干扰。3、增加用户绑定学校&#xff0c;以后进入将默认…

医院跌倒检测识别 使用YOLO,COCO ,VOC格式对4806张原始图片进行标注,可识别病人跌倒,病人的危险行为,病床等场景,预测准确率可达96.7%

医院跌倒检测识别 使用YOLO,COCO ,VOC格式对4806张原始图片进行标注&#xff0c;可识别病人跌倒&#xff0c;病人的危险行为&#xff0c;病床等场景&#xff0c;预测准确率可达96.7&#xff05; 数据集分割 4806总图像数 训练组70&#xff05; 3364图片 有效集20&#…