Pytest测试框架的基本使用

目录

安装教程

Pytest命名约束

创建测试用例

执行测试用例

生成测试报告

参数化测试


pytest框架

        pytest是目前非常成熟且功能齐全的一个测试框架,能够进行简单的单元测试和复杂的功能测试。还可以结合selenium/appnium进行自动化测试,或结合requests进行接口测试等,非常灵活,强大方便。

        本文将讲述pyttest框架的基本使用,一些功能fixture夹具放到后一章再讲,看完本篇,你就可使用pytest进行简单的用例测试以及生成测试报告了

安装教程

1.windows下打开cmd,执行

pip install pytest

2.安装完成后,执行以下命令验证是否已成功安装

pytest --version #如果安装成功会出现安装的pytest版本号

3.打开pycharm(如果有,没有可以略过这一步),依次点击File->Settings,然后依次点击

输入pytest,然后安装即可:

 这样我们就可以在pycharm中使用pytest了

Pytest命名约束

在使用pytest构建测试用例时,需要遵循以下的规则:

对于每个测试文件文件后缀为.py,文件名格式为:test_fileName.py 或者fileName_test.py

对于每个文件中的测试类需要以Test开头,如Test_class1,TestClass2.(注意类中不能有init方法)

对于每个文件中的测试方法:需要以test_开头,如test_case1,test_case2

此时,执行pytest时,会自动寻找当前目录以及其子目录下所符合以上命名规则的文件或代码进行执行

创建测试用例

首先我们创建一个.py文件,文件名为test_1.py.(名字随便,但要符合上面说的规则)

然后我们导入pytest库

import pytest

下一步,我们创建一个测试类,名为TestDemo,然后该类下有两个测试方法,分别为test_case1,test_case2.

同时我们定义一个加法函数,返回传入的两个参数之和

代码如下:

import pytestdef sum(a,b):return a+b
class TestDemo:def test_case1(self):assert sum(1,4) == 3def test_case2(self):assert  sum(1,4) == 5

可以看到我们使用assert进行断言,判断测试用例是否正确

Python中常用的断言有以下几种:

assert xx #判断xx为真
assert not xx #判断xx不为真
assert a == b #判断a是否等于b
assert a != b #判断a是否不等于b
assert a in b #判断a是否在b中,即b是否包含a 

执行测试用例

测试用例写好了,接下来我们需要执行刚才写的这些测试方法

两种方式:1.代码        2.命令行

1.代码

我们在测试文件中加入main函数,然后调用pytest里的main()方法即可。这样我们直接按正常执.py文件就可以

import pytestdef sum(a,b):return a+b
class TestDemo:def test_case1(self):assert sum(1,4) == 3def test_case2(self):assert sum(1,4) == 5if __name__ == '__main__':pytest.main()

2.命令行

我们也可以直接在终端(cmd窗口,或者pycharm自带的都可以)输入命令执行测试文件,命令格式如下:

pytest 文件名

当然我们也可以只执行测试文件中的某个类,某个方法

pytest 文件名::类名::方法名

如果只输入 pytest,则会默认执行当前文件夹下所有以 test_开头(或_test 结尾)的文件。

然后我们在cmd窗口下执行我们刚才的测试文件(没有main方法):

可以看到测试结果已经出来了,确实是第一个设计的用例错误,也把报错信息清楚地写了出来

同时,pytest可以带参数执行测试文件,下面是一些常见的参数:

带参数执行

Pytest -v 输出用例更加详细的执行信息,比如用例所在文件和用例名称

pytest -k “key_name” 执行所有case中包含‘关键字’的用例

pytest -s 输出用例中的调试信息,比如 print 打印信息,如果不加参数则不输出待执行的用例

pytest -x执行失败则停止执行,后面的用例不会被执行

pytest --maxfail=n执行失败 n 次之后停止执行,n 是执行失败的次数

pytest --lf (last failed)重新运行上次失败的用例,若没有失败的会全部跑

pytest --ff (failed first)重新运行所有用例,但首先运行上次失败的用例

 skip跳过执行

某些用例可能暂时没写好,或不想执行这个用例,需要跳过该用例执行,那么我们需要skip该用例

使用方法:在需要跳过的用例前面加上@pytest.mark.skip(reason="跳过原因")

在测试类前面加上面的skip语句,则会将这个类的全部测试方法跳过

在测试方法前加上上面的skip语句,则只会跳过该方法执行

假设我们在类前面加上skip语句:

然后我们使用pytest -v 打印出测试详细信息

可以看到这五个用例全部跳过执行了,原因都是我设置的“暂时不执行”

当我在第5个测试用例前面加上那条skip语句:

此时我们再执行,观察测试信息,发现只有第5条被跳过了,其它全部正常执行了

当然如果希望只在特定条件下执行,可以使用@pytest.mark.skipif(condition, reason="")

这里便不再举例子了

生成测试报告

pytest本身是没有生成测试报告的功能,但是pytest中有很多插件,我们可以通过插件来生成测试报告。下面会给大家介绍一个生成报告的方式。生成html报告

