pytest常用参数化方法详解

        最近在学习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:

方法二:conftest.py+@pytest.fixtrue实现全局前后置应用

在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实现函数,以便插件机制将尝试最后/尽晚调用它

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值