自动化测试-Pytest测试

news2025/1/4 19:20:48

目录

pytest简介

基本测试实例

编写测试文件

执行测试

pytest运行时参数

mark标记

Fixture 

pytest插件

Allure测试报告

测试步骤


pytest简介

Pytest‌是一个非常流行的Python测试框架,它支持简单的单元测试和复杂的功能测试,具有易于上手、功能强大、灵活配置等特点,已经成为最流行的测试框架之一‌。

简单易用‌Pytest的API设计简洁,使得编写测试用例非常容易
功能强大‌支持参数化测试、断言、fixture等功能,能够满足各种复杂的测试需求。
灵活配置‌可以通过插件扩展功能,支持与Selenium、Requests、Appium等工具集成,实现Web自动化、接口自动化和App自动化。
报告生成‌结合Allure,可以生成美观的测试报告。
插件丰富‌拥有大量的插件,如pytest-ordering、pytest-rerunfailures、pytest-xdist等,支持用例管理、执行、跳过、失败重跑等功能‌

安装 pip install pytest  版本检查 pytest --version

基本测试实例

pytest测试文件的命名规则和基本使用方法:1)测试文件命名‌:测试文件通常以test_开头或以_test 结尾。 ‌2)测试函数命名‌:测试函数应以test开头。3)运行测试用例‌:在命令行中使用pytest命令可以自动发现并运行所有的测试用例。也可以指定要运行的测试文件或测试函数‌

编写测试文件

sub_test.py 与test_example.py

#sub_test.py
def sub_num(a,b):
    return a-b
def test_sub():
    assert sub_num(2,3)==5
#test_example.py
def add_num(a,b):
    return a+b
def test_add():
    assert add_num(2,3)==5

执行测试

命令行执行 pytest 会过滤所有以test开头或结尾的文件,然后执行文件,匹配所有以test开头的类然后匹配所有以test开头的测试函数并执行

或者pytest ./文件目录  去解析特定文件

pytest运行时参数

-k:根据表达式选择测试用例。                                      -m:只运行带有标记的测试用例

-s:当测试失败时,打印出错误信息。                          --ff:先运行之前失败的测试用例

-x:在第一个测试失败时退出测试运行。                      --lf:运行上次失败的测试用例

--collect-only:仅收集测试用例,不运行它们。           --maxfail:指定在失败指定数量的测试用例后停止测试

-v:输出更详细的测试信息,包括测试用例名称及其所在的类。

--tb=style:控制台中的错误信息输出格式,例如--tb=line仅显示错误的那一行

mark标记

import pytest
def sub_num(a,b):
    return a-b
def test_sub1():
    assert sub_num(2,3)==-1
@pytest.mark.skip('pytest skip')
def test_sub2():
    assert sub_num(2,2)==0
@pytest.mark.skipif(condition=(1==1),reason='True pytest skipif')
def test_sub3():
    assert sub_num(2,1)==1
@pytest.mark.skipif('1==2')
def test_sub4():
    assert sub_num(3,1)==2
@pytest.mark.xfail  #预期到的结果
def test_sub5():
    assert sub_num(3,1)==23
@pytest.mark.xfail
def test_sub6():
    assert sub_num(3,1)==2
ls=[(1,2,3),(1,2,3),(2,4,6)]
@pytest.mark.parametrize('n1,n2,sum',ls)
def test_sub7(n1,n2,sum):
    assert n1+n2 == sum
#pytest -v -m smoke
#sub_test.py::test_example1 PASSED                                                                        [ 50%] 
#sub_test.py::test_example2 PASSED   
@pytest.mark.smoke
def test_example1():
    assert True
@pytest.mark.smoke
def test_example2():
    assert 1 + 1 == 2

Fixture 

pytest的fixture是一个非常强大的功能,主要用于在测试用例执行前后进行初始化和清理操作(类似setup、teardown)。通过使用@pytest.fixture()装饰器,可以将一个函数声明为fixture。该fixture的名字默认为函数名,也可以通过name参数指定别名。测试用例可以通过在参数列表中包含fixture的名字来使用它,pytest会在测试函数运行之前执行该fixture‌。

参数

scope

定义夹具的作用域,决定夹具的生命周期。可选值包括:

'function':每个测试函数调用时都会创建新的夹具(默认值)。
'class':每个测试类调用时创建一次夹具。
'module':每个模块调用时创建一次夹具。
'session':整个测试会话中只创建一次夹具。

autouse

默认为 False。如果设置为 True,则夹具会自动应用于所有测试,而不需要在测试中显式声明

params

允许为夹具提供多个参数值,测试函数将会被多次调用,每次使用不同的参数。

name为夹具指定一个名称,默认情况下使用函数名
import pytest
@pytest.fixture()
def fix_prepare():
    print('this is fixture prepare')
def test_fixture1(fix_prepare):
    print('test_fix1')