生成html报告

首先我们需要安装pytest-html,在cmd窗口下,执行:

pip install pytest-html

 安装完成后,和刚才的步骤一样,在pycharm(如果有),在File>Settings>Project>Project Interpreter界面,点击“ + ”搜索pytest-html即可进行安装。

安装好后,我们可以执行下面的指令,生成一份html报告

pytest --html=report.html test_1.py

执行后,它会在当前目录下生成一个"report.html"文件,我们打开它:

可以看到已经成功生成,数据准确

这个html文件会生成到当前目录,如果想生成到指定目录,可以在指定报告名时加入:

pytest --html=C:/Users/h/Desktop/report.html .\test_1.py

当然这个css样式是保存在本地的,如果分享给其他人这个html文件,会造成css样式丢失

我们可以使用

pytest --html=report.html --self-contained-html

将css样式合并到html里,这样邮箱分享给其他人时也能正常显示了

参数化测试

        现在我们编写的函数和测试用例是1对1的关系,也就是说,当你想测试某个功能场景的时候,你必须要去编写一个对应的测试函数。当测试的场景越来越多,测试数据越来越复杂的情况下,需要编写更多的测心率函数,而这些函数的逻辑基本上是重复的。

比如我们为了测试sum函数,写了四个测试函数

        在 pytest 当中可以使用参数化这种测试手段,简化编写用例函数的过程。我们并不需要为每一组测试数据单独去编写一个测试函数,而是采取多种数据共用一个函数的方式。如果测试操作几乎一致,可以重复使用这一个函数进行测试。 

需要再

@pytest.mark.parametrize(args_name,args_value)

@pytest.mark.parametrize 是用于在 pytest 测试框架中参数化测试的装饰器。它允许通过不同的参数多次运行同一个测试函数,从而简化测试代码的编写和维护。

  1. 装饰器参数:

    • args_name:参数名称,可以是一个字符串或者一个字符串列表,用于标识测试函数中的参数。
    • args_value:参数值,可以是一个可迭代对象(如列表、元组、集合等),每个元素是一个参数组合,对应于测试函数的参数名称。

这么直接说可能有一些难理解,我举个例子吧

还是拿刚才所说的加法函数来说,用例格式为a+b=expected?

这样args_name需要传入三个参数,第一个是第一个参数a,第二个是b,第三个是相加的期望结果expected,即"a,b,expected"

args_value与其对应,假设我们想测试1+4=5?那么可以传入一个元组,(1,4,5)

所以我可以这样写:

@pytest.mark.parametrize("a,b,expected",[(1,4,5)
])
def test_addSum(a,b,expected):assert sum(a,b) == expected

当然我们可以多加几组数据测试:

@pytest.mark.parametrize("a,b,expected",[(1,4,5),(1,4,4),(5,5,10),(5,3,10)
])
def test_addSum(a,b,expected):assert sum(a,b) == expected

这样我们再执行测试:

可以发现结果完美的被测试了出来

我们对比一下,不用参数化,和使用参数化

不使用参数化:

 

使用参数化:

可以发现简洁了不少,这也便是参数化测试的好处

到这里,关于Pytest测试框架的基本使用就讲完了,下一章我们讲完fixture夹具的使用,pytest基本也就完成了。感谢你的阅读 

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

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

相关文章

加拿大上市药品查询-加拿大药品数据库

在加拿大,药品的安全性、有效性和质量是受到严格监管的。根据《食品药品法案》的规定,所有药品制造商必须提供充分的科学证据,证明其产品的安全性和有效性。为此,加拿大卫生部建立了一个全面的药品数据库 (DPD) &#…

【C++】类和对象——默认成员函数(下)

目录 前言拷贝构造1.概念2.特征3.总结 赋值重载运算符重载赋值运算符重载探讨传引用返回和传值返回的区别 const成员取地址及const取地址操作符重载 前言 上一讲我们已经说了关于C的默认成员函数中的两个——构造和析构函数。所谓默认成员函数也就是:用户没有显示定…

你的Type-c接口有几颗牙齿

C 口为啥不能混用 想想 C 口当年推出时给我们画的饼,“正反都能插,而且充电、传数据、连显示器等等,什么活都能干”,而实现这一切的前提全靠 C 口里面的 24 根针脚 这 24 根真叫呈中心对称分布,这种设计使得插头可以以…

iPhone手机上备忘录怎么设置字数显示

在日常生活和工作中,我经常会使用iPhone的备忘录功能来记录一些重要的想法、待办事项或临时笔记。备忘录的便捷性让我可以随时捕捉灵感,但有时候,我也会苦恼于不知道自己记录了多少内容,尤其是在需要控制字数的时候。 想象一下&a…

机器学习 | 深入理解激活函数

什么是激活函数? 在人工神经网络中,节点的激活函数定义了该节点或神经元对于给定输入或一组输入的输出。然后,将此输出用作下一个节点的输入,依此类推,直到找到原始问题的所需解决方案。 它将结果值映射到所需的范围…

【功能】DOTween动画插件使用

