系列分享
Pytest系列(一)初次了解
Pytest(二)执行规则以及编写执行多条用例
Pytest(三)Pytest执行命令
Pytest(四)Pytest断言
Pytest(五)标记函数
Pytest(六)跳过测试
在unittest测试中,我们有参数化的概念,那么在pytest中也有。
如何理解参数化:
当对一个测试函数进行测试时,通常会给函数传递多组参数。比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码。可以把这些参数写在测试函数内部进行遍历。不过虽然参数众多,但仍然是一个测试,当某组参数导致断言失败。我们想要的是一个的失败不影响其他的失败。通过参数化的方式来管理组织。那么我们看下pytest如何实现参数化的。
代码语言:javascript复制pytest.mark.parametrize(argnames, argvalues)
我们看下如何使用呢,我们假设要测试密码的长度必须大于8位且小于16位。设计了几个密码
代码语言:javascript复制['123','12345678','1234567890123456','12345678901234561']
我们看下如何使用
代码语言:javascript复制import pytest
@pytest.mark.parametrize('passwd',
['123','12345678','1234567890123456','12345678901234561'])
def test_passwd_length(passwd):
assert len(passwd) >= 8
assert len(passwd)<=16
正常应该执行四个测试用例,我们看下
失败用例:
符合我们预期,可以看到用参数化的思路可以减少代码编写。
如果我们要验证用户名和密码呢,两个参数如何实现呢。
代码语言:javascript复制import pytest
@pytest.mark.parametrize('user,passwd',
[('leizi','123'),('leizi','12345678'),('lei','1234567890123456'),('leizishuoceshikaifa','12345678901234561')])
def test_passwd_length(user,passwd):
assert len(passwd) >= 8
assert len(passwd)<=16
assert user=='leizi'
执行结果
在执行可以用-v看到更加详细写信息
当然还可以给每组参数增加id
代码语言:javascript复制import pytest
@pytest.mark.parametrize('user,passwd',
[pytest.param('leizi','123',id='User:leizi'),
pytest.param('leizi','12345678',id='User:leizi'),
pytest.param('lei','1234567890123456',id='User:lei'),
pytest.param('leizishuoceshikaifa','12345678901234561',id='User:leizishuoceshikaifa')])
def test_passwd_length(user,passwd):
assert len(passwd) >= 8
assert len(passwd)<=16
assert user=='leizi'
执行结果为:
上面的都是写固定的,但是,实际的工作中呢,很多时候的参数都是实时读取的。这些参数数据都是动态读取来的,那么看下如何给参数动态传递呢,这里获取数据,写了一个demo。
代码语言:javascript复制import pytest
def getparame()->list:
'''
返回用例如有入参
:return:
'''
return [('leizi','123'),('leizi','12345678'),('lei','1234567890123456'),('leizishuoceshikaifa','12345678901234561')]
@pytest.mark.parametrize('user,passwd',
getparame())
def test_passwd_length(user,passwd):
assert len(passwd) >= 8
assert len(passwd)<=16
assert user=='leizi'
执行下
用例可以正常执行
这样就可以把我们的参数完全放到Excel等,然后读取即可。