首页 > 其他分享 >pytest常用参数化方法详解

pytest常用参数化方法详解

时间:2024-06-21 16:00:46浏览次数:22  
标签:标记 fixture pytest mark 测试用例 参数 详解

        最近在学习python的pytest自动化框架,对于pytest的参数化相关信息进行一个记录,信息可能不全,有问题可以私信指正。

pytest运行参数:

-s

其作⽤是可以让打印的内容输出显示在终端中,或者可以在终端中与⽤例中的输⼊操作进⾏交互

-v

表示详细输出更详细的输出,包括每个测试⽤例的详细结果和其他相关信息,例如测试⽤例所在的模块、⽂件路径等。

以上两个参数可以一起使用: -sv

-q

简化输出,正与-v参数相反

--lf(last fail)

可以把上次执行失败的用例重新执行,跳过上一次执行成功的测试用例

-m 标签名:

执行特定的测试用例,可以使用参数-m加上标签名

注意:使用@pytest.mark参数,需要在根目录下建立一个pytest.ini文件并且写入markers选项,否则会产生war

首先,使用@pytest.mark.标签名

在pytest.ini中添加markers,将标签名添加

执行时,添加 -m 标签名

–-ff参数:

把上次执行失败的用例执行完后,再继续执行剩下成功的用例

自定义参数:目前还没有运用过,后续会更新

参数化函数

pytest.fixture:

定义:

1. 定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要用test_开头,跟用例区分开。用例才是test_开头的命名;
2. fixture装饰器里的scope有四个级别的参数:function(不写默认这个)、class、module、session;
3. fixture可以有返回值,如果没有return,默认会是None;用例调用fixture的返回值,就是直接把4. fixture的函数名称作为参数传入;
5. fixture可以返回一个元组、列表或字典;
6. 测试用例可传单个、多个fixture参数;
7. fixture与fixture间可相互调用;

格式如下:

@pytest.fixture(scope="", params="", autouse=False, ids="", name="")

scope:表示被@pytest.fixture标记的方法作用域,它的值主要有4个:

        function:默认,范funtion:作用域是方法,就是在每个测试用例执行之前都会先去执行前置操作,类似setup/teardown

        class:作用域是每一个类,就是在每个类执行之前会执行前置操作(注意:测试类中只要有一个测试用例的参数中使用了class级别的fixture,则在整个测试类的所有测试用例都会调用fixture函数)

        module:作用域是模块,也就是类,一个文件有多个类的时候,每次都只会执行一次前置和后置操作

        package/session:多个测试用例文件只执行一次前后置操作

params参数化(支持的格式有:list、tuple、字典)

autouse:自动使用,默认False,autouse设置为True,自动调用fixture功能。所有用例都会生效,包括类中的测试用例和类以外的测试用例

ids:当使用params参数化时,给每一个值设置一个变量,意义不大

name:给被fixture标记的方法修改别名

方法一:作为参数

fixture的名字直接作为测试用例的参数,用例调用fixture的返回值,直接将fixture的函数名称当做变量名称;如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元祖,list或字典,然后从里面取出对应数据,使用方式如下:

将fixture函数作为参数传递:

在同一个测试用例中传入多个fixture:

方法二:[email protected]实现全局前后置应用

在conftest.py文件中配置,实现在测试用例执行前后实现某些特定操作,实例如下:

可实现在测试用例执行前清空日志文件信息和信息打印

注意:

conftest.py文件须知:
conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件;
不需要import导入conftest.py,pytest用例会自动识别该文件,放到项目的根目录下就可以全局目录调用了,如果放到某个package下,那就在package内有效,可有多个conftest.py;
conftest.py配置脚本名称是固定的,不能改名称;
所有同目录测试文件运行前都会执行conftest.py文件

方法三:与pytest.mark.usefixtures组合使用,实现fixture叠加调用

注意:直接传入fixture不同的是,pytest.mark.usefixtures无法获取到被fixture装饰的函数的返回值;使用场景为测试用例需要多个fixture做前后置工作时使用

mark标记

特点:

装饰器@pytest.mark.markname可以标记测试函数,测试类。
一个mark可以标记多个测试函数,一个测试函数可以使用多个mark;有多个mark标记的时候,最接近测试函数的标记将首先迭代。
运行没有注册的标记,会出现warning警告,要先注册标记,再使用标记(方式:在pytest.ini文件注册自定义标记)。
当使用--strict-markers命令行参数的时候,运行未在pytest.ini文件中注册的任何标记都将引发异常。
pytest --markers 可以查看所有的mark标签,包括内置标记和自定义标记。

