一篇文章入门Pytest!

news/2024/10/23 7:20:04/

目录

一、安装

二、语法

三、执行

四、前后置setup/teardown

五、fixture

六、数据驱动

七、报告

一、安装

需要安装的库

pytest
pytest-html            生成HTML格式的测试报告
pytest-xdist           用例分布式执行,多CPU分发
pytest-ordering        改变用例执行顺序
pytest-rerunfailures   用例失败重跑
allure-pytest          生成allure测试报告
pyYAML                 yaml文件库

安装命令

# 将要安装的库放到 requirements.txt 文件中,然后执行
pip install -r requirements.txt

二、语法

  1. 模块名(用例文件名)必须以test_开头或者_test结尾

  2. 测试类必须以Test开头,且不能有init方法

  3. 测试方法必须以test开头

三、执行

执行命令
  1. 主函数

# test_login.py
import pytestclass TestLogin:def test_01(self):print("用例1")if __name__ == '__main__':pytest.main()		# 执行所有
  1. 命令行

# 在命令行中切换到对应目录下后,直接命令行输入
pytest
  1. 读取pytest.ini配置文件

pytest.inipytest单元测试框架的核心配置文件,用来改变pytest默认的行为

  1. 一般放在项目的根目录;

  2. 编码必须是ANSI

[pytest]
addopts = -vs
testpaths = ./project
python_files = test*.py
python_classes = Test*
python_functions = test
  • addopts 命令行参数

  • testpaths 测试用例文件夹

  • python_files 搜索文件名

  • python_classes 搜索的测试类名

  • python_functions 搜索的测试方法名的开头

执行命令参数
-s          输入调试信息,如用例中的print
-v          打印信息更详细
文件名(或文件夹)   指定运行文件(或文件夹里文件)用例
-n      分布式运行
--reruns 2   失败重跑(失败重跑2次,加上第一次一共跑了3次)
-x      只要有一个用例报错,测试停止
--maxfail=2     最多出现两个用例报错,测试停止
-k "方法名包含的字符"      根据用例部分字符串执行指定用例

例如

# 主函数
pytest.main(['-vs', 'test_login.py', '-n=2', '--reruns=2'])
# 使用nodeid 执行指定方法
pytest.main(['-vs', './文件名/类名::方法名'])
# 命令行
pytest -vs -n 2 --reruns 2 -k "login "
执行顺序

unittest根据ASCII码;pytest:从上到下

改变执行顺序:

# 使这个用例第一个执行
@pytest.mark.run(order=1)
def test_login():print("Done")
分组执行

pytest.ini文件添加:

markers = smoke: 冒烟用例login: 登录用例

用例文件:

@pytest.mark.smoke
def test_login2():print("Done")

命令行执行命令:

pytest -vs -m "smoke"
# 执行多个分组
pytest -vs -m "smoke or login"
跳过测试用例
# 无条件跳过
@pytest.mark.skip(reason="跳过原因")
# 符合条件跳过
@pytest.mark.skipif(num>3, reason="数量超过3个")

四、前后置

每个用例都有的功能,可以集体提取出来,比如UI自动化的执行前打开浏览器、执行结束后关闭浏览器的操作

# test_login.py
import pytestclass TestLogin:# 在所有用例之前,只执行一次def setup_class(self):print("在类执行前执行,比如创建日志对象、创建数据库连接")# 在每个用例之前都会执行一次def setup(self):print("每个用例执行前先执行setup:打开浏览器,加载网页")def test_01(self):print("用例1")def teardown(self):print("每个用例执行结束后执行teardown:关闭浏览器")def teardown_class(self):print("类执行结束后,执行一次,比如:销毁日志对象、关闭数据库连接")if __name__ == '__main__':pytest.main()		# 执行所有

五、fixture

fixture实现部分用例的前后置

@pytest.fixture()参数

  • scope:被标记方法的作用域,function(默认)、class、module、package/session

  • params:参数化

  • autouse:自动执行,默认False

  • ids:使用params参数化时,给每个值设置一个变量名

  • name:给被标记的方法起一个别名【当取了别名以后,原名就不能用了】

import pytest@pytest.fixture()
def my_fixture():print("这是前置方法")yieldprint("这是后置方法")class TestLogin:def test01(self):print("用例1")# 这个用例执行前会先执行my_fixture方法# 用例执行完后会执行my_fixture的yielddef test_02(self, my_fixture):print("用例2")

如果所有方法有前后置需要,则在fixture里加参数autouse=True用例里也不需要写fixture名调用

@pytest.fixture(autouse=True)
...省略...
class TestLogin:def test01(self):print("用例1")
params参数化

params支持列表、元组、字典列表、字典元组

