一.pytest参数化
比如说登录,正确的用户名/密码和错误的用户名/密码是两组不同的参数,通过不同的参数驱动测试用例,这就是pytest的参数化。
先尝试传一个参数看看,用@pytest.mark.parametrize()方法
再来试试多参数多值,一个参数对应一个值,此时在后面的列表里存放元组(列表也行,不一定要是元组),每一个元组中的数据对应上前面的参数名
多参数对应多值,每个参数对应多个值,在列表里存放多个元组,对应的,用例依照元组个数执行多次
这边的写法可以是@pytest.mark.parametrize('one,two',[(1,2),(5,88)])
也可以是@pytest.mark.parametrize(['one','two'],[(1,2),(5,88)])
,都是映射赋值
如果是给一个测试用例多个parametrize呢
这边的参数还有几个特性:
- 只要定义了就一定要用到
- 测试用例里定义参数时,不能给参数默认值,比如def test_003(one,two=2)是不被允许的
这边的值有以下几个特性:
- 如果使用到元组的话,元组里的个数与参数个数必须相等,像‘a,b’ [(1,2,3)],两个参数对上三个值,会报错
- 可以用元组,列表来装值,也可以用集合set()来装,但不推荐,set会去重
- 如果参数只有一个,可以有多个值与其对应,如
@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测试报告