pytest身为强大的测试单元测试框架,那么同样支持DDT数据驱动测试的概念。也就是当对一个测试函数进行测试时,通常会给函数传递多组参数。比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码。
当然,我们可以把这些参数写在测试函数内部进行遍历。不过虽然参数众多,但仍然是一个测试,当某组参数导致断言失败,测试也就终止了。
通过异常捕获,我们可以保证程所有参数完整执行,但要分析测试结果就需要做不少额外的工作。
在 pytest 中,我们有更好的解决方法,就是参数化测试,即每组参数都独立执行一次测试。使用的工具就是 pytest.mark.parametrize(argnames, argvalues)
。
- argnames表示参数名。
- argvalues表示列表形式的参数值。
使用就是以装饰器的形式使用。
示例:
import pytest
phone = [10086, 10010, 110] # 可以是列表 元祖,字典 集合
code = ['xxx', 'ooo', 'zzz']
'''
[[10086, xxx], [10010, ooo], ...]
'''
@pytest.mark.parametrize("phone_item,code", list(zip(phone, code)))
def test_phone(phone_item,code):
print(phone_item,code)
assert code
注意:
@pytest.mark.parametrize("phone_item,code", list(zip(phone, code)))
第一个参数必须是字符串,字符中的多个参数以,
隔开,在函数中,形参必须一一对应,并且名字也要一样,具体参考上例。
固件fixture
测试夹具,类似于setup
import pytest
@pytest.fixture()
def login(): # login: 固件
print('登录函数')
def test_index(login): # 访问主页前需要登录
print('主页')
assert 1
相对于setup和teardown来说,固件的名字比较灵活。
import pytest
@pytest.fixture()
def db():
print('Connection successful')
yield
print('Connection closed')
def search_user(user_id):
d = {
'001': 'xiaoming',
'002': 'xiaohua'
}
return d[user_id]
def test_case_01(db):
assert search_user('001') == 'xiaoming'
#
def test_case_02(db):
assert search_user('002') == 'xiaohua'
- 每个用例执行之前,调用db,yield之前
- 每个用例执行之后,调用db,yield之后