def test_fixture2(fix_prepare):
    print('test_fix2')
@pytest.fixture(scope='module')
#db_connection 夹具在整个模块中只会创建一次,两个测试函数都共享这个连接。
def db_connection():
    connection = "Database Connection"
    yield connection  # 提供夹具的值
    print("Closing the database connection")  # 清理工作

# 使用夹具的测试函数
def test_db1(db_connection):
    assert db_connection == "Database Connection"

def test_db2(db_connection):
    assert db_connection == "Database Connection"
@pytest.fixture(autouse=True) # 定义一个自动使用的夹具
def setup_environment(): 
    #会在每个测试函数运行前自动调用,无需在测试函数中显式声明
    print("Setting up the environment")
    yield  #测试固件需要yeild支持teardown
    print("Tearing down the environment")
# 测试函数
def test_example1():
    assert True
def test_example2():
    assert True
# 定义一个参数化的夹具
@pytest.fixture(params=["apple", "banana", "cherry"])
def fruit(request):
    return request.param
def test_fruit(fruit): # 使用夹具的测试函数
    #fruit 夹具会为每个测试函数提供不同的参数值,测试函数将会被调用三次,
    # 分别使用 "apple"、"banana" 和 "cherry"。
    assert fruit in ["apple", "banana", "cherry"]
if __name__=='__main__':
    pytest.main(['-vs','test_fixture.py'])

pytest插件

pytest-ordering

这个插件允许你控制测试函数的运行顺序,通过使用@pytest.mark.run(order=1)这样的装饰器

pytest-assume

这个插件引入了一个新的pytest.assume()函数,它允许你在一个测试中进行多次断言,并在第一次失败后停止测试。   

pytest-xdist

这个插件增加了对并行测试的支持,可以通过不同的CPU或者机器并行运行测试。   

pytest-instafail

这个插件在测试失败时提供实时的失败信息,而不是等到测试结束。 

pytest-rerunfailures

这个插件可以在测试失败后重新运行它们。   

pytest-html

这个插件生成美观的HTML测试报告。

pytest-metadata

这个插件允许你在测试结束后添加元数据。   

pytest-cov

这个插件提供了代码覆盖率的报告。

pytest-forked

这个插件是pytest-xdist的一部分,但也可以单独使用,提供了一种在多个进程中运行测试的方法

pytest-sugar这个插件提供了一种更好的控制台输出,可以显示测试进度。

Allure测试报告

测试步骤

1)allure的官网下载地址:https://github.com/allure-framework/allure2/releases

2)解压、配置环境变量,cmd 输入allure 检验安装配置

3)pip install allure-pytest 执行命令运行测试case  pytest --alluredir ./result/ 生成许多json文件等

4)allure generate .\result\ -o ./report/ --clean

5)windows下 allure generate ./path/to/your/test_results -o ./path/to/report --clean (-O可以写成--report--dir或--output 生成测试报告路径, generate生成测试报告,--clear清楚报告生成一个新的 )

6)查看测试报告: windows下可以 allure open -h localhost -p 8083 ./report/  (页面加载index.html一致loading,当然还可以使用别的方法)


    ‌

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

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

相关文章

Java-33 深入浅出 Spring - FactoryBean 和 BeanFactory BeanPostProcessor

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

MySQL 服务器简介

通常所说的 MySQL 服务器指的是mysqld程序,当运⾏mysqld后对外提供MySQL 服务,这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容,包括: 服务器⽀持的启动选项。可以在命令⾏和配置⽂件中指定这些选项。 服务器系统变…

分布式版本管理工具——Git关联远程仓库(github+gitee)

Git远程仓库(Github)的基本使用 一、前言二、Git远程仓库介绍三、演示1. 关联github远程仓库2. 关联gitee(码云)远程仓库3. 重命名远程仓库名4. 移除远程仓库 四、结束语 一、前言 古之立大事者,不惟有超世之才&#x…

ZLib库使用详细教程 以及标准ZLib函数和QT自带压缩函数比较

1. 下载Zlib 官网下载地址如下:http://www.zlib.net/ 2. 利用cmake编译zlib 有两种方法可以打开cmake-gui winR输入cmd打开命令行,在命令行中输入cmake-gui可以直接打开应用界面找到你一开始安装cmake的文件夹,在bin子文件夹中双击cmake-…

加载Tokenizer和基础模型的解析及文件介绍:from_pretrained到底加载了什么?

加载Tokenizer和基础模型的解析及文件介绍 在使用Hugging Face的transformers库加载Tokenizer和基础模型时,涉及到许多文件的调用和解析。这篇博客将详细介绍这些文件的功能和它们在加载过程中的作用,同时结合代码片段进行解析。 下图是我本地下载好模…

SpringAI从入门到熟练