pytest.mark.parametrize

定义:实现测试用例参数化,类似DDT

格式:@pytest.mark.parametrize(argnamesargvaluesindirect=Falseids=Nonescope=None*_param_mark=None)

argnames:参数名,以逗号分隔的字符串,表示一个或多个参数名称。或参数字符串组成的列表/元组。
        如果是一个参数,使用参数名的字符串。

        如果是多个参数,多个参数名之间使用逗号分隔的字符串,或者多个参数名组成的列表,或者多个参数名组成的元组。

argvalues:参数值,类型是一个可迭代对象,和参数名一一对应。
        如果argnames为一个参数,则argvalues是一个值列表。

        如果argnames为多个参数,则argvalues必须是一个嵌套元组的列表,其中每个元组元素值与参数名一一对应。

indirect:参数名称列表(参数名称的子集)或布尔值。
        indirect一般与Pytest的fixture,request.param组合使用

        当indrect =True时,argnames参数名是fixture夹具的函数名,argvalues则是给这个夹具函数传递的参数。

ids:标记参数化测试用例的执行名称,默认自动生成,多个参数名之间用"-"连接。
scope:参数范围。
 

实例:

传一个参数 @pytest.mark.parametrize('参数名',list) 进行参数化
传两个参数@pytest.mark.parametrize('参数名1,参数名2',[(参数1_data[0], 参数2_data[0]),(参数1_data[1], 参数2_data[1])]) 进行参数化

方法:

单个参数:输入值可以填写多个,逗号区分

多个参数:输入值以列表形式赋值

参数组合使用,效果类似笛卡尔积:

参数化集合标记:

使用pytest.param进行标记:例如跳过某条测试用例的执行:pytest.param("Alex", "123456", marks=pytest.mark.skip或者对测试用例进行标签

调用外部函数:

结合marks ,为特定参数组合添加额外的标记。

@pytest.mark.parametrize("x, y", [

(1, 2, pytest.mark.smoke),添加标记

(3, 4),

], indirect=True)

def test_marks(x, y):

assert x + y in [3, 7]

pytest.mark.skip

定义:无条件跳过测试用例

语法:pytest.mark.skip(reason=None) ;reason:str类型,默认值为None,可以添加跳过测试用例原因的描述信息

pytest.mark.skipif

定义:如果条件为真,则跳过测试用例

语法:pytest.mark.skipif(condition*reason=None);

condition,条件,可以为True,False或者条件字符串;条件为真,则标记起作用;条件为假,则标记不起作用;使用condition参数的时候,必须有参数reason,否则会报错ERROR;

reason:str类型,默认值为None,可以添加跳过测试用例原因的描述信息。

pytest.mark.xfail

定义:将测试用例标记为预期失败

语法:

pytest.mark.xfail(condition=None, *, reason=None, raises=None, run=True, strict=False)

condition,条件,默认值为None,可以为True,False或者条件字符串;条件为真,则标记起作用。条件为假,则标记不起作用;使用参数condition的时候,必须有参数reason,否则会报错ERROR。

reason,str类型,默认值为None,可以添加预期失败原因的描述信息。
raises,异常类型,默认值为None,可以是单个异常,也可以是多个异常组成的元组;如果测试用例执行失败,出现的异常类型在raises里,则不会抛出异常,测试用例标记为XFAIL;如果测试用例执行失败,出现raises之外的异常,则测试用例标记为FAILED,并抛出异常信息。
run,布尔型,默认值为True;当run=False时候,直接将测试用例标记为XFAIL,不需要执行测试用例。
strict,默认值为False;当strict=False时,如果用例执行失败,结果标记为XFAIL,表示符合预期的失败;如果用例执行成功,结果标记为XPASS,表示不符合预期的成功;当strict=True时,如果用例执行成功,结果将标记为FAILED,而不再是XPASS了;可以在pytest.ini文件中配置:xfail_strict=true
 

预期:

  • XFAIL,预期失败的测试用例,实际结果执行失败,预期结果和实际结果一致。
  • XPASS,预期失败的测试用例,实际结果执行成功,预期结果和实际结果不一致。
  • pytest.xfail 方法在用例执行过程中直接标记用例结果为XFAIL,不会执行后面的代码。

pytest.mark.filterwarnings

 添加警告过滤器

语法:

pytest.mark.filterwarnings(filter)

filter,str类型,一个由Python文档的警告过滤器部分中指定的元组内容(action, message, category, module, lineno)组成的警告规范字符串,用“:”分隔。可选字段可以省略。

eg:

import warnings
import pytest


def api_v1():
    warnings.warn(UserWarning("api v1, should use functions from v2"))
    return 1


@pytest.mark.filterwarnings("ignore:api v1")
def test_one():
    assert api_v1() == 1

pytest.marl.tryfirst/trylast

tryfirst:

mark a hook implementation function such that the plugin machinery will try to call it first/as early as possible

标记一个hook实现函数,以便插件机制将尝试首先/尽早调用它

trylast:

标记一个hook实现函数,以便插件机制将尝试最后/尽晚调用它

标签:标记,fixture,pytest,mark,测试用例,参数,详解
From: https://blog.csdn.net/a1838939319zjj/article/details/139831589

相关文章

  • 头歌机器学习实训答案 第1关:集成学习常用算法详解
    任务描述本关任务:学习集成学习的基本概念以及常用算法并编程熟悉sklearn。相关知识为了完成本关任务,你需要掌握:1.个体与集成的概念,2.常用的集成学习算法。个体和集成集成学习(ensemblelearning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-class......
  • OCS2_mobile_manipulator案例详解
    1.启动共启动3个节点mobile_manipulator_mpc_node//mpc问题构建,计算mobile_manipulator_dummy_mrt_node//仿真,承接MPC的输出,发布Observation,对于仿真来讲,状态发布也是反馈mobile_manipulator_target//交互发布target2.MobileManipulatorMpcNode.cppMobileManipula......
  • AI绘画揭秘:7种Midjourney后缀参数详解
    近年来,AI绘画技术蓬勃发展,越来越多的设计师和艺术家开始利用Midjourney来生成创意灵感和素材。在使用Midjourney生成图片时,除了精心编写提示词(Prompt),后缀参数也至关重要。这些参数能帮助我们更精确地控制图像的生成方式,例如图片的宽高比、风格化程度和完成度等,是提升AI绘画......
  • HTTP协议详解
    文章目录HTTP协议简介HTTP和HTTPS协议的区别HTTP工作原理HTTPS工作原理HTTP协议特点无连接性优化无连接特性无状态性如何优化无状态性HTTP请求方法HTTP状态码常见状态码使用场景用例:在浏览器地址栏键入URL,按下回车之后会经历以下流程HTTP协议简介简介:HTTP协议工......
  • Spring Boot 实现优雅的参数校验
    前言在日常的Web开发中,请求参数校验是一个非常基础且重要的环节。通过校验,我们可以确保每次接口请求中,入参的数据是有效、安全且合规的,避免数据库中出现脏数据。手动校验参数原始的手动校验参数代码如下:@PostMapping("/test")@ApiOperationLog(description="测试......
  • JavaSE 面向对象程序设计进阶 抽象类和接口 2024年详解
    目录抽象类抽象方法抽象类和抽象方法的注意事项​编辑接口如何定义接口注意代码实现​编辑接口中的成员特点接口和类之间的关系1.类与类的关系2.类与接口的关系3.接口与接口的关系​编辑拓展接口中的默认方法接口中的静态方法​编辑接口中的私有方法接口......
  • SQLMAP使用参数
    get型常用参数-u:指定注入的URLsqlmap-uURL--dbs:爆出所有数据库sqlmap-uURL--dbs--dbms:指定数据库类型sqlmap-uURL--dbms=mysql--users:查看数据库的所有用户sqlmap-uURL--users--current-user:查看数据库当前用户sqlmap-uURL--current-user--current-db:......
  • 【pytest】 用例运行时间统计
    使用 --duration 参数:pytest 提供了一个 --duration 参数,它可以在测试运行后显示最慢的N个测试用例的运行时间。例如,要显示最慢的10个测试用例的运行时间,你可以使用以下命令: pytest--duration=10 使用 pytest-benchmark 插件:虽然 pytest-benchmark ......
  • (2024)豆瓣电影详情页内容爬虫详解和源码
    (2024)豆瓣电影详情页内容爬虫详解和源码这是一个Python爬虫程序,用于抓取豆瓣电影详情页面如https://movie.douban.com/subject/1291560/的数据。它首先发送GET请求,使用PyQuery解析DOM,然后根据<br>标签分割HTML内容,提取电影信息如导演、演员、类型等,并将中文键转换为英文键......
  • 4. MyBatis核心配置文件详解
    我出门的时候必遭杀害,因为门外有狮子对mybatis-config.xml文件进行剖析<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.......