- 参数化优势:
通过参数的方式传递数据,从而实现数据和脚本分离
并且可以实现用例的重复生成与执行
- 测试用例登录场景:
测试登录成功,登录失败(账号错误,密码错误)
创建多种账号:中文账号,英文账号
- 普通测试用例实现方法:
copy多份代码or读入入参数
一次性执行多个输入入参数
def test_param_login_ok():
#登录成功
username = "right"
password = "right"
login(username,password)
def test_param_login_fail():
#登录失败
username = "wrong"
password = "wrong"
login(username,password)
- 参数化实现方法
pytest参数化实现方法
装饰器:@pytest.mark.parametrize
@pytest.mark.parametrize("username,password",[["right","right"],["wrong","wrong"]])
def test_param(username,password):
login(username,passsword)
- 参数化测试函数使用
pytest单参数,参数化用例:将实际结果数据放在列表或元组中,赋值给单参数后,进行判断
search_list1 = ['Select','Delete','Add']
search_list2 = ['Select','Delete','Add','Sql']
@pytest.mark.parametrize('name',search_list1)
def test_search(name):
assert name in search_list2
- 多参数:
1、将数据放在列表嵌套元组中 2、将数据放在列表嵌套列表中
#数据放在元组中
@pytest.mark.paracterize("test_input,expected",[("3+5",8),("2+5",7),("7+5",12)])
def test_mark_more(test_input, expected):
assert eval(test_input) == expected
#数据放在列表中
@pytest.mark.paracterize("testz_input,expected",
[["3+5",8],["2+5",7],["7+5",12]])
def test_mark_more(test_input, expected):
assert eval(test_input) == expected
- 参数化:用例重命名,通过ids参数,将别名放在列表中
@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+5",7),("7+5",12)], ids=['add_3+5=8','add_2+5=7','add_3+5=12'])
def test_mark_more(test_input,expected):
assert eval(test_input) == expected
#通过ids参数,将中文别名放在列表中
@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+5",7),("7+5",12)], ids=["3和5相加","2和5相加","7和5相加"])
def test_mark_more(test_input,expected):
assert eval(test_input) == expected
解决中文乱码问题:
- 在项目根文件夹中创建conftest.py文件,并输入以下代码:
#创建conftest.py文件,将下面内容添加进去,运行脚本
def pytest_collection_modify_items(items):
"""
测试用例收集完成时,将收集到的用例名name和用例标识nodeid的中文信息显示在控制台上
"""
for i in items:
i.name = i.name.encode("utf-8").decode("unicode_escape")
i._nodeid = i.nodeid.encode("utf-8").decode("unicode_escape")
- 在项目根文件夹中创建pytest.ini,并添加以下代码:
[pytest]
addopts = -v
#disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True
- 笛卡尔积的形式进行参数化
两组数据
a = [1,2,3]
b = [a,b,c]
对应的组合形势
(1,a)(1,b)(1,c)
(2,a)(2,b)(2,c)
(3,a)(3,b)(3,c)
a = [1,2,3]
b = ['a','b','c']
@pytest.mark.parametrize("b",b)
@pytest.mark.parametrize("a",a)
def test_paraml(a,b):
print(f"笛卡尔积形式的参数化结果为a={a},b={b}")