news 2026/6/15 17:09:21

一篇文章入门Pytest

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一篇文章入门Pytest

一、安装

需要安装的库

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开头

三、执行

执行命令

主函数

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

命令行

# 在命令行中切换到对应目录下后,直接命令行输入 pytest

读取pytest.ini配置文件

pytest.ini是pytest单元测试框架的核心配置文件,用来改变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 pytest class 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("这是前置方法") yield print("这是后置方法") class TestLogin: def test01(self): print("用例1") # 这个用例执行前会先执行my_fixture方法 # 用例执行完后会执行my_fixture的yield def 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.param print("后置") 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 pytest class TestLogin: @pytest.mark.parametrize('args', ['北京', '上海', '广州']) def test_01(self, args): print(args) if __name__ == '__main__': pytest.main()

例2:

import pytest class 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

3、在主函数下增加代码

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

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 15:52:41

禁用 ADB 的 mDNS 自动发现(无需动手机)

老是提示这样的错误?adb.exe: more than one device/emulator 方法二:禁用 ADB 的 mDNS 自动发现(无需动手机) 如果你无法接触手机,或者不想关闭无线调试,你可以强制电脑上的 ADB 停止扫描这类设备。 在你的终端(看起来是 WSL 或 Linux 环境)中执行以下命令: 1. 设置…

作者头像 李华
网站建设 2026/6/15 12:19:29

5个技巧玩转zlib4cj:高性能压缩解压流式处理完全指南

5个技巧玩转zlib4cj:高性能压缩解压流式处理完全指南 【免费下载链接】zlib4cj 一个用于创建和解压zlib压缩格式的库 项目地址: https://gitcode.com/Cangjie-TPC/zlib4cj zlib4cj是一个功能强大的压缩解压库,专为处理zlib、DEFLATE和gzip格式而设…

作者头像 李华
网站建设 2026/6/15 12:27:15

java中使用mmap技术简介

前言 jdk21 之后,随着 FFM 加入并稳定,现在 java 中也可以直接使用 mmap 技术将文件直接映射进内存并读取了,并且没有 nio 中 21 亿的限制(Integer.MAX_VALUE)。 BIO时代 try (FileInputStream fis new FileInputS…

作者头像 李华
网站建设 2026/6/15 13:14:16

九大权威论文查重工具测评:提升学术原创性的必备指南

核心工具对比速览 工具名称 核心功能 处理时间 适配检测平台 特色优势 aibiye 降AIGC查重 20分钟 知网/格子达/维普 保留学术术语的AI痕迹弱化 aicheck AIGC检测降重 即时 主流学术平台 实时检测反馈精准降重 askpaper 学术AI优化 15-30分钟 高校常用系统 专…

作者头像 李华
网站建设 2026/6/15 13:17:56

30岁转行AI,是否可行?大模型学习全攻略:从零基础到AI专家的逆袭之路

文章讲述了一位非技术背景人士如何成功转型AI领域。作者分享了三点核心经验:AI领域普通人在边缘地带也有机会;过去的技能是进入新领域的宝贵财富;转型需先上车再找座、在工作中融合、用作品说话。同时提供了大模型AI的完整学习路径&#xff0…

作者头像 李华