一、下载安装DOTween插件,下载地址:DOTween - Asset Store (unity.com) 使用 Free免费版本即可,导入成功后,Project视图中会出现 DOTween 文件夹 二、使用案例 需求1:控制材质球中的某个属性值,实现美术需…

SQL执行流程、SQL执行计划、SQL优化

select查询语句 select查询语句中join连接是如何工作的? 1、INNER JOIN 返回两个表中的匹配行。 2、LEFT JOIN 返回左表中的所有记录以及右表中的匹配记录。 3、RIGHT JOIN 返回右表中的所有记录以及左表中的匹配记录。 4、FULL OUTER JOIN 返回左侧或右侧表中有匹…

二维码如何用来存储图片?扫码看图有哪些好处

现在通过二维码来分享图片是一种很常见的方法,二维码可以承载大量的图片内容,从而节省对图片空间容量的占用,并且将图片放入二维码中便于分享让图片传递变得更加方便快捷,那么图片生成二维码具体该怎么操作呢?通过下面…

MySQL----初始数据类型

前言 一、tinyint 范围:-128-----127 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的。如果我们向mysqlt特定的类型中插入不合法的数据,Mysq一般会直接拦截&#xff0c…

云计算实训06——find、stat、touch、tree、scp、crontab指令相关应用

一、find命令 1.find的作用:对文件进行搜索 2. 基本语法: find [文件路径] [选项 选项的值 ] 3.常见的选项 -name 根据文件的名称搜索文件,支持通配符 * -type f 代表普通文件,-type d 代表目录 4.* 通配符 在 linux 系统…

多多OJ评测系统 前端页面通用布局开发与优化 调整布局

目录 我们重新布局样式 个人习惯写一个最外层的样式 Header Content Footer 布局出来了 加上标签和容器 绑定样式 我们设置一些样式 页面展示效果 我们加入导航栏 搜索组件 我们这边把导航菜单抽象成一个公共的组件 引入好 页面中成功进行了展示 我们可以把这边替…

MySQL添加索引时会锁表吗?

目录 简介Online DDL概念Online DDL用法总结 简介 在MySQL5.5以及之前的版本,通常更改数据表结构操作(DDL)会阻塞对表数据的增删改操作(DML)。 MySQL5.6提供Online DDL之后可支持DDL与DML操作同时执行,降低…

【Vue】深入了解 Axios 在 Vue 中的使用:从基本操作到高级用法的全面指南

文章目录 一、Axios 简介与安装1. 什么是 Axios?2. 安装 Axios 二、在 Vue 组件中使用 Axios1. 发送 GET 请求2. 发送 POST 请求 三、Axios 拦截器1. 请求拦截器2. 响应拦截器 四、错误处理五、与 Vuex 结合使用1. 在 Vuex 中定义 actions2. 在组件中调用 Vuex acti…

免费【2024】springboot OA公文发文管理系统

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

js 实现扫雷游戏,源码开放,支持npm引入使用

本人开发的js版本扫雷游戏 体验地址 | Github Minesweeper game Sponsors Install and use npm i minesweeper-gameimport {Map} from minesweeper-game;const map new Map();Reset Map map.reset();TS Statement interface IMapOptions {width?: number; // Map sizeh…

数据实时获取方案之Flink CDC

目录 一、方案描述二、Flink CDC1.1 什么是CDC1.2 什么是Flink CDC1.3 其它CDC1.4 FlinkCDC所支持的数据库情况 二、使用Pipeline连接器实时获取数据2.1 环境介绍2.2 相关版本信息2.3 详细步骤2.3.1 实时获取MySQL数据并发送到Kafka2.3.2 实时获取MySQL数据并同步到Doris数据库…

初识C++|模板初阶

🍬 mooridy-CSDN博客 🧁C专栏(更新中!) 目录 🍉1. 泛型编程 🍉2. 函数模板 🥝2.1 函数模板概念 🥝2.2 函数模板格式 🥝2.3 函数模板的原理 &#x1f95…

万界星空科技QMS系统:全面赋能企业质量管理的创新引擎

万界星空科技质量管理QMS系统(Quality Management System)是一套全面、高效的质量管理工具,旨在帮助企业提升产品质量、优化生产流程、降低质量成本。该系统集成了多个功能模块,以满足企业在质量管理方面的各种需求。以下是万界星…

【网络安全科普】勒索病毒 防护指南

勒索病毒简介 勒索病毒是一种恶意软件,也称为勒索软件(Ransomware),其主要目的是在感染计算机后加密用户文件,并要求用户支付赎金以获取解密密钥。这种类型的恶意软件通常通过电子邮件附件、恶意链接、下载的软件或漏洞…

JavaWeb JavaScript ① JS简介

目录 一、HTML&CSS&JavaScript的作用 二、前后端关联标签——表单标签 1.form标签 2.input标签 3.get/post提交的差异 4.表单项标签 5.布局相关标签 块元素——div 行内元素——span 三、CSS 1.CSS引入方式 方式1 行内式 方式2 内嵌式 方式3 外部样式表 2.CSS选择器 元…