import pytest@pytest.fixture(scope='function', params=["亚索", "凯南", "腕豪"])
def my_fixture(request):yield request.paramprint("后置")class TestLogin:def test01(self, my_fixture):print("得到参数:", my_fixture)

工程应用

通过conftest.py@pytest.fixture()结合使用,实现全局前后置

conftest.py 文件是单独存放fixture的配置文件,用处是可以在不同的py文件中使用同一个fixture函数,使用时原则上需要将conftest.py文件和用例放到同一层(放在根目录貌似也可以),并且不需要导入。且可以存在多个conftest.py文件(放在不同文件夹中)。调用也可以调用多个:

def test_01(self, my_fixture1, my_fixture2)

上面调用方式就是先调my_fixture1,再调用my_fixture2。

六、数据驱动

@pytest.mark.parametrize(args_name, args_value)
  • args_name:参数名

  • args_value:参数值;有多少参数值,用例就会执行多少次

例1:

import pytestclass TestLogin:@pytest.mark.parametrize('args', ['北京', '上海', '广州'])def test_01(self, args):print(args)if __name__ == '__main__':pytest.main()

例2:

import pytestclass TestLogin:@pytest.mark.parametrize('city, rank', [['北京', '1'], ['上海', '2'], ['广州', '3']])def test_01(self, city, rank):print(city, rank)if __name__ == '__main__':pytest.main()

七、报告

  1. 下载allure,解压,配置环境变量

  2. 添加执行参数 --alluredir,可以去pytest.ini文件中修改(如下)。也可以在主函数中添加pytest.main(['--alluredir=./temp'])这样生成的json文件会放到temp文件夹中

[pytest]
addopts = -vs --alluredir ./temp
testpaths = ./project
python_files = test*.py
python_classes = Test*
python_functions = test
  1. 在主函数下增加代码

if __name__ == '__main__':pytest.main()os.system('allure generate ./temp -o ./report --clean')

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


http://www.ppmy.cn/news/1541259.html

相关文章

计算机毕业设计Python+Spark知识图谱课程推荐系统 课程用户画像系统 课程大数据 课程爬虫 课程大屏 mooc慕课推荐系统 大数据毕业设计

《PythonSpark知识图谱课程推荐系统》开题报告 一、研究背景与意义 随着互联网技术的快速发展,在线教育平台已成为人们获取知识、提升技能的重要途径。然而,面对海量的课程资源,用户往往难以快速找到符合自己兴趣和需求的课程。传统的课程推…

解密 Redis:如何通过 IO 多路复用征服高并发挑战!

文章目录 一、什么是 IO 多路复用?二、为什么 Redis 要使用 IO 多路复用?三、Redis 如何实现 IO 多路复用?四、IO 多路复用的核心机制:epoll五、IO 多路复用在 Redis 中的工作流程六、IO 多路复用的优点七、IO 多路复用使用中的注…

Scala的内部类

Scala中的内部类(Inner Class)是指定义在另一个类的内部的类。 内部类可以访问外部类的成员(包括私有成员),并且可以与外部类的实例紧密地绑定在一起。 内部类在Scala中非常有用,尤其是在需要封装特定功能…

.net framework 3.5sp1组件安装进度条不动启动错误怎么解决

安装.NET Framework 3.5 SP1通常需要管理员权限。这是因为安装过程可能需要修改系统文件和注册表项,这些操作通常需要管理员权限才能执行。在Windows系统上,安装.NET Framework 3.5 SP1通常通过控制面板中的“启用或关闭Windows功能”选项进行&#xff0…

JMeter模拟并发请求

PostMan不是严格意义上的并发请求工具,实际是串行的,如果需要测试后台接口并发时程序的准确性,建议采用JMeter工具。 案例:JMeter设置20个并发卖票请求,查看后台是否存在超卖的情况 方式一:一共10张票&…

Java毕业设计 基于SpringBoot发卡平台

Java毕业设计 基于SpringBoot发卡平台 这篇博文将介绍一个基于SpringBoot发卡平台,适合用于Java毕业设计。 功能介绍 首页 图片轮播 商品介绍 商品详情 提交订单 文章教程 文章详情 查询订单  查看订单卡密 客服   后台管理 登录 个人信息 修改密码 管…

前端将cvs格式数据导出为Excel表

使用ExcelJS库:ExcelJS(也称为SheetJS)是一个强大的JavaScript库,它允许在浏览器和Node.js中处理Excel文件。你可以使用它来读取CSV文件的内容,并将其转换为Excel格式。以下是一个基本的示例代码: import X…

vue video播放m3u8监控视频

很关键的问题 vite创建的项目不需要import ‘videojs-contrib-hls’ 导入就报错 直接添加如下代码即可 html5: {vhs: {overrideNative: true},nativeVideoTracks: false,nativeAudioTracks: false,nativeTextTracks: false} 下面是完整组件示例 <template><div>…