pytest参数化用例(单参数,多参数,用例重命名,解决中文字符乱码问题!!!,笛卡尔积)

  • 参数化优势:

通过参数的方式传递数据,从而实现数据和脚本分离
并且可以实现用例的重复生成与执行

  • 测试用例登录场景:

测试登录成功,登录失败(账号错误,密码错误)
创建多种账号:中文账号,英文账号

  • 普通测试用例实现方法:

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}")