最近在学习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(argnames, argvalues, indirect=False, ids=None, scope=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