学习SpringAI的记录情况 文章目录 前言 因公司需要故而学习SpringAI文档,故将自己所见所想写成文章,供大佬们参考 主要是为什么这么写呢,为何不抽出来呢,还是希望可以用的时候更加方便一点,如果大家有需求可以自行去…

嵌入式系统中C++的基本使用方法

大家好,今天主要给大家分享一下,最近操作C++代码的控制方法。 什么是构造函数?构造函数在对象实例化时被系统自动调用,仅且调用一次。 什么是析构函数?与构造函数相反, 在对象结束其生命周期时系统自动执行析构函数。 第一个:析构函数与构造函数区别 实例代码: #inclu…

【Qt】多元素控件:QListWidget、QTableWidget、QTreeWidget

目录 QListWidget 核心属性: 核心方法: 核心信号: 例子: QListWidgetItem QTableWidget 核心方法: 核心信号 QTableWidgetItem 例子: QTreeWidget 核心方法: 核心信号&#xff1a…

HTML5 标签输入框(Tag Input)详解

HTML5 标签输入框(Tag Input)详解 标签输入框(Tag Input)是一种用户界面元素,允许用户输入多个标签或关键词,通常用于表单、搜索框或内容分类等场景。以下是实现标签输入框的详细讲解。 1. 任务概述 标…

前端加载自己制作的栅格切片服务充当底图

注意mapview的center属性和tilelayer.fullExtent的区别。 前者是设置mapview显示的中心点坐标, const view new MapView({ container: "viewDiv", map: map, center:[100,25] }); 后者是读…

Windows 安装Mysql 8.1.0版本,并迁移数据库

一、下载MySQL压缩包 进入MySQL官网:https://downloads.mysql.com/archives/community/ 下载zip包到本地,然后解压缩。 二、安装MySQL 1、 创建my.ini文件 新创建一个my.ini文件,文件内容如下,记得修改【basedir】和【datadir…

uniapp——微信小程序,从客户端会话选择文件

微信小程序选择文件 文章目录 微信小程序选择文件效果图选择文件返回数据格式 API文档: chooseMessageFile 微信小程序读取文件,请查看 效果图 选择文件 /*** description 从客户端会话选择文件* returns {String} 文件路径*/ const chooseFile () &g…

学习threejs,导入CTM格式的模型

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.ColladaLoader DAE模…

1、pycharm、python下载与安装

1、去官网下载pycharm 官网:https://www.jetbrains.com/pycharm/download/?sectionwindows 2、在等待期间,去下载python 进入官网地址:https://www.python.org/downloads/windows/ 3、安装pycharm 桌面会出现快捷方式 4、安装python…

虚拟机Centos下安装Mysql完整过程(图文详解)

目录 一. 准备工作 1. 设置虚拟机静态IP 2. 卸载Mysql 3. 给CentOS添加rpm源 二. 安装MySQL 1. 安装mysql服务 2. 启动mysql服务 3. 开启MySQL开机自启动 4. 查看mysql服务状态 5. 查看mysql初始密码 6. 登录mysql ,修改密码 7. 允许外部访问MySQL数据库…

SwiftUI:多语言实现富文本插值

实现的UI需求: 要求: 英文显示:3068 people have joined this plan today! 中文显示:今日有 3068 人已加入此计划! 实现代码: Text(AttributedString(localized:"**\(payPeoples)** people have joi…

中巨伟业推出高安全高性能32位智能卡内核可编程加密芯片SMEC88SP/ST

1、产品特性  以最高安全等级的智能卡芯片内核为基础,具有极高的软硬件安全性  实现客户关键功能或算法代码下载,用户可以灵活实现自有知识产权的保护  标准 SOP8、SOT23-6 封装形式,器件封装小  标准 I2C 接口,具有接…

部署SenseVoice

依赖 Conda cuda pythor 查看GPU版本-CSDN博客 创建虚拟conda环境 conda create --name deeplearn python3.10 conda activate deeplearn git clone https://github.com/FunAudioLLM/SenseVoice.git cd SenseVoice pip install -r requirements.txt pip install gradio pip …

微信流量主挑战:用户数30!新增文档转化功能,解决docker运行jar包报错SimSun找不到的问题(新纪元5)

哎呀,今天忙到飞起,文章晚点更新啦!不过好消息是,我们的小程序用户终于突破30啦,感谢大家的支持!而且,大家期待已久的文档转化功能明天就要上线啦,目前支持word转pdf,pdf…

操作系统课后题总复习

目录 一、第一章 1.1填空题 1.2单项选择题 1.3多项选择题 1.4判断题 1.5名词解释 1.6简答题 二、第二章 2.1填空题 2.2单项选择题 2.3 多项选择题 2.4判断题 2.5名词解释 2.6简答题 三、第三章 3.1填空题 3.2单项选择题 3.3多项选择题 3.4判断题 3.5名词解…