写点什么

Pytest 参数化用例 (单参数,多参数,用例重命名,笛卡尔积)

作者:测试人
  • 2024-03-14
    北京
  • 本文字数:1358 字

    阅读完需:约 4 分钟

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/30055

  • 参数化优势:

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

  • 测试用例登录场景:

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

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

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
复制代码



  • 测试用例收集完成时,将收集到的用例名 name 和用例标识 nodeid 的中文信息显示在控制台上

#创建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")
复制代码



  • 笛卡尔积的形式进行参数化


    两组数据 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}")
复制代码



免费领取:测试资料+测试用例+简历模板+测试文档


发布于: 刚刚阅读数: 3
用户头像

测试人

关注

专注于软件测试开发 2022-08-29 加入

霍格沃兹测试开发学社,测试人社区:https://ceshiren.com/t/topic/22284

评论

发布
暂无评论
Pytest参数化用例(单参数,多参数,用例重命名,笛卡尔积)_软件测试_测试人_InfoQ写作社区