当前位置: 代码迷 >> 综合 >> 接口自动化测试(三)_pytest参数化,skip/xfail,用例执行顺序
  详细解决方案

接口自动化测试(三)_pytest参数化,skip/xfail,用例执行顺序

热度:30   发布时间:2023-12-12 13:36:48.0

一.pytest参数化

比如说登录,正确的用户名/密码和错误的用户名/密码是两组不同的参数,通过不同的参数驱动测试用例,这就是pytest的参数化。
先尝试传一个参数看看,用@pytest.mark.parametrize()方法
在这里插入图片描述

再来试试多参数多值,一个参数对应一个值,此时在后面的列表里存放元组(列表也行,不一定要是元组),每一个元组中的数据对应上前面的参数名
在这里插入图片描述

多参数对应多值,每个参数对应多个值,在列表里存放多个元组,对应的,用例依照元组个数执行多次
在这里插入图片描述
这边的写法可以是@pytest.mark.parametrize('one,two',[(1,2),(5,88)])
也可以是@pytest.mark.parametrize(['one','two'],[(1,2),(5,88)]),都是映射赋值

如果是给一个测试用例多个parametrize呢
在这里插入图片描述

这边的参数还有几个特性:

  1. 只要定义了就一定要用到
  2. 测试用例里定义参数时,不能给参数默认值,比如def test_003(one,two=2)是不被允许的

这边的值有以下几个特性:

  1. 如果使用到元组的话,元组里的个数与参数个数必须相等,像‘a,b’ [(1,2,3)],两个参数对上三个值,会报错
  2. 可以用元组,列表来装值,也可以用集合set()来装,但不推荐,set会去重
  3. 如果参数只有一个,可以有多个值与其对应,如@pytest.mark.parametrize('one_parma',['test',1,2,3])

用例代码:

import pytest# 一个参数对应一个值
@pytest.mark.parametrize('one_parma',['test',1,2,3])
def test_param(one_parma):assert  one_parma == 'test'# n个参数对应n个值
@pytest.mark.parametrize('one,two',[(1,2)])
def test_002(one,two):assert  one+1==two# n个参数对应n*m个值
# @pytest.mark.parametrize('one,two',[(1,2),(5,88)])
@pytest.mark.parametrize(['one','two'],[(1,2),(5,88)])
def test_003(one,two):assert  one+1==two@pytest.mark.parametrize('a',[1,2,3])
@pytest.mark.parametrize('b,c',[(4,5),(6,7)])
def test_004(a,b,c):print(a,b,c)

二.pytest常用标记skip,xfail

skip标记: 只有当满足某条件时才执行测试用例,否则跳过执行这个用例
xfail标记: 因为一个确切的原因,知道打上xfail标记的用例会失败,

skip

1.在用例上方加上@pytest.mark.skip()跳过执行该用例
在这里插入图片描述
2.为skip添加条件,满足条件则skip用例的执行
在这里插入图片描述

3.skip的条件还可以定义在文件夹下面的公共函数conftest.py里面
在这里插入图片描述

然后在相应的用例文件里调用一下定义的这个skip_reason,就可以跳过用例的执行了
在这里插入图片描述

4.在类里使用skip
最基础的,在类上方加个skip,没啥好说的
在这里插入图片描述

xfail

1.先跑个简单的例子看看
在这里插入图片描述

2.也可以把xfail写在函数内部,也会生效,xfail语句前的语句会执行,xfail后的语句不会执行
在这里插入图片描述

skip里有skipif的用法,xfail也有类似的用法(注意不是xfailif),满足if条件就会执行xfail,认为用例将会执行失败,如果不满足条件的话就会报错
在这里插入图片描述

xfail,skip与参数parametrize结合起来使用

其中用到了pytest.param来包装一组参数,并为这组参数使用了skip或者xfail的方法,具体用法可以搜下
在这里插入图片描述

@pytest.mark.parametrize('n,expected',[(1,1),pytest.param(2,1,marks=pytest.mark.xfail(),id='xfail'),pytest.param(3,3,marks=pytest.mark.skip,id='skip')]
)
def test_conbine(n,expected):assert n == expected

三.pytest用例的执行顺序

首先,如果没有预先指定的话,pytest直接执行所有模块下的测试用例的话,它会把.py文件根据文件名的首字母排序,然后按顺序执行文件中的测试用例(也就是根据ACSCII码来排序,然后执行文件里的用例)。
其次,在文件内部,没有预先指定的情况下,pytest默认从上到下执行文件里的用例。

如果要人为指定运行顺序的话,先安装库pytest-ordering
在这里插入图片描述

然后就可以在代码里使用方法pytest.mark.run(order=)来指定运行顺序
在这里插入图片描述

四.生成测试报告

借助第三方插件 pytest-html
在这里插入图片描述

然后在项目里新建一个reports文件夹,所有的测试报告都放在下面。并且新建一个run.py文件,用来运行指定的测试用例并最终生成测试报告。
在这里插入图片描述

然后我们打开reports下面的html测试报告
在这里插入图片描述

在这里插入图片描述

  相关解决方案