一.pytest参数化

比如说登录,正确的用户名/密码和错误的用户名/密码是两组不同的参数,通过不同的参数驱动测试用例,这就是pytest的参数化。

先尝试传一个参数看看,用@pytest.mark.parametrize()方法

python pytest参数化请求乱码_pytest

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

python pytest参数化请求乱码_python_02

多参数对应多值,每个参数对应多个值,在列表里存放多个元组,对应的,用例依照元组个数执行多次

python pytest参数化请求乱码_python_03


这边的写法可以是@pytest.mark.parametrize('one,two',[(1,2),(5,88)]) 也可以是@pytest.mark.parametrize(['one','two'],[(1,2),(5,88)]),都是映射赋值如果是给一个测试用例多个parametrize呢

python pytest参数化请求乱码_python_04

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

  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()跳过执行该用例

python pytest参数化请求乱码_pytest_05


2.为skip添加条件,满足条件则skip用例的执行

python pytest参数化请求乱码_python_06

3.skip的条件还可以定义在文件夹下面的公共函数conftest.py里面

python pytest参数化请求乱码_元组_07

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

python pytest参数化请求乱码_元组_08

4.在类里使用skip

最基础的,在类上方加个skip,没啥好说的

python pytest参数化请求乱码_pytest_09

xfail

1.先跑个简单的例子看看

python pytest参数化请求乱码_python_10

2.也可以把xfail写在函数内部,也会生效,xfail语句前的语句会执行,xfail后的语句不会执行

python pytest参数化请求乱码_python_11

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

python pytest参数化请求乱码_用例_12

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

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

python pytest参数化请求乱码_用例_13

@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

python pytest参数化请求乱码_测试用例_14

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

python pytest参数化请求乱码_测试用例_15

四.生成测试报告

借助第三方插件 pytest-html

python pytest参数化请求乱码_python_16

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

python pytest参数化请求乱码_python_17

然后我们打开reports下面的html测试报告

python pytest参数化请求乱码_用例_18

python pytest参数化请求乱码_测试